获取网页参数 ——合天网安实验室学习笔记

实验链接

本实验主要介绍HTTP协议中的GET方法和POST方法,了解两者的区别以及应用场景,掌握向服务器传参的方法,能够利用PHP获取用户通过GET方法或者POST方法传过去的参数。

链接:http://www.hetianlab.com/expc.do?ce=b650f8d3-0e91-4ccc-9581-7f3c1dc16cb8

实验简介

实验所属系列:编程

实验对象:HTTP协议基础学习

相关课程及专业:渗透测试技术

预备知识

  • HTTP协议:https://baike.baidu.com/item/http/243074?fr=aladdin&fromid=1276942&fromtitle=HTTP%E5%8D%8F%E8%AE%AE

  • PHP数组的使用:http://www.php.net/manual/zh/language.types.array.php

实验目的

了解http协议的GET方法和POST方法,以及他们的区别,应用场景,HTTP状态码含义,如何向服务端提交参数,服务端如何接受用户提交的参数。

实验环境

  • 一台windows 7
  • 安装wampserver。

实验步骤

步骤一

百度大家应该都用过,我们可以在百度查找一些想要了解的信息。但是我们需要告诉它,我们想要查找什么内容,这就需要我们告诉服务器我们需要查找与什么相关的内容,所以我们需要在搜索框输入我们想要查找的信息的关键字,这里输入的关键字就是给百度的服务器传入参数(以后简称传参),百度的服务器在接收了这个参数后,进行了一些处理,然后返回相关数据,比如我们输入“CSDN博客”,百度就会给我们返回与“CSDN博客”相关度较高的网页,如图:
获取网页参数 ——合天网安实验室学习笔记_第1张图片

可以看到,输入的关键字到了URL里面,像这种给服务器传参的方法,就是HTTP协议中的GET方法,在GET方法中,查询字符串(名称/值)是在URL中发送的。其格式如下:

/demo.php?name1=value1&name2=value2

一般来说,只用来向服务器获取信息,不向服务器传敏感数据。

要证明这是GET方法也很简单,可以在网页的任何位置鼠标右击,然后选择查看元素。

获取网页参数 ——合天网安实验室学习笔记_第2张图片

然后点击网络,点击重新载入,浏览器会重新加载该页面。
获取网页参数 ——合天网安实验室学习笔记_第3张图片
获取网页参数 ——合天网安实验室学习笔记_第4张图片

此时会看到很多请求,每个请求都显示了状态码(即状态一栏)、请求方法、请求文件、请求域名、请求原因、请求类型等。

在这些请求中,找到触发源头是document,类型是html的一行,这行就是搜索所发起的请求,后面的一些请求都是在请求完成后发起的,因为第一次请求完以后,有些如图片浏览器需要重新拉取。
获取网页参数 ——合天网安实验室学习笔记_第5张图片
在方法这一栏,可以看到都是GET,而且没有POST方法,所以我们可以推断我们给服务器传参是通过GET的方式传过去的。
获取网页参数 ——合天网安实验室学习笔记_第6张图片
在状态这一栏,有的可以看到状态有的是200,有的是304,这是HTTP协议中的状态码。
获取网页参数 ——合天网安实验室学习笔记_第7张图片
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

1xx:指示信息–表示请求已接收,继续处理

2xx:成功–表示请求已被成功接收、理解、接受

3xx:重定向–要完成请求必须进行更进一步的操作

4xx:客户端错误–请求有语法错误或请求无法实现

5xx:服务器端错误–服务器未能实现合法的请求

常见状态代码、状态描述、说明:

200 OK //客户端请求成功

400 Bad Request //客户端请求有语法错误,不能被服务器所理解

401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

403 Forbidden //服务器收到请求,但是拒绝提供服务

404 Not Found //请求资源不存在,eg:输入了错误的URL

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

在上图中还可以看到304,304表示自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。

如果网页自请求者上次请求后再也没有更改过应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉浏览器自从上次访问后网页没有变更,进而节省带宽和开销,同时提高用户访问速度,因为对于浏览器来说,它需要把所有的资源下载到本地渲染后展示出来。

