fifa焦点赛事活动

中新网安安全实验室|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恳求背靠背放置,办事器解析标头以计算出每个结束的位置及下个开始位置。

1. Persistent Connection(持久连接)

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

2. Content-length(实体长度)

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

3. Transfer-Encoding: chunked(分块编码)

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

四、形成原因


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

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

1585560133674508.png
 

五、靶场复现


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

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

(1) CL.TE漏洞

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保留未处理,后端办事器会将其视为序列中下一个恳求的开始。

(2) TE.CL漏洞

前端办事器使用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


是的,但是提示必需
hostlocalhost才能拜候,那我们直接加入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

 

六、如何防止HTTP恳求走私漏洞

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

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

七、参考文章


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