Web for Pentester 阅读笔记(2)

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请求比较类似,但是参数在请求体中发送,例如,下面的表单:

Web for Pentester 阅读笔记(2)_第1张图片

上述HTML对应的表单为:

Web for Pentester 阅读笔记(2)_第2张图片

表单中填入以下数据:

 username:admin

password:Password123

点击提交后,下面的请求会被发给服务器:

POST /login.php  HTTP/1.1

Host:vulnerable

User-Agent:Mozilla Firefox

Content-Length:35


username=admin & password=Password123


NB:如果在

GET /login.php?username=admin&password=Password123 HTTP /1.1

Host:vulnerable

User-Agent:Mozilla Firefox


如果form标签中包含属性 enctype="multipart /form-data" ,请求会以下面的方式发送:

Web for Pentester 阅读笔记(2)_第3张图片

可以发现有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,那么可能获得另一个网站或者额外的信息。



你可能感兴趣的:(渗透测试相关)