文章总结: 本文解析sqli-labs第42/43关,通过白盒审计定位注入点在password参数。两关均为POST显错注入且支持堆叠查询,区别在于闭合方式。作者演示了利用updatexml获取数据及堆叠查询修改表内容的实战,强调需突破惯性思维定位注入点,并理解堆叠注入从读取到修改数据的危害跃迁。 综合评分: 89 文章分类: 渗透测试,WEB安全,代码审计,漏洞分析
sqli-labs 第 42 / 43 关通关:白盒定位注入点 + Error Based + Stacked 一条龙
原创
武文学网安 武文学网安
武文学网安
2026年1月29日 03:19 中国香港
大家好,我是武文。 做到 sqli-labs 第 42 / 43 关时,我决定不再“猜参数、试半天”——因为这两关的价值点很明确:
- POST 提交
- 显错注入(Error Based)
- 堆叠查询(Stacked Query)
- 并且注入点并不在我直觉以为的
username,而是在 password 输入栏
因为我在username输入栏做了太多无用功,所以这一篇我直接采用白盒方式来给大家介绍:先看源码确定注入点,再回到前端按正确姿势验证与利用。
一、第 42 / 43 关整体说明
官方标题:
- 42:POST – Error based – String – Stacked
- 43:POST – Error based – String – Stacked (with twist)
两关核心一致: 都是 POST 注入 + 显错回显 + 支持堆叠查询。 区别点只有一个:闭合方式不同(43 比 42 多一层括号闭合)。
| 项目 | 第42关 | 第43关 | | — | — | — | | 请求方式 | POST | POST | | 页面回显 | 有报错回显 | 有报错回显 | | 注入类型 | Error-based + Stacked | Error-based + Stacked | | 注入点 | password | password | | 闭合方式 | 单引号闭合 | 单引号 + 括号闭合 |
二、白盒定位注入点:不是 username,而是 password
我直接打开第 42 / 43 关的源码(靶场允许查看),https://github.com/Audi-1/sqli-labs/blob/master/Less-42/login.php 重点关注 SQL 拼接部分。
核心现象非常清晰:
username有mysqli_real_escape_string处理被过滤 / 限制 / 或者没有进入危险拼接- 而password没有做任何处理直接被传进了后端,真正被拼接进 SQL 的,是 password 参数
也就是说: 这两关的注入点在 password 输入框里。
这也是我一开始盲测卡住:一直拿 username 当注入点狂测,结果越测越怀疑人生。
定位完注入点后,后面所有 payload 都围绕 password输入框来构造。
三、开始实战:先做闭合测试(从最基础开始)
因为是 String 类型注入,第一步就是闭合确认。
3.1 第 42 关闭合测试
我先正常登录提交一组数据观察页面,再逐步加入特殊字符:
password 输入:
1 1′ 报错

出现 SQL 报错(或页面异常),说明:
- 引号进入 SQL 语句
- 且存在注入风险
接着我用最经典的布尔验证:
password 输入:
1' and 1=1 #1' or 1=1 # 万能密码正常登录
结论:
✅ 第 42 关闭合方式为 单引号 '
3.2 第 43 关闭合测试(括号型)
第 43 关同样从单引号开始试:
password 输入:
1′
报错,但这不代表闭合一定是单引号,也可能是:
' )' ))- 或者其他组合
为了少走弯路,我直接按“括号闭合”的思路验证:
password 输入:
1') and 1=1 # 不能登录1') or 1=1 # 正常登录
说明✅ 第 43 关闭合方式是 单引号 + 括号 ')
四、显错注入(Error Based):用 updatexml 直接拿信息
这两关标题就写了 Error based,所以我不绕弯,直接上显错函数。
4.1 第 42 关显错 payload
password 输入:
1′ and updatexml(1,concat(0x7e,database(),0x7e),1)#

- 页面报错
- 报错信息里出现:
~security~
这说明:
✅ 注入成立 ✅ 显错回显可用 ✅ 我已经能稳定拿信息
4.2 第 43 关显错 payload(带括号闭合)
password 输入:
1′) and updatexml(1,concat(0x7e,database(),0x7e),1)#
同样能在页面报错中看到数据库名回显。
到这里,第 42 / 43 关的 “Error based” 部分就通了。
五、核心能力:Stacked Query(堆叠查询)真正的意义
如果只用 updatexml 拿数据库名,那这两关其实和前面的显错题没本质区别。
这两关真正新增的能力是:允许在一次请求里执行多条 SQL也就是:分号
‘; ’后面的语句也会被执行。
这意味着攻击面从“查数据”升级为“改数据”。
六、堆叠注入实战:UPDATE 修改数据 +后端MySQL 验证
因为这两关是 POST,而且页面未必给你明确提示“更新成功”, 所以我采用最稳的验证方式:
让数据库发生变化 → 后端查询MySQL数据库去确认变化是否真的发生
6.1 第 42 关 stacked update
password 输入:
1′; UPDATE users SET password=’stacked_42′ WHERE username=’admin’;

执行后,我打开终端 查看 users 表:
- 如果
admin的密码变成了stacked_42 - 就说明堆叠语句确实被执行了
结论: ✅ 第 42 关 stacked query 成立
6.2 第 43 关 stacked update(带括号闭合)
password 输入:
1′); UPDATE users SET password=’stacked_43′ WHERE username=’admin’;

同样去 终端 查看数据变化,admin的密码由stacked_42变为了stacked_43
结论: ✅ 第 43 关 stacked query 成立
七、通关总结:这两关到底在考什么?
第 42 / 43 关我认为核心就三句话:
- 注入点不在 username,而在 password(白盒确认是关键)
- 显错注入能让你“看到信息”
- 堆叠注入能让你“改变数据” ——这才是危险等级提升的地方
如果把能力分层:
- Error based:我能从报错里“读”到数据
- Stacked query:我能让数据库“执行额外语句”,甚至改表数据
这也是为什么 stacked query 在真实环境里非常致命:
它不再是“查询注入”,而是接近“数据库命令执行”。
结语
第 42 / 43 关表面看起来是POST版的40/41关卡,对我来说,其真正的价值在于:
- 不要被惯性思维束缚行动,必须尽可能尝试尽可能多的注入点,把注入点找对(本关就是 password)
- 然后理解 stacked query 带来的能力跃迁:从读 → 到写
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:武文学网安 武文学网安 武文学网安《sqli-labs 第 42 / 43 关通关:白盒定位注入点 + Error Based + Stacked 一条龙》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论