XSS漏洞攻防:href与JS注入实战解析

戴小青

1. XSS漏洞攻防实战:从Pikachu靶场看href与JS注入

最近在复现Pikachu靶场的XSS漏洞时,发现很多初学者对href属性和JS上下文中的XSS存在理解偏差。作为渗透测试中最高频出现的漏洞类型,XSS在不同场景下的利用方式和防御策略差异很大。今天我们就以靶场为例,深入剖析这两种特殊场景的攻防要点。

先明确一个前提:本文所有实验均在本地授权的Pikachu靶场环境完成,严禁用于未授权测试。下面我会用Kali Linux系统演示完整过程,重点讲解容易被忽略的技术细节。无论你是准备网络安全面试,还是想提升开发中的安全编码能力,这些实战经验都会有所帮助。

2. href属性中的XSS注入

2.1 漏洞形成机制

在a标签的href属性中,当开发者未对用户输入进行正确过滤时,攻击者可以通过javascript:伪协议执行任意代码。这种攻击不依赖HTML标签闭合,而是利用URL特性实现攻击:

html复制<!-- 恶意构造的链接示例 -->
<a href="javascript:alert(document.cookie)">点击领奖</a>

与常规XSS不同,href注入的特点在于:

  1. 不需要闭合HTML标签
  2. 不受htmlspecialchars()等常规过滤影响
  3. 在Chrome等现代浏览器中仍能有效触发

2.2 靶场实战演示

在Pikachu靶场的"XSS之href"关卡中,我们按F12查看前端代码,可以发现用户输入直接被拼接到href属性:

html复制<a href="用户输入内容">点击触发</a>

构造如下Payload进行测试:

code复制javascript:alert('href_xss')

提交后点击链接,成功触发弹窗。这说明即使服务端使用了HTML实体转义,也无法防御这种攻击方式。

2.3 防御方案对比

常见但无效的防御:

  • 仅使用htmlspecialchars()转义
  • 黑名单过滤"script"等关键词

推荐防御方案:

php复制// 白名单校验协议头
$allowed_protocols = ['http', 'https'];
$url = parse_url($input);
if (!in_array($url['scheme'], $allowed_protocols)) {
    die('非法协议');
}

// 或强制添加安全前缀
$safe_url = 'https://'.str_replace(['javascript:', 'data:'], '', $input);

关键点:href属性必须严格校验协议类型,建议使用白名单机制

3. JS上下文中的XSS突破

3.1 漏洞原理深度解析

当用户输入被直接嵌入到