传送门:
http走私漏洞学习(1)--http走私简介
http走私漏洞学习(2)--http走私常见方法
http走私漏洞学习(3)--http走私漏洞利用
0x00 什么是http走私
http走私(HTTP Request Smuggling)最早是在2005年由Watchfire记录的,该漏洞利用了前端服务器(cdn)和后端服务器对数据包边界定义不一致的情况,将前一个数据包的内容插入至下一个数据包中。通常情况下,利用该漏洞可以窃取到用户的请求数据,如cookie等。
0x01 基础知识
起初在HTTP1.0中的协议设计中,客户端每一次都要进行一次tcp连接,一旦响应返回就会关闭连接,这种连接称为短链接。
在HTTP1.1的时代,支持了Keep-Alive模式,也就是请求头中的Connection:Keep-Alive,在HTTP1.1中默认开启。它告诉服务器,接收回应此HTTP请求后,不要关闭TCP链接,对后面的HTTP请求重用该TCP连接,这样就减少了服务器的开销。但它只能请求一次响应一次。
在有了Keep-Alive后,后续就有了Pipeline(管线化),它可以批量提交多个HTTP请求,不必请求一次响应一次。Content-length(实体长度),指出报文实体主体的字节大小,如果 Content-Length 比实际长度短,会造成内容被截断;如果比实体内容长,会造成无响应至等待超时。
Transfer-Encoding: chunked(分块编码),在请求头部添加该行,意味着请求报文使用分块编码,在每一个块中首先使用十六进制表示当前块的长度,然后\r\n(回车,占两字节),接着是块的内容,再回车此块结束,最后用0表示传输完毕,最后空两行。
0x02 产生原理
一个正常的请求中,前端发送的数据,后端可以完全接收。
后端能否正确的接收完整请求的数据,意味着前后端结束位必须达到一致。当攻击者发送一个‘模糊’的请求,后端认为其中一部分是正常请求,而余下的数据依然留在服务器中,当下一个请求过来时,余下的数据和当前的请求拼合在一起变成了一个请求,这些余下的数据便成为了走私数据。
0x03 简单演示
利用https://portswigger.net/web-security/request-smuggling/lab-basic-cl-te中的靶场进行演示
进入靶场抓包,修改为POST请求方式,关闭burp suite自动更新Content-Length功能
该靶场中利用的是CL-TE走私,前端遵循Content-Length,后端遵循Transfer-Encoding,CL被忽略,按TE处理。
正常提交数据包正常返回:
修改数据包,添加 Transfer-Encoding: chunked,修改数据包Content-Length的值Content-Length为10的原因为回车占据两字节,回车+0+回车+HELLO共10字节,接着提交,返回正常POST / HTTP/1.1 Host: ac281f8a1ece4f1980d61fb7000a00d0.web-security-academy.net Connection: close Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) >AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 >Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Sec-Fetch-Site: cross-site Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Referer: https://portswigger.net/web-security/request-smuggling/lab-basic-cl-te Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: session=E4Rwvo7mdvUM2W9694zcELGHntk1EJGk Content-Type: application/x-www-form-urlencoded Content-Length: 10 Transfer-Encoding: chunked 0 HELLO
再次提交,提示:"Unrecognized method HELLOPOST"
发现HELLO拼接到了另一个数据包,数据包变成了HELLOPOST / HTTP/1.1 ....
这便造成了一个简单的http走私
0x04 参考文章
1、漏洞银行丨HTTP Request Smuggling账户劫持与WAF绕过详解-柠枫丨咖面110期
2、freebuf-浅析HTTP走私攻击
3、freebuf-HTTP走私漏洞分析
网友评论