我们首先来分析反射型的XSS。将安全级别设为low,然后选择XSS reflected,在文本框中随意输入一个用户名,提交之后就会在页面上显示。从URL中可以看出,用户名是通过name参数以GET方式提交的。
查看low级别的网页代码,可以看到这里对用于接收用户数据的name参数没有进行任何过滤,就直接在网页中输出,因而造成了XSS漏洞。
我们输入一段最基本的XSS语句来实现弹框:“<script>alert(‘hi’)</script>”:
此时查看网页源文件,可以看到我们所输入的脚本被嵌入到了网页中。
再输入一段语句来弹出cookie:“<script>alert(document.cookie)</script>”。
接下来再查看medium级别的XSS源码,这里在输出name参数中的数据之前,先利用str_replace()函数进行了处理,处理的目的是将<script>替换成空值。
但是这个过滤处理实在是太简单了,首先我们只要使用大写的<SCRIPT>就可以绕过,其次XSS也并非只能使用JavaScript,通过HTML语句也可以跨站,比如“<img src=1 onerror=alert(‘hi’)>”语句。<img>是html中的图片标记,这条语句表示在网页中插入一张图片,“src=1”指定了图片文件的URL,如果图片不存在(这里肯定是不存在了),那么将会弹出错误提示框,从而实现弹框的效果。
最后再来查看high级别的源码,这里利用了htmlspecialchars()函数进行过滤。这个函数可以把& (和号)、"(双引号)、'(单引号)、<(小于)、>(大于)这些敏感符号都进行转义,所有的跨站语句中基本都离不开这些符号,因而只需要这一个函数就阻止了XSS漏洞,所以跨站漏洞的代码防御还是比较简单的。
本文转自 yttitan 51CTO博客,原文链接:http://blog.51cto.com/yttitan/1728465