2.3.2 反射型XSS
由于程序对用户的输入过滤不严导致用户URL中携带的参数直接输出在网页上,若此时URL中携带有恶意JavaScript语句,则会通过浏览器的解析引擎解析并执行。当用户在搜索框中进行搜索时,返回结果通常会包括用户原始的搜索内容,此时便可能触发XSS漏洞。若此时攻击者精心构造包含XSS恶意代码的链接,诱导用户点击并成功执行其中的JavaScript脚本,此时轻则用户的信息被窃取,重则可能直接通过特权域执行任意代码。反射型XSS攻击流程如图2-48所示。
通过上面的前置知识,我们已经知道XSS产生的主要原因是,用户的输入没有经过处理便直接进行了输出。在审计中我们只需通过搜索特定的关键字找到数据的交互点,然后判断这些数据是否可控以及输出位置。当数据可控并且直接在浏览器页面输出时,可进一步构造XSS攻击代码。接下来的审计流程我们将使用开源代码XSS Demo进行演示。
图2-48 反射型XSS攻击流程
首先通过全局搜索关键字找到可疑代码,如图2-49所示。
图2-49 全局搜索关键字找到可疑代码
通过搜索关键字可知,Demo中存在“resp.getWriter().print()”方法,该方法能够直接将数据传入到前端HTML页面中进行展示。定位到关键函数方法后,接着便是判断其中调用的参数是否可控,跟进代码可以看到关键代码段,如图2-50所示。
可以发现,message的值来源于GET方法的参数msg,并且未对其进行处理就直接传入到“resp.getWriter().print()”方法中进行调用,而GET方法是完全可控的。因此我们只需找到对应的路由,并通过GET方法传入包含XSS有效载荷的URL,以控制“resp.getWriter().print(message)”中的message参数为XSS有效载荷。对于常规的Java项目,通过web.xml可快速地找到对应方法的路由关系。web.xml源代码如图2-51所示。
图2-50 调用参数的关键代码段
图2-51 web.xml源代码
因此,我们只需构造payload“/search?msg=<script>alert('QCCA')</script>”,即可构造一个具有弹框效果的XSS有效载荷。当然也可以使用一个外部JS文件来拓展攻击手法。反射型XSS执行效果如图2-52所示。
图2-52 反射型XSS执行效果