不用注册、不用连接任何线上目标,sqlilabs这种本地注入靶场是我见过最低成本练SQL注入感觉的东西。很多人看了一堆视频课,把“字符型、报错注入、盲注”这些词背得很熟,但到了自己写payload的时候就卡住了——问题恰恰在于缺少一个可以反复“试错”的环境。SQLiLabs把SQL注入最常见的几十种场景做成了关卡,每关都对应一类SQL语句的拼接方式,让你拿着一句URL去和数据库“对话”。这篇东西适合所有刚开始学SQL注入、想自己动手搭一套靶场把SQL语句基础打牢的人,我会把搭建过程、关卡主线、最常碰到的报错都讲一遍,都是我实际踩过的。
1. SQLiLabs这个靶场,到底在练什么
先说一个容易忽视的点:SQL注入的核心不是“记住payload”,而是理解应用层代码里的SQL语句是怎么被拼出来的。大多数人学不会,不是因为笨,而是因为始终在看别人写好的完整payload,没看过背后的语句长什么样。SQLiLabs的好,在于每一关都能从报错页面里看到数据库的反馈,也能打开PHP源码直接对照“输入参数被拼进了哪一条SQL”。
它练的第一层能力是判断闭合方式:SQL语句里是单引号、双引号、带括号还是不带你输入的参数在什么地方被引用,决定了你能不能用闭合符把数据库原有的句子“截断”,再用注释符把后面的代码“废掉”。这是所有注入的根基,也是后面那些看起来眼花缭乱的报错注入、时间盲注的地基。
第二层能力是组织SQL语句。比如提取数据的时候无非是 select、union、order by 这些关键字,但要在一个丢进数据库就报错的URL里组合出合法的语句,需要你很清楚查询的列数、回显位置、过滤逻辑。SQLiLabs把这一过程拆成了65个阶梯,每一关几乎只增加一个新的变量,前面用烂了的方法到后面往往会失效,逼迫你去思考为什么。
它本质上是一间“可以看见答案的练习室”。真实站点不可能让你一边注入一边看服务端日志,但是在本地的sqlilabs里,就算把页面干崩了也无所谓,重置数据库只需点一下。这种形态对新手是特别友好的:错误信息可以开着看,源码可以打开读,可以大胆试验。
| 练习维度 | SQLiLabs里的体现 | 真实生产系统里的体现 |
|---|---|---|
| 参数位置 | GET参数、POST参数、Cookie、请求头 | 各种接口参数,可能需要先搞定其他漏洞 |
| 注入类型 | 字符型、数字型、报错、盲注、堆叠、宽字节等 | 通常混合出现,需要自己发现 |
| 数据回显 | 大多数关卡直接能看到结果或错误 | 可能无回显、有WAF、有过滤 |
| 访问权限 | 直接可见源码 | 不可见,全靠黑盒猜测 |
| 合规性 | 本地环境,完全可控 | 必须获得书面授权,否则是违法行为 |
我自己的体会是:如果你已经在某个课程里看过SQL注入原理,但迟迟没有“动手写语句”的感觉,那就该停下来搭一个sqlilabs;如果你的目标是了解Web应用的输入处理为什么会出问题,这同样是绝佳的教学样本,不只是攻击者需要懂,做防御的人把报错注入和布尔盲注亲手跑通之后,再去看WAF规则会清楚很多。
1.1 靶场的安装形式与运行依赖
SQLiLabs是一个开源PHP项目,需要用Apache/Nginx配合PHP和MySQL来跑。Windows下面最简单的方式是装PHPStudy这类集成环境,Linux上也可以直接用LAMP或者用Docker跑现成镜像。它的运行逻辑很简单:浏览器把参数发给PHP页面,PHP代码把参数直接或间接拼进SQL,然后交给MySQL执行。由于代码中刻意没有过滤用户的输入,所以你能通过修改参数改变原本的SQL语义。
如果还用旧版PHPStudy兼容包,记得PHP版本不要选太高,PHP 5.6或7.x都行。我用PHP 7.4跑起来基本没有大问题,但PHP 8上有些旧代码会报 Deprecated 甚至直接白屏,不是不能修,只是新手会因此误判是SQL问题,浪费时间。数据库方面MySQL 5.7是最舒服的版本,报错信息完整,也支持 updatexml()、extractvalue() 这些在过关时用到的函数。
1.2 65关的安排是按SQL语句结构走的
网上常有人说“SQLiLabs 1到65全部通关”,听上去像在刷题库,其实它内部编排非常有逻辑。1到4关是用 union 提取数据的基础,先把单引号、数字型、括号包裹搞明白;5到10关开始没有直接数据回显,逼你用报错或者盲注;11到17关进入POST参数和更新类SQL;18到22关把注入点挪到请求头和Cookie;23到31关开始处理注释符、空格、and、or 这些字符被过滤的情况;32到37关是宽字节注入,专门针对 addslashes 转义后的绕过;38到53关开始玩堆叠注入和 order by 场景;最后的54到65关属于挑战模式,每次刷新关卡数据会变,防止你背答案。
这个安排非常像一套教材:前面几课是新
