9.2.2 发现xss漏洞
挖掘XSS漏洞的关键在于寻找没有被过滤的参数,且这些参数传入到输出函数,常用的输出函数列表如下:print、print_r、echo、printf、sprintf、die、var_dump、var_export,所以我们只要寻找带有变量的这些函数即可。另外在代码审计中,XSS漏洞在浏览器环境影响非常大,所以最重要的还要掌握各种浏览器容错、编码等特性和数据协议。
XSS漏洞比SQL注入更多,而且在满足业务需求的情况下更加难防御。XSS漏洞经常出现在文章发表、评论回复、留言以及资料设置等地方,特别是在发文章的时候,因为这里大多都是富文本,有各种图片引用、文字格式设置等,所以经常出现对标签事件过滤不严格导致的XSS,同样,评论回复以及留言也是。其次在资料设置的地方,比如用户昵称、签名等,有的应用可能不只一处设置资料的地方,像在注册的地方可以设置、修改资料的地方可以设置,这时候要多留意,不一定所有设置这个资料的地方都过滤严格了。我们在通读代码挖掘的时候可以重点关注这几个地方,这几个地方的XSS也通常都是存储型的。
1.反射型XSS
反射型XSS也就是直接通过外部输入然后在浏览器端输出触发的类型,这种类型的漏洞比较容易通过扫描器黑盒直接发现,只需要将尖括号、单双引号等提交到Web服务器,检查返回的HTML页面里面有没有保留原来的特殊字符即可判断。但是白盒审计中,我们只需要寻找带有参数的输出函数,然后根据输出函数对输出内容回溯输入参数,观察有没有经过过滤。
举例一个反射型XSS漏洞的大致形式,代码如下:
代码中echo“sig:”.$_GET[“oauth_signature”].“\n”;直接将$_GET[“oauth_ signature”]的值输出到浏览器中,则可以直接用GET方式注入代码。
2.存储型XSS
存储型XSS,顾名思义也就是需要先把利用代码保存在比如数据库或文件中,当Web程序读取利用代码并输出在页面上时执行利用代码,它的原理图流程图如图9.5所示。
图9.5 xss漏洞原理
存储型XSS比反射型要容易利用得多,不用考虑绕过浏览器的过滤,另外在隐蔽性上面也要好得多,特别是在社交网络中的存储型XSS蠕虫能造成大面积的传播,影响非常大,曾经在新浪微博和百度贴吧都爆发过大规模的XSS蠕虫。
同样,要挖掘存储型XSS也是要寻找未过滤的输入点和未过滤的输出函数,这个最终的输出点可能跟输入点完全不在一个业务流上,对于这类可以根据当前代码功能去猜,或者老老实实去追哪里有操作过这个数据,使用表名、字段名去代码里面搜索。