中新网安安全实验室|HTTP请求走私漏洞及靶场复现

2019年8月,hackerone提交了关于PayPal HTTP请求走私+存储性XSS

(链接:https://hackerone.com/reports/510152)

攻击可以直接对PayPal登陆页面进行控制,并且能获取所有用户密码,危害极大。这是什么漏洞,我们今天来揭开它的面纱:HTTP请求走私(HTTP Request Smuggling)

1585559883195470.png











图片来源:

https://portswigger.net/research/http-desync-attacks-request-smuggling-reborn

鼎盛娱乐投注彩票


我们先了解下今年black hat上共享的Paypal漏洞实例(引用:https://i.blackhat.com/eu-19/Wednesday/eu-19-Kettle-HTTP-Desync-Attacks-Request-Smuggling-Reborn.pdf )代码如下:
首先使用请求走私污染PayPal登录的JS文件。
1585559918124576.png

由于PayPal登录页面有一个CSP规则脚本-SRC,阻止了这个重定向
1585559947418307.png

后来,作者登录页面在动态生成的iframe中将c.payal.com上的子页面加载了。此子页面未使用CSP,还使用了由作者的JS文件!可以控制iframe页面,但是由于同源策略,无法读取父页面的数据。

1585559963153504.png

然后,在paypal.com/us/gifts上发现了一个不使用CSP的页面,并且还导入了污染JS文件。通过使用自己的JS将c.paypal.com iframe重定向到该URL(并第三次触发自己的JS导入),他终于可以访问父级并从使用Safari或IE PayPal登录的每个人那里窃取纯文本的PayPal密码。
1585559990931803.png

看着是挺绕的,但是慢慢想一下很简单,PayPal主站是有同源策略,旁站存在HTTP请求走私直接加载自己的JS,PayPal.com/us/gifts可以绕过主站可以加载自己的JS,然后成功窃取每个登陆PayPal账号密码。好,我们来了解下什么是HTTP走私。首先我们要了解下HTTP简介和概念。

鼎盛娱乐投注网页版


HTTP 请求走私是 一种干扰网站处理从一个或多个用户接收的 HTTP 请求序列的方式的技术 ,它可以绕过安全控制,未经授权访问敏感数据并且直接危害其他应用程序用户。


鼎盛娱乐投注体育真人


我们知道 HTTP 协议是 Hyper Text Transfer Protocol (超文本传输协议)的缩写,是用于从万维网( WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议, HTTP 是一个基于 TCP/IP 通信协议来传递数据。


HTTP/1.1 开始,支持通过单个基础 TCP 或者 SSL/TLS 套接字发送多个 HTTP 请求,该协议将 HTTP 请求背靠背放置,服务器解析标头以计算出每个结束的位置及下个开始位置。

鼎盛娱乐官网注册开户

HTTP 运行在 TCP 连接之上,存在 TCP 三次握手,慢启动等特点,为了尽可能提高 HTTP 的性能,引用了长连接的概念,目的解决 HTTP 传输,多次建立连接信息的情况,通过 Connection: keep-alive 头部来实现,服务器和客户端使用它告诉对方在发送完数据之后不断开 TCP 连接,那么问题来了,我们该如何判断信息是否传输完成呢。为了解决这个问题,于是引入下面的请求头 Content-length

鼎盛娱乐官网

Content-Length 实体标头字段发送给接收方的实体的大小(以 OCTET 的十进制数为单位)通过判断 Content-lenge t长度相等,服务器便知道这个时候可以断开连接,如果 Content-length 和实体的实际长度短会造成内容截断,如果比实际内容长,会为缺少的内容进行自动填充,看似完美了,但是服务器为了计算信息内容,将所有内容缓存下载,并没有解决 web 应用优化。

鼎盛娱乐官网注册网站

为了解决 Web 优化,引入一个新的请求头 Transfer-Encoding: chunked 也就是分块编码,加入请求头后,报文会使用分块的形式进行传输,不在需要缓存所有实例内容,只需要缓存分块即可,分块要求,每块必须包含16进制的长度和数据,长度值独立占据一行,不包括 CRLF(\r\n) ,也不包括结尾的 CRLF ,当分块的长度为0,且没有数据,连接结束

鼎盛娱乐投注


大多数网站为了提高浏览速度,用户体验,减少服务器负担,使用 CDN 加速服务,原理就是在源站前面加入具有缓存功能的反向代理,当用户请求静态资源,可以直接到代理服务器中获取,不在从源站服务器获取,反向代理与后端源站服务器之间,会重用 TCP 链接,因为不同的用户请求将通过代理服务器与源站服务器连接,代理服务器与后端的源站服务器的 IP 是相对固定。

但是由于两者服务器的实现方法不同,如果用户提供模糊的请求可能代理服务器认为是一个 HTTP 请求,然后转发给后端源站服务器,源站服务器经过解析处理后,只认为其中一部分请求,剩下的另外一部分就是走私请求,形成这个原因,是由于 HTTP 规范提供了两种不同方式来指定请求的结束位置,它们是 Content-Length 标头和 Transfer-Encoding 标头

1585560133674508.png

鼎盛娱乐投注网页版


我这里用的是 https://portswigger.ne t 演示环境,工具: burp suite ,首先关闭 Update content-length。

A%))`DWN3P~}YN6E~)NIE87.png
我们来看下常见 HTTP 走私有三种情况。

鼎盛娱乐官网

CT-TE : 前端使用 Content-length ,后端使用 Transfer-Encoding
前端服务器使用 Content-Length 头,而后端服务器使用 Transfer-Encoding 头。
环境演示地址:
https://portswigger.net/web-security/request-smuggling/lab-basic-cl-te
例如:

1585560178504473.png
第一次请求,返回正常页面:

1585560209945906.png

第二次请求,恶意请求被执行:
1585560230958451.png

前端服务器处理 Content-Length 标头,并确定请求正文的长度为9个字节,直到的结尾 test 该请求被转发到后端服务器。
后端服务器处理 Transfer-Encoding 标头,因此将消息正文视为使用分块编码。它处理第一个块,该块被声明为零长度,因此被视为终止请求。接下来的字节 test 保留未处理,后端服务器会将其视为序列中下一个请求的开始。

鼎盛娱乐投注网页版

前端服务器使用 Transfer-Encoding 头,而后端服务器使用 Content-Length
环境演示地址:
https://portswigger.net/web-security/request-smuggling/exploiting/lab-bypass-front-end-controls-te-cl ,当我们直接访问 /admin 直接显示403,无法访问。

1585560526822274.png

该怎么办呢,如果我们使用下面请求是不是就绕过了呢?

1585560549104585.png


是的,但是提示必须
host localhost 才能访问,那我们直接加入 HOST: localhost
试一下:
1585560594314076.png

 可见加入 HOST:localhost 发送请求,直接进入管理页面。

最终请求为:
1585560609681506.png


1585560633363279.png


因为前端服务器处理 Transfer-Encoding 标头,使用分块编码。一直读到为0,认为读取完毕,此时这个请求对代理服务器来说是一个完整的请求,然后转发给后端服务器,后端服务器对 Content-Length 标头进行处理,当它读完71后认为请求结束,后面的数据就认为另一个请求,也就是成功执行。

1585561986301168.png
成功执行。
说明:
71是文件字节数十六进制转换出来的十进制数。

{8K1270%2W{(7)MU]P)K6BL.png

文件字节数为十六进制数:113转换为十进制数:71

(3) TE.TE行为:混淆TE头
TE-TE 行为很容易理解,当前端服务器和后端服务器都支持 Transfer-Encoding 标头,我们可以通过某种方式混淆标头来诱导其中一台服务器不对其进行处理。可以说还是 CL-TE TE-CL
环境演示地址:
https://portswigger.net/web-security/request-smuggling/exploiting/lab-bypass-front-end-controls-te-cl 使用下面数据包进行发送:

1585562029722412.png

当我们第一请求直接返回正常页面 :

1585562046113022.png


 当我们第二次发包,直接执行后面的 GPOST:

1585562062648750.png

鼎盛娱乐投注体育真人

1.不要重复使用后端连接, HTTP 走私依赖多个后端多路复用,后端服务器将走私数据包与合法数据包一起处理,产生危害行为。如果每个请求单独联系发送,恶意的走私请求不在有效。

2.使用 HTTP / 2 进行后端连接,因为此协议禁止使用分块传输编码。
3.前端服务器和后端服务器确保使用完全相同的 Web 服务器软件,以便它们就请求之间的界限达成一致。

鼎盛娱乐官网app下载中心


HTTP 异步攻击:请求走私重生
https://portswigger.net/research/http-desync-attacks-request-smuggling-reborn
HTTP 请求走私
https://portswigger.net/web-security/request-smuggling