点击上面说到的那个请求,一般会显示在第一行,如果你做了其他操作导致有很多请求,可以先点击左上角的垃圾桶的图标,清空所有请求,再点击一次重新载入。然后在右边会显示
获取网页参数 ——合天网安实验室学习笔记_第8张图片
请求的详细内容,点击参数
获取网页参数 ——合天网安实验室学习笔记_第9张图片
在这可以看到我们给百度服务器传的参数,可以明显看到我们给百度服务器传的参数不止一个,在查询字符串列表中,在冒号(:)左边的是参数名,后面的是代表参数的值,在服务端,可以通过参数名来接收参数值,比如这里参数ie的值是utf-8,所以在服务端,通过ie这个参数名,就能接收到utf-8这个值,然后服务端再根据这个值做相应的处理。

然后点击消息头,点击编辑和重发。
获取网页参数 ——合天网安实验室学习笔记_第10张图片

然后就可以看到原始头了:
获取网页参数 ——合天网安实验室学习笔记_第11张图片

可以看到,wd参数的值已经不是直接显示中文字符,而是显示%后面跟上一个16进制的数字,为什么会这样呢?其实这是中文字符URL编码后的值。

虽然这里显示的是我们输入的字符,但是在发送给服务器的时候,浏览器会自动给中文字符URL编码。为什么会这样呢? 因为网络标准RFC 1738做了硬性规定:“只有字母和数字[0-9a-zA-Z]、一些特殊符号"$-_.+!*’(),@"[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。”。

一般来说,当我们向服务器请求资源的时候,都是用GET方法,不应该使用GET请求来发送一些敏感数据,如:账号密码,因为如果账号密码也被包含在url里面被发送的,很容易被人看见,而且,GET请求中的参数会被记录在web日志中,如果有人通过恶意请求,可以读web日志,那他将可以看见所有用户的账号密码。

接下来来看下php是如何获取用户通过浏览器传过去的参数的。

在PHP里面,有许多预定义的变量都是“超全局的”,这代表他们在一个脚本的内部的任何地方都可以使用,即使实在函数或者方法中,要访问这些“超全局变量”也无需使用global $var;这些超全局变量是:

$GLOBALS

$_SERVER

$_GET

$_POST

$_FILES

$_COOKIE

$_SESSION

$_REQUEST

$_ENV

本步骤中先了解$_GET。

$_GET这个超全局变量是一个数组,它保存了通过 URL 参数传递给当前脚本的参数的值,也就是说,所有通过get方法传过来的参数,都可以通过这个超全局变量来取得参数对应的值。

要取得指定参数的值,可以通过参数名来索引$_GET这个数组。

在实验环境中,已经配置了sqli.com域名,现在通过代码来看下如何获取用户传过来的参数。在实验环境中打开火狐浏览器,访问sqli.com/get.php?id=12&name=admin。以后涉及到需要访问sqli.com的步骤,都在试验机中完成。
获取网页参数 ——合天网安实验室学习笔记_第12张图片

这里的?表示从?后面开始是传参数,当我们需要同时向服务器传多个参数的时候,需要使用&来连接多个参数。这里代表往服务器传了id、name这2个参数,值分别是12、admin。看代码更能直观地理解含义。该页面源码如下:

获取网页参数 ——合天网安实验室学习笔记_第13张图片

它的作用仅仅只是输出用户通过get方法传过来的id和name这2个参数的值。

可以看到页面输出的就是我们传过去的值,看别人的漏洞分析文章的时候,可能会经常看到说某某变量可控,在这里,我们通过GET方法传过去的值就是可控的,可控指的是:我们可以控制某个变量的值。

通过GET方法我们可以给服务器传多个值,比如还可以在后面加一些参数。现在我们给该页面传一些其他参数,然后打印下这个全局变量。

首先进入C:\wamp\www\sqli目录,打开get.php,把前面输出的代码注释掉(在英文输入状态下,在每行的最前面输入2个 / 表示注释掉这一行),把最后一行取消注释。改完以后的代码如图:

获取网页参数 ——合天网安实验室学习笔记_第14张图片

var_dump用来打印变量的相关信息,包括表达式的类型与值。

然后访问sqli.com/get.php?id=12&name=admin&user=test&home=dd,访问后输出如下图:

获取网页参数 ——合天网安实验室学习笔记_第15张图片

可以看到,该变量的类型是array,也就是数组。在“=>”左边的是这个数组的键,右边的是值。

需要注意的是,我们传过去的参数,服务器会原封不动地接受参数,如图:

获取网页参数 ——合天网安实验室学习笔记_第16张图片

如果我们传过去的值里面有一些特殊字符,比如单引号、双引号等服务端没有任何处理,直接拼接sql语句的话,则会导致SQL注入、XSS等安全漏洞。想深入了解的可以学习“SQL注入原理与实践”、“XSS跨站脚本攻击原理与实践”等实验。

步骤二

除了上面讲到的用GET方法给服务器传参,还有一种常用的传参方法,那就是POST。如果通过POST方法传参,那么参数是在http请求的请求体中,并且是经过URL encode编码的。

在登录的地方一般都是用POST方法,前面已经说过,如果包含敏感信息,就应该用POST方法。

还是打开百度,点击右上角的登录,弹出登录窗口:

获取网页参数 ——合天网安实验室学习笔记_第17张图片

在输入框中随便输入一些内容,如果需要验证码,需要输入正确的验证码。

获取网页参数 ——合天网安实验室学习笔记_第18张图片

然后点击登录。

获取网页参数 ——合天网安实验室学习笔记_第19张图片

提示输入的账号或密码有误,但是url并没有改变,也就是说并没有通过GET方法给服务器传参数,那么服务器是如何知道我们输入的账号和密码的呢?

这里虽然没有通过get方法传参,但是它通过post方法给服务器传参了。按F12或者鼠标右击页面选择查看元素进入开发人员工具,进入网络面板。再次输入账号密码以及验证码,在点击登录之前点击左上方的垃圾桶图标清空内容
获取网页参数 ——合天网安实验室学习笔记_第20张图片
点击登录。
获取网页参数 ——合天网安实验室学习笔记_第21张图片

可以看到,第一个请求就是post请求。点击post请求的这一行。会弹出这个请求的详情。
获取网页参数 ——合天网安实验室学习笔记_第22张图片
点击编辑和重发。
获取网页参数 ——合天网安实验室学习笔记_第23张图片

在请求主体中可以看到我们通过post方法提交的参数。你会发现里面多了很多参数。在这里是经过url编码后的,看起来不方便,在参数这一栏看起来更方便。
获取网页参数 ——合天网安实验室学习笔记_第24张图片

可以看到给服务器传了很多参数,而我们输入的只有2个,加上验证码也就三个参数,这说明百度自动带入了一些其他参数,在里面可以看到username、password这2个参数,从参数名我们就可以猜出分别代表我们输入的用户名和密码,但是输入的密码明明只有几个字符,为什么到这里就变成了一串很长的毫无规律的字符串呢? 这说明我们输入的密码是被加密后才被发送百度服务器。

那么PHP又是如何接受通过POST方法传过去的参数的呢?

还记得前面介绍的PHP中的超全局变量吗?其中就有一个$_POST的超全局变量,它也是一个数组,它保存了用户通过POST方法传过去的参数。

查看c:\wamp\www\sqli目录下的post.php的源码,如下图:

获取网页参数 ——合天网安实验室学习笔记_第25张图片

关键代码已经写了注释,页面很简单,获取用户的输入内容然后原样输出到页面,当然在实际开发中,不是这么简单,一般都是获取用户的输入后,保存到数据库中,当然在保存之前还要先判断该用户是否已经注册,如果数据库中已经存在一个同样的用户名,则会提醒用户该用户已注册。

那么,又是如何得知数组的哪个键对应用户输入的输入框呢? 仔细查看上面的html的代码。

获取网页参数 ——合天网安实验室学习笔记_第26张图片

每个输入框都有个name属性,我们可以通过这个name属性的值来索引用户的输入框内容,比如,在用户名的输入框输入:test,那么可以通过 P O S T [ ′ u s e r n a m e ′ ] 来 获 取 该 输 入 框 的 值 , 也 就 是 说 , _POST['username'] 来获取该输入框的值,也就是说, POST[username]_POST[‘username’]的值为test。

可能细心的朋友已经看出来了,这明明是一个php页面,怎么也可以写html代码呢? 因为在php文件中,php 解释器只有在遇到 内的代码不处理,直接原样输出。 是 php的结束标记。

浏览器打开访问http://sqli.com/post.php.

获取网页参数 ——合天网安实验室学习笔记_第27张图片

为了更方便地了解post传参的位置,我们使用抓包工具来抓包,抓包工具通过修改浏览器代理的方法,来拦截浏览器发送的数据包,拦截数据包以后,可以进行修改数据包,丢弃数据包等操作。

机器已经安装好fiddler,点击桌面fiddler图标打开fiddler。
在这里插入图片描述
获取网页参数 ——合天网安实验室学习笔记_第28张图片

然后进入浏览器设置。

进入浏览器代理设置页面。

获取网页参数 ——合天网安实验室学习笔记_第29张图片

选择使用系统代理设置,点击确认。

获取网页参数 ——合天网安实验室学习笔记_第30张图片

重新访问http://sqli.com/post.php,此时可以在fiddler看到我们刚才的请求,由于我们没有设置拦截请求,所以默认直接允许请求了。

获取网页参数 ——合天网安实验室学习笔记_第31张图片

还有其他不相关的一些请求,可以不用管。点击这个请求,查看这个请求的原始请求。

获取网页参数 ——合天网安实验室学习笔记_第32张图片

如果你是重新输入的url访问,或者之前没有点击提交,那么你可以看到这个请求是get请求而不是post,其中红框标记中的内容为http请求头。

其中第一行的GET说明这次请求是GET请求,后面的url表示本次请求的路径,最后面的HTTP/1.1说明HTTP 1.1版本。

由于我们没有在页面的输入框中填内容,所以该请求是GET请求,如果在输入框中填了内容,那么请求方式就会变成POST。

获取网页参数 ——合天网安实验室学习笔记_第33张图片

内容随便,填好以后先不点提交,在fiddler中,发现有多余的请求
获取网页参数 ——合天网安实验室学习笔记_第34张图片

先把这些请求清空掉。点击上方的X,然后选择remove_all。

获取网页参数 ——合天网安实验室学习笔记_第35张图片

就会清空所有记录,然后再点击提交。
获取网页参数 ——合天网安实验室学习笔记_第36张图片获取网页参数 ——合天网安实验室学习笔记_第37张图片

可以看到,页面输入了我们输入的内容,同时fiddler中,也显示了我们本次请求,点击这个请求,查看该请求详情,同样来到raw的界面查看原始的http请求。

获取网页参数 ——合天网安实验室学习笔记_第38张图片

可以看到,请求方法变成了POST,此时,在下方,比上次GET请求明显多了一些数据。

获取网页参数 ——合天网安实验室学习笔记_第39张图片

这些数据就是我们通过POST方法传给服务器的参数,这些数据所在的位置就是HTTP请求体中,HTTP请求头和HTTP请求体用空行分割。

同样的,POST请求的数据,也需要经过url编码,可以在页面输入中文测试,填写如下内容:
获取网页参数 ——合天网安实验室学习笔记_第40张图片

点击提交后,来到fiddler查看这次请求的POST参数。

获取网页参数 ——合天网安实验室学习笔记_第41张图片

很明显的经过了URL编码,服务器在接受这些参数值的时候,会自动URL解码。所以输出的字符还是我们在输入框中输入的内容。

同样,如果服务端在接受用户输入的参数后,没有进行处理,就直接拼接SQL语句进行查询就可能会引起安全漏洞,比如最常见的SQL注入和XSS。原理可以参考“SQL注入原理与实践”、“XSS跨站脚本攻击原理与实践”等实验。

通过前面的实验,可以知道,GET方法和POST方法的区别,主要就是传参的地方不同,GET方法通过URL传参,POST方法在请求体中传参。在实际应用中,GET方法多用来向服务器发起请求获取资源,而POST方法多用在需要修改资源的地方,以及一些敏感信息使用POST方法,并没有什么规范强制要求在登录处使用POST方法。但是我们应该使用POST方法而不用GET方法,因为POST方法相对来说,比GET方法私密,因为参数不会显示URL而在请求体中,用户看不到请求体。有些请求必须使用POST方法。比如向服务器传文件等。因为服务器明确规定要求使用POST方法。

答题

获取网页参数 ——合天网安实验室学习笔记_第42张图片

你可能感兴趣的:(合天网安实验室)