(一)XSS 之 href

原理同XSS之htmlspecialchars,均为在 a 标签的 href 特征中显示的输入值。这里不再赘述。

(二) XSS 之 js

这里主要是将输入的内容在 js 中赋值给 ms。这里就是 xss 突破的地方。

image-20260304214011553

它模拟的是反射型XSS的一种特殊场景:恶意代码的注入点位于 JavaScript 代码块内部,而非普通的 HTML 标签内

这种场景的防御和绕过逻辑与常规 XSS 有所不同。

🎯 漏洞原理

在这一关中,你的输入不会直接显示在 HTML 正文里,而是被动态地嵌入到 <script> 标签的 JavaScript 代码中。

典型后端逻辑(PHP 伪代码):

$ms='';
  if($ms.length != 0){
     if($ms == 'tmac'){
        $('#fromjs').text('tmac确实厉害,看那小眼神..')
       }else {
          $('#fromjs').text('无论如何不要放弃心中所爱..')
       }

 }

常规防御失效的原因:
如果开发者在这里使用 htmlspecialchars() 函数,它只会将 <, >, &, ", ' 等字符转换为 HTML 实体(如 <)。但是,浏览器在解析 <script> 标签内容时,会先执行 JavaScript 代码,此时这些 HTML 实体并不会被还原。这导致 htmlspecialchars() 在 JS 上下文中完全失效。

💥 攻击载荷 (Payload)

由于输入点位于 JavaScript 字符串中,攻击的核心思路是闭合前面的引号和括号,从而跳出原本的字符串限制,执行任意 JavaScript 代码。

核心 Payload

</script><script>alert('xss')</script>

或者利用 JS 语法闭合:

'; alert('xss'); //

详细解析

假设页面源码最终拼接成这样:

<script>
    var data = '用户输入的内容';
    // 其他逻辑...
</script>

如果你输入 '; alert('xss'); //,拼接后的代码变为:

<script>
    var data = ''; alert('xss'); //';
    // 其他逻辑...
</script>
  • ':闭合前面的单引号,结束字符串定义。
  • ;:结束当前的 JS 语句。
  • alert('xss'):插入你的恶意代码。
  • //:将后面原本的代码(如 ';))注释掉,防止 JS 报错导致代码无法执行。

🛠️ 实战步骤 (Pikachu 靶场示例)

  1. 观察页面:输入任意字符(如 test),发现页面没有回显,但查看网页源代码可以在 <script> 标签中看到你的输入。
  2. 构造 Payload:
    • 尝试闭合单引号并弹窗:'; alert('xss'); //
    • 或者尝试闭合 script 标签:</script><script>alert('xss')</script>
  3. 提交并验证:点击提交后,通常会触发弹窗,表示 XSS 攻击成功。

🛡️ 防御方案

针对“JS输出”这种场景,不能依赖 HTML 转义函数(如 htmlspecialchars),而应该使用JavaScript 转义

错误的防御(仅用 HTML 转义):

// 这在 JS 上下文中无效
$jsvar = htmlspecialchars($_GET['message'], ENT_QUOTES);

正确的防御(JS 转义):
在将用户输入插入到 JavaScript 代码中时,必须对特殊字符进行反斜杠转义。

  • PHP 中的解决方案:使用addslashes()或针对 JSON 格式的json_encode

    // 方案1: 使用 addslashes
    $jsvar = addslashes($_GET['message']);
    
    // 方案2: 如果输出到 JS 变量中作为字符串,推荐使用 json_encode
    $safe_jsvar = json_encode($_GET['message']);
    echo "<script>var data = $safe_jsvar;</script>";
    
  • 通用原则:永远在正确的上下文中进行转义。在 HTML 正文用 HTML 转义,在 JS 代码块中用 JS 转义,在 URL 中用 URL 编码。