HTTP协议
HTTP是Web的基本协议,对该协议有深刻的理解对进行web安全测试的工作是至关重要的。了解并理解HTTP的细节可以使测试者找到漏洞并且较好的利用漏洞。
客户端-服务端对话
HTTP是客户端和服务端的一个对话。客户端即浏览器发送请求至服务器端,然后服务端响应请求。HTTP有文本协议的优势,所以对于易读性、可理解性和学习性。一般情况下,大多数Web服务器开放TCP/80端口。当浏览器连接URL http://pentesterlab.com ,实际是对pentesterlab.com 对应的IP的80端口做了一个TCP连接。
大多数请求发生在浏览器请求服务器的内容上。浏览器发送一个请求包含以下元素:
(1)HTTP方法,该元素可以使服务器理解浏览器想进行何种类型的操作。
(2)资源,对应于客户端试图访问服务器端的资源
(3)版本,可以使服务器知道浏览器正在使用的HTTP的版本。
(4)选项,各种头信息可以给出服务器更多的信息如浏览器名称和版本,用户使用的语言(英语?德语?法语?)
(5)请求体,因使用HTTP的方法不同而不同。
例如,请求URL http://vulnerable/index.php 对应下面的HTTP请求:
GET /index.php HTTP/1.1
Host:vulnerable
User-Agent:Mozilla Firefox
请求
方法
(1)GET 方法:请求内容,浏览器发送最通用的请求;
(2)POST方法:用于发送大量的数据,被用于表单 和文件上传
(3)HEAD方法:HEAD方法和GET请求类似,唯一的不同是服务器端提供的响应:响应只包含头而没有body。HEAD被大量用在Web蜘蛛检测Web页面是否被更新,使用该方法可以不用下载整个页面内容。
还有很多其他的HTTP方法:PUT、DELETE、PATCH、TRACE、OPTIONS、CONNECT...可以在Wikipedia上阅读更多的内容。
参数
请求的另一个重要部分是参数。当客户端访问页面 http://vulnerable/article.php?id=1&name=2 ,下面的请求发送给Web服务器:
POST请求比较类似,但是参数在请求体中发送,例如,下面的表单:
上述HTML对应的表单为:
表单中填入以下数据:
username:admin
password:Password123
点击提交后,下面的请求会被发给服务器:
POST /login.php HTTP/1.1
Host:vulnerable
User-Agent:Mozilla Firefox
Content-Length:35
username=admin & password=Password123
NB:如果在<form标签中使用GET方法,值会作为URL的一部分发送,如下:
GET /login.php?username=admin&password=Password123 HTTP /1.1
Host:vulnerable
User-Agent:Mozilla Firefox
如果form标签中包含属性 enctype="multipart /form-data" ,请求会以下面的方式发送:
可以发现有Content-type 头:Content-type:multipart /form-data;boundary=----WebKitFormBoundaryfLW6oGspQZKVxZjA。Webkit 来自基于Webkit的浏览器,其他浏览器会使用一长的随机数代替。该字符串会在多信息的每部分重复。最后一部分字符串结束会有--。
上述请求是浏览器处理上传文件的情况。针对文件的多个节,可以看到下面的信息:
文件名称:myfile.html
参数名称:image
文件内容类型:text/html
文件内容:My file
参数作为数组发送也是有可能的(或者作为hash发送,这需要根据服务器端的解析方式而定)。可以使用下面的例子 :/index.php?id[1]=0 来编码包含0的数组
编码的方法多被框架用来对对象映射的自动请求。例如,下面的请求:user[name]=louis & user[group]=1 将会映射到User对象,User对象的name属性为louis,group属性为1。自动映射有时可被mass-assignment 攻击利用。通过发送额外的参数,你可以改变接受对象的属性(如果应用程序不对对象采取保护措施的话)。在前面的例子中,你可以添加user[admin]=1来请求看是否可以获得管理员权限。
HTTP Headers
HTTP请求中包含很多HTTP头。可以改变它们,但是如果提供了错误的值,请求可能会被拒绝或者头不会被采用。
大多数应用程序只使用少数的HTTP头:
Referer:确定客户端来自哪;
Cookie:返回cookies;
User-Agent:确定用户使用的浏览器;
X-Forwarded-For:获得源IP地址(虽然不是最好的获取IP地址的方法)
其他的HTTP头多被Web服务器使用,在他们的处理中也可以发现安全漏洞。但是Web应用程序与Web服务器相比较容易发现问题。
一个重要的头是Host。Web服务器利用Host头确定用户试图访问哪个网站。当一个服务器上部署多个网站时,Web服务器使用该头确定虚拟主机:即使你每次总访问相同IP地址,服务器读取Host信息,服务器根据这个信息准确的确定访问的内容。如果用户将IP地址放置在Host头或者将Host设为无效的hostname,那么可能获得另一个网站或者额外的信息。