HTTP协议
HTTP是Web的基础,深入了解此协议以执行Web安全测试非常重要。了解并理解HTTP特性通常会让您发现漏洞并利用它们。
客户端 – 服务器对话框
HTTP是一个客户端和一台服务器之间的对话。客户端,浏览器向服务器发送请求,然后服务器响应此请求。HTTP具有作为文本协议的优点,因此非常易于阅读,理解和学习人类。默认情况下,大多数Web服务器都可以在TCP / 80端口上使用。
当你的浏览器连接到一个URL http://pentesterlab.com/ 时,它实际上正在对与该名称对应的IP的80端口进行TCP连接pentesterlab.com。
最常见的请求发生在浏览器向服务器请求内容时。浏览器发送由以下元素组成的请求:
- 一种HTTP方法,它允许服务器了解浏览器想要执行哪种操作。
- 与客户端试图在服务器上访问的内容相对应的资源。
- 这个版本将允许服务器知道浏览器正在讲什么版本的HTTP。
- 可选地,为浏览器的名称和版本,用户的首选语言(如英语,德语,法语,…)提供更多信息给服务器的各种标题,……
- 取决于使用的HTTP方法,请求主体。
例如,对URL http://vulnerable/index.php 的请求将对应于以下HTTP请求:
GET /index.php HTTP/1.1 Host: vulnerable User-Agent: Mozilla Firefox
HTTP Requests请求
1、请求方法
许多HTTP方法存在:
GET方法:请求内容,这是浏览器发送的最常见的请求;
POST方法:POST用于发送大量数据; 它被大多数表单使用,也用于文件上传。
HEAD方法:HEAD方法与GET请求非常相似,唯一的区别在于服务器提供的响应中,响应只包含头文件而不包含主体。网络蜘蛛大量使用HEAD来检查网页是否已更新,而无需下载整页内容。
还有很多其他的HTTP方法:PUT,DELETE,PATCH,TRACE,OPTIONS,CONNECT …。
2、参数
请求的另一个重要部分是参数。当客户端访问以下页面 http://vulnerable/article.php?id=1&name=2 时,以下请求被发送到Web服务器:
GET /article.php?id=1&name=2 HTTP/1.1 Host: vulnerable User-Agent: Mozilla Firefox
POST请求非常相似,但参数在请求主体中发送。例如,以下形式:
<HTML> [...] <BODY> <form action =“/ login.php”method =“POST”> 用户名:<input type =“text”name =“username”/> <br/> 密码:<input type =“password”name =“password”/> <br/> <input type =“submit”value =“Submit”> </ FORM> </ BODY> </ HTML>
此HTML代码对应于以下登录表单:
一旦表格填入以下值:
- username等于’admin’,
- password等于’Password123’。
提交后,将下列请求发送到服务器:
POST /login.php HTTP/1.1 Host: vulnerable User-Agent: Mozilla Firefox Content-Length: 35 username=admin&password=Password123
注意:如果标签GET中使用了该方法<form,则提供的值将作为URL的一部分发送,如下所示:
GET /login.php?username=admin&password=Password123 HTTP/1.1 Host: vulnerable User-Agent: Mozilla Firefox
如果表单标签包含一个属性 enctype=”multipart/form-data”,则发送的请求将会不同:
POST /upload/example1.php HTTP/1.1 Host: vulnerable Content-Length: 305 User-Agent: Mozilla/5.0 [...] AppleWebKit Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryfLW6oGspQZKVxZjA ------WebKitFormBoundaryfLW6oGspQZKVxZjA Content-Disposition: form-data; name="image"; filename="myfile.html" Content-Type: text/html My file ------WebKitFormBoundaryfLW6oGspQZKVxZjA Content-Disposition: form-data; name="send" Send file ------WebKitFormBoundaryfLW6oGspQZKVxZjA--
我们可以看到有一个不同的Content-type标题:Content-Type: multipart/form-data; boundary=—-WebKitFormBoundaryfLW6oGspQZKVxZjA。“ Webkit”来自基于Webkit的浏览器; 其他浏览器会使用一个很长的随机字符串。该字符串对于多部分信息的每个部分都重复。最后一部分包含后面的字符串–。
当您上传文件时,这是浏览器使用的。在专用于该文件的多部分部分中,您将看到以下信息:
- 文件名:myfile.html。
- 参数名称:image。
- 文件内容类型:text/html。
- 文件内容:My file。
也可以将参数作为数组发送(或根据服务器端执行的解析散列)。例如,您可以使用:/index.php?id[1]=0 编码包含该值的数组0。
这种编码方法通常被框架用来执行对象映射的自动请求。例如,以下请求:user[name]=louis&user[group]=1将被映射到User属性name等于louis和属性group映射到的对象1。这种自动映射有时可以使用名为mass-assignment的攻击来利用。通过发送附加参数,如果应用程序不能防止它,可以更改接收对象中的属性。在我们之前的例子中,您可以例如添加user[admin]=1请求并查看您的用户是否获得管理员权限。
HTTP Requests Headers:请求头
正如我们所看到的,HTTP请求包含很多HTTP头。你可以明显地操纵它们,但是如果你提供了错误的值,这个请求可能会被拒绝或者头部不会被使用。
而且,大多数应用程序只使用少量的HTTP标头:
- Referer:了解客户来自哪里;
- Cookie:检索cookie;
- User-Agent:了解用户使用的浏览器;
- X-Forwarded-For:获取源IP地址(即使这不是执行此操作的最佳方法)。
其他HTTP标头主要由Web服务器使用,您还可以在其处理中找到安全漏洞。但是,您不太可能在Web服务器中发现错误,而不是在Web应用程序中发现错误。
最重要的标题之一是Host。将Host header主要用于由Web服务器知道你要访问什么网站。当同一台服务器上托管多个网站时,Web服务器使用此标头进行虚拟托管:即使您始终连接到相同的IP地址,服务器也会根据此Host信息读取信息并提供正确的内容。如果您将IP地址放在主机头或无效的主机名中,您有时可以获得另一个网站并从中获取额外信息。
HTTP Responses Headers:响应头
当您发送请求时,服务器将回复一个HTTP响应。例如,可以发回以下回复:
HTTP/1.1 200 OK Date: Sun, 03 Mar 2017 10:56:20 GMT Server: Apache/2.2.16 (Debian) X-Powered-By: PHP/5.3.3-7+squeeze14 Content-Length: 6988 Content-Type: text/html <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>PentesterLab » Web Pentester for www.fujieace.com </title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="description" content="Web For Pentester"> <meta name="author" content="Louis Nyffenegger louis@pentesterlab.com"> [...]
响应的一个重要部分是状态码; 它的后面是一个原因,位于响应的第一行。客户使用它来了解如何处理响应。以下状态码是最常见的状态码:
- 200 OK:请求已成功处理。
- 302 Found:用于重定向用户,例如注销时将用户发回登录页面。
- 401 Unauthorized:当资源的访问受到限制时。
- 404 Not found:未找到客户请求的资源。
- 500 Internal Server Error:处理请求期间发生错误。
其中一些远不常见418: I’m a teapot。
状态码后,您可以看到HTTP Headers头。
HTTP Headers头包含大量信息,并会影响浏览器如何处理请求并解释其内容。在上面的回复中,我们可以看到以下信息:
- 日期。
- 在Server它提供了大量的信息,有关远程Web服务器是什么头。
- 将X-Powered-By给出更多的信息头。
- 该Content-Length头告诉浏览器的响应会多大。
- 该Content-Type头来告诉会发生什么浏览器。此标题将改变浏览器行为; 如果标题是text/html,浏览器将尝试呈现响应。如果是这样text/plain,它不应该尝试渲染它。
内容是送回的信息。它可以是一个HTML页面,一些图像,基本上都是。当您的浏览器检索到一个HTML页面时,它会解析它并自动检索每个资源:
- JavaScript文件。
- CSS文件。
- 图片。
- …
HTTPS
HTTPS和HTTP并没有什么太大的区别,HTTPs只是在安全套接字层(SSL)之上完成的HTTP。SSL部分确保客户端:
- 他正在与正确的服务器通话:身份验证;
- 通信是安全的:加密。
存在多个版本的SSL,其中一些认为较弱(SSLv1和SSLv2)。
SSL也可以用来确保客户的身份。客户端证书可用于确保只有具有有效证书的人员才能连接到服务器并发送请求。这是限制访问服务的好方法,通常用于需要高安全级别的系统(支付网关,敏感Web服务)。但是,维护证书(和撤销列表)对于大型部署来说可能是一种痛苦。
监听HTTP流量
有三种方法可以侦听HTTP流量:
- 通过使用Wireshark或tcpdump等工具直接收听网络。
- 在浏览器中; 大多数浏览器都有一个扩展,允许用户查看传输和接收的流量。
- 通过在浏览器和服务器之间设置代理。
每种方法都有优点和缺点。我们稍后会看到,它确实取决于通信是否使用安全套接字层(SSL),以及用户是否希望能够拦截/修改请求。
生成HTTP流量
生成HTTP流量可以用不同的方式执行:
- 由于它是一种面向文本的协议,因此您可以使用诸如telnet或netcat之类的工具并输入您的请求。
- 发送HTTP流量也可以使用编程语言完成。所有这些都可以轻松用于写入和读取来自套接字的流量,并与服务器进行通信。此外,大多数语言都有一个HTTP库,允许程序员轻松构建和发送请求并获得相应的响应。
- 最后,生成HTTP请求的最简单方法是使用浏览器。
使用浏览器显然是访问网站的最简单方式。但是,其他方法将允许您更好地访问细节,并制作任何HTTP请求。
使用telnet(或netcat),您可以快速发送HTTP请求:
$ telnet vulnerable 80 GET / HTTP/1.1 Host: vulnerable [...]
你也可以使用netcat来做同样的事情:
$ echo "GET / HTTP/1.1\r\nHost: vulnerable\r\n\r\n" | nc vulnerable 80 [...]