文章总结: 本文档解析sqli-labs第23关禁用注释符时的SQL注入技巧。作者指出常规注释失效因无法切断SQL结构,提出通过构造闭合原语句的Payload实现报错注入。文章验证了sqlmap的有效性,并强调SQL注入本质是逃离解析上下文,而非简单语法套用,为绕过过滤提供了实战思路。 综合评分: 92 文章分类: WEB安全,渗透测试,漏洞POC
当注释不再可用:sqli-labs 第 23 关教会我的 SQL 解析真相
原创
武文
武文学网安
2026年1月14日 00:41 西藏
大家好,我是武文。
今天继续学习挑战sqli-labs,关于第22关仅仅是闭合符号由21关的单引号变为了双引号,这里就不再重复了。具体注入可参照当 SQL 注入遇上 Base64 和字符集:sqli-labs 第 21 关深度拆解
在前面的关卡中,我已经逐渐适应了一套“熟练流程”: 闭合引号 → 注释后半句 → 构造条件 → 观察回显或报错。
但当我来到 sqli-labs 第 23 关 时,这套流程第一次被彻底打断了。
这一关的名字很直接:Error Based – No Comments
它明确告诉一件事: 👉 这一次,不允许使用任何注释符。
一、第 23 关和之前有什么本质区别?
页面形式依然很熟悉:
页面可以正常返回用户信息,看起来和早期关卡几乎一样。
但当我尝试以往最常用的测试方式时:
?id=1'?id=1' --+?id=1' #
前端报错信息为:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” LIMIT 0,1′ at line 1
在测试过程中发现一个事实:
- 注释符全部失效
- SQL 语句后半部分无法被“切断”
- 任何试图用注释逃避语法的问题,都会直接失败
这说明:这一关不再允许“破坏 SQL 结构”。
二、先从最自然的 payload 开始(也是必踩的坑)
假设后端 SQL 结构如下(典型 Less-23):
SELECT * FROM users WHERE id = '$id' LIMIT 0,1;
我们按经验测试updatexml:
?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1)#
(我也尝试了–+ 注释符)结果依然报错:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” LIMIT 0,1′ at line 1
反直觉点来了:
updatexml()明明是合法的#明明也写了- 但 LIMIT 0,1 依然参与了语法解析
三、为什么注释符“失效”了?
不是注释符被禁用,而是它始终处在字符串上下文中。
我提交的是:
1' and updatexml(...)#
但后端拼接后变成:
WHERE id = '1' and updatexml(...)#' LIMIT 0,1;
但我在mysql中直接执行这样的语句是要报XPATH错误的:
select * from users where id='1' and updatexml(1,concat(0x7e,database(),0x7e),1) #' limit 0,1;
但我们在前端通过sql注入只能报这个错误:
说明我们的注释符并没有生效,很可能是被当成字符串处理了,结果导致多个单引号报错。
造成这两者差异的原因是:
在 MySQL 终端中,我控制的是整条 SQL 语句的字符串边界; 而在 Web 注入中,我只能控制字符串内部的一部分。
四、换思路注释:不注释,只寻求“结构闭合”
当注释不可用时,攻击目标就从“截断 SQL”转为“完成 SQL”。
既然不能靠注释:那就 让 SQL 自己“完整且合法”。
思路转变
- ❌ 不想着干掉 LIMIT
- ✅ 让
WHERE子句中途直接报错
?id=1' AND updatexml(1,concat(0x7e,database(),0x7e),1) AND '1'='1
拼接后:
WHERE id = '1'AND updatexml(...)AND '1'='1'LIMIT 0,1;
✔ 结构完整 ✔ LIMIT 合法
可以看到Error-based成功
五、sqlsmap自动化注入尝试
python sqlmap.py -u "http://192.168.68.172:8080/Less-23/?id=1" --batch
可以看到能够测出注入点id。
六、结语
这一关有点反前期的操作常识。在这一关里,我第一次清晰地意识到:
SQL 注入的本质,不是“能写多少 SQL 语法”,而是“能否逃离当前解析上下文”。
从这一关开始,注入不再是“模板套用”,而是真正的 SQL 结构理解与解析顺序博弈。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:武文学网安 武文《当注释不再可用:sqli-labs 第 23 关教会我的 SQL 解析真相》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论