当注释不再可用:sqli-labs第23关教会我的SQL解析真相

admin 2026-01-14 23:44:30 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文档解析sqli-labs第23关禁用注释符时的SQL注入技巧。作者指出常规注释失效因无法切断SQL结构,提出通过构造闭合原语句的Payload实现报错注入。文章验证了sqlmap的有效性,并强调SQL注入本质是逃离解析上下文,而非简单语法套用,为绕过过滤提供了实战思路。 综合评分: 92 文章分类: WEB安全,渗透测试,漏洞POC


cover_image

当注释不再可用: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 解析真相》

评论:0   参与:  0