0x01 漏洞描述
跨站脚本攻击有以下攻击形式:
1、反射型跨站脚本攻击
用户发出一个带有XSS攻击的请求,服务器端接受请求后进行处理并把带有XSS的代码发送给了浏览器,浏览器解析带有XSS的代码,这就造成了XSS攻击,整个过程如同一次反射,因此命名反射型XSS。
2、存储型跨站脚本攻击
攻击者利用应用程序提供的录入或修改数据的功能,将数据存储到服务器或用户cookie中,当其他用户浏览展示该数据的页面时,浏览器会执行页面中嵌入的恶意脚本,所有浏览者都会受到攻击。
3、DOM跨站脚本攻击
由于HTML页面中,定义了一段JS,根据用户的输入,显示一段HTML代码,攻击者可以在输入时,插入一段恶意脚本,最终展示时,会执行恶意脚本。
DOM跨站脚本攻击和以上两个跨站脚本攻击的区别是,DOM跨站是纯页面脚本的输出,只有规范使用JavaScript,才可以防御。
0x02 审计要点
“用户可控数据”可能来源于http请求、数据库、Http Header或cookie等,当明确用户可控数据,可以输出至前端页面时,判断代码中是否存在以下防护逻辑,若均不符合,则存在问题的风险递增。
1、前端是否有XSS防护框架,如Angularjs、Recat、vue.js等,一般这种防护框架在项目设计初期就要考虑到了,上线后再进行改动,不切合实际情况。
2、用户输入数据时是否存在全局参数过滤器?过滤规则是否符合要求?是否存在需过滤和不需过滤两种输出,页面是否控制恰当?
3、输出内容在前端时是否进行恰当的编码(HTML、JS等)?
0x03 典型漏洞代码
通过上面的代码可以轻松看出,用户输入的变量name没有经过任何处理直接输出到了页面上,如果在name变量的输入框中输入<script>alert(/xss/)</script>,输出代码就变成了
echo '<pre>Hello ' . <script>alert(/xss/)</script> . '</pre>';
这样浏览器上就会弹出一个内容为/xss/的窗口。
0x04 防御方案
1、黑名单
黑名单是最低效的防御方案。这段代码中采用了str_replace函数将变量name中的<script>标签置换为空。在这里我们有两种绕过方式:
1)采用大小写绕过(<ScRiPt>)或者采用双写绕过(<scr<script>ipt>);
2)采用除<script>标签外的其他标签,例如<img>标签等实现XSS攻击。
2、白名单
白名单就是一种相对可靠一些的过滤方式,如果匹配到规则外的事件直接进行拦截,而不采用替换为空的方式。
3、特殊字符转码为HTML实体
在这个案例中,采用了htmlspecialchars函数,把预定义的字符&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。但在使用htmlspecial函数时需要格外注意!该函数的用法如下:
第二个参数flags编码规则如下:
注意!flags参数默认状态值编码双引号!
原文始发于微信公众号(反入侵实验室):0基础入门代码审计-4 XSS
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论