WebGoat之HTTP基础和HTTP拆分攻击
1 实验目的
了解HTTP基础、HTTP工作流程以及HTTP拆分攻击技术原理,通过实验学习如何进行HTTP拆分攻击。
2 实验内容
我们的任务分为2个部分:
1.了解HTTP协议的基础知识和工作流程
2.HTTP拆分攻击。
3 实验环境
3.1 平台
合天网安实验室 Windows7
3.2 工具
WebGoat、Firefox、WebScarab、burpsuite
4 背景知识
4.1 协议发展历史及现状
一. HTTP/0.9
最早版本发布于1991年,功能极其简单,不涉及数据包的传输,默认使用80端口,只有一个GET请求方法,且服务器只能响应HTML格式的字符串,服务器响应后即关闭连接。
二. HTTP/1.0
1996年5月,HTTP/1.0发布,引入了POST和HEAD命令,大大增强了交互功能,任何格式的内容都可以发送,为互联网的大发展奠定了基础;同时,除了数据部分,每次通信还要求包含头信息(HTTP header),来描述一些meta数据。
新增功能还包括:状态吗(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。
三. HTTP/1.1
1997年1月,HTTP/1.1版本发布,它进一步完善了HTTP协议,一直到今天还在使用,是最流行的版本;HTTP/1.1新增了许多特性。
四. HTTP/2
2015年,HTTP/2发布,主要解决了HTTP1.1的效率不高的问题,新增了二进制协议、多工、数据流、头信息压缩等等功能。
4.2 工作原理及组成
当我们访问一个网站的时候,HTTP协议工作如下
1、浏览器解析url,对url进行解析域名对应的IP
2、将域名交给DNS服务器,询问dns服务器该域名对应IP是什么
3、DNS返回IP给浏览器
4、浏览器与DNS返回的IP的80端口进行tcp连接
5、请求站点目录下的centos-vault/readme.txt
6、服务器响应返回一个状态码,浏览器就断开tcp连接
7、如果状态码是2xx或者是3xx,就可以加载页面
4.3 报文格式
4.4 协议流程
HTTP工作流程
1)建立TCP连接
在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,TCP与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作TCP/IP网络。HTTP是比TCP更高层次的应用层协议,只有低层协议建立之后才能进行高层协议的连接,因此在HTTP工作开始之前需要建立TCP连接;
2)客户端向服务器发送请求命令
如GET/index.html?param=value HTTP/1.0 代表建立了TCP连接;
3)客户端发送请求头信息,告知接收服务器其配置和文件格式
如User-Agent:Mozilla/4.06Accept:image/gif 发送请求和报头之后,客户端可以发送更多的数据;
4)服务器应答
如HTTP/1.1200 OK 应答的第一部分是协议的版本号和应答状态码;
5)服务器发送应答头信息
正如客户端会随同请求发送自身的信息一样,服务器也会随同应答向用户发送自己的数据及被请求的文档;
6)服务器向浏览器发送数据
服务器向浏览器发送头信息后,会发送一个空白行来表示头信息的发送到此结束,接着以Content-Type格式发送用户所请求的实际数据;
7)服务器关闭TCP连接
一般情况下,一旦服务器向客户端发送了请求数据,它就要关闭TCP连接。如果服务器在其头信息加入Connection:keep-alive TCP连接在发送后将仍保持打开状态,可以继续通过相同的连接发送请求。保持连接可以节省每个请求建立新连接所需的时间,还可以节约网络带宽。
4.5 安全漏洞分析
HTTP协议本身不在安全性问题,但是因为协议本身不包含会话管理、加密处理的要求,因此使用HTTP开发的应用和服务器容易成为攻击对象。如远程登录SSH协议,SSH具备协议级别的认证和会话管理等,比HTTP就安全性来说就做的更好。
HTTP 响应拆分(HTTP Response Splitting)攻击发生在:
(1)数据通过一个不可信的源进入web应用程序,最常见的是HTTP请求
(2)这些数据包含在发送给web用户的HTTP响应头中,而没有对恶意字符进行验证。
HTTP响应拆分攻击是达到目的的一种手段,而不是目的本身。在其根源上,攻击是简单直接的:攻击者将恶意数据传递给脆弱的应用程序,应用程序包含HTTP响应头中的数据。
为了成功地开发,应用程序必须允许内容包含CR(回车,或由 %0d ,\r表示的回车 )和LF(换行,或由 %0a ,\n表示的换行 )这些字符的输入进入头部,而底层平台很容易受到这些字符的注入。这些字符不仅可以让攻击者控制应用程序想要发送的响应的其余头部和主体,还允许他们在自己的控制下创建额外的响应。
5 实验步骤
5.1 HTTP拆分攻击。(http数据包通过\r\n\r\n来分开http header和http body)
6 实验结果及分析
1.在左侧列表中找到General—> HTTP Splitting一项,点击进入:
根据官方提示可以看出总体目标:第一阶段学习如何进行HTTP Splitting攻击。
2.客户端注入恶意代码到服务器:输入要搜索的系统语言‘Chinese’并用burpsuite抓包,将截获的数据包发送到Repeater来观察请求和响应:
发送到Repeater后点击‘go’,观察响应内容:
3. Forward掉之前截获的数据包,捕获第二次HTTP请求:
可以看到第二次HTTP请求的数据来自第一次HTTP响应中的Location部分,而Location中的数据来自于第一次HTTP请求。即第一次HTTP请求中内容language=Chinese,第一次HTTP响应中Location加上了language= Chinese,第二次HTTP请求URL地址即为第一次HTTP响应中的Location。以此判断存在HTTP拆分的可能性。
4. 接下来重新开始,在第一次HTTP数据提交前篡改HTTP请求数据包。在language字段注入非法数据:Chinese%0d%0a%0d%0a%0d%0a并抓包:(%0d->/f,%0a->/n)
点击‘go’,观察响应内容:
该响应为302重定向的响应,HTTP/1.1表示当前协议为HTTP,1.1是协议的版本。
5. 对于HTTP拆分攻击,我们可以自定义HTTP头,当客户端收到第一个响应后会向响应头Location指向的目标发起第二个请求,这时客户端会认为第二个响应就是针对第二个请求的响应,从而达到了欺骗的目的。
CR/LF(即回车换行符)是响应之间的分解符,在language中加入CR/LF内容,第二轮的响应就会启动。在新一轮的响应中我们可以添加大量信息,比如我们想要显示一条“Hello,you have been phished”,只需要输入如下内容:
6. 自定义的响应内容:
7. 将需要提交的内容进行URL编码:
得到编码结果:Chinese%0d%0aContent-length%3a+0%0d%0a%0d%0aHTTP%2f1.1+200+OK%0d%0aContent-Type%3a+text%2fhtml%3b%0d%0aContent-length%3a+19%0d%0a%0d%0a<%3bhtml>%3btest<%3b%2fhtml>%3b
8. 将编码结果作为参数输入到输入框里并用burpsuite抓包:
点击‘go’,得到第一次HTTP响应:
9. Forward掉之前截获的数据包,捕获第二次HTTP请求:
点击‘go’,得到第二次HTTP响应:
10. 关闭burpsuite的‘intercept’,刷新浏览器页面可以看到:
第一阶段HTTP Splitting完成。