SWPUCTF 2021 新生赛 easy_md5

张开发
2026/4/16 22:56:59 15 分钟阅读

分享文章

SWPUCTF 2021 新生赛 easy_md5
[SWPUCTF 2021 新生赛]easy_md5知识点MD5数组绕过题目源码如下### 代码逐行解析#### 第 1 行?php- **分析**PHP 的开始标签标志着 PHP 代码的开始。#### 第 2 行highlight_file(__FILE__);- **功能**将当前文件即 __FILE__ 所代表的文件的源代码以高亮形式显示在网页上。- **意图**这通常是为了让 CTF 选手直接看到后端源码以便分析逻辑漏洞。#### 第 3 行include flag2.php;- **功能**引入 flag2.php 文件。- **意图**通常这个文件中定义了一个变量如 $flag存储了通关所需的密钥。引入后该变量在当前脚本中可用。#### 第 4 行if (isset($_GET[name]) isset($_POST[password])){- **功能**检查 HTTP 请求中是否**同时**存在- GET 参数 name- POST 参数 password- **分析**如果这两个参数没有同时存在代码将直接跳到最后的 else 分支输出 wrong!。#### 第 5-6 行$name $_GET[name]; 和 $password $_POST[password];- **功能**分别将接收到的 GET 参数 name 和 POST 参数 password 赋值给变量 $name 和 $password。#### 第 7 行if ($name ! $password md5($name) md5($password)){- **功能**这是核心逻辑判断要求同时满足两个条件1. $name ! $password变量 $name 和 $password 的值**不相等**字符串内容不同。2. md5($name) md5($password)这两个变量的 MD5 哈希值**相等**。- **漏洞分析关键点**- 这里使用的是 PHP 的**弱类型比较**。- 在 PHP 中md5() 函数如果处理失败例如传入数组会返回 NULL。- 如果 $name 和 $password 都是数组例如 name[]1 和 password[]2那么 md5($name) 和 md5($password) 都会返回 NULL。- 在弱类型比较中NULL NULL 的结果是 true。- 同时数组 Array 和 数组 Array 在 PHP 的弱比较 ! 中如果内容不同通常也被视为不相等或者直接利用数组无法直接比较相等的特性。- **结论**这就是著名的 **MD5 数组绕过** 漏洞。#### 第 8 行echo $flag;- **功能**如果第 7 行的条件满足输出 flag。#### 第 9 行else { echo wrong!; }- **功能**如果第 7 行的条件不满足输出 wrong!。#### 第 11-13 行else { echo wrong!; }- **功能**如果第 4 行的参数检查不通过即没有同时提供 name 和 password输出 wrong!。### 解题思路如何构造 Payload为了通过第 7 行的判断我们需要利用 **MD5 数组绕过**。#### 原理当 md5() 函数的参数是一个**数组**时PHP 会抛出一个警告在较新版本中并且返回 NULL。因此- md5(array) - NULL- md5(array) - NULL- NULL NULL - true同时我们需要 $name ! $password。虽然它们都是数组但只要不是完全相同的引用或内容或者利用类型差异这个条件通常很容易满足实际上只要传入不同的数组结构即可。#### 构造 Payload我们需要构造一个 HTTP 请求- **GET 参数**name 必须是一个数组。- **POST 参数**password 必须是一个数组。**Payload 示例**- **GET**: name[]1- **POST**: password[]2得到flag。

更多文章