【攻防世界】easyphp(PHP代码审计)

2024-04-09 22:04

本文主要是介绍【攻防世界】easyphp(PHP代码审计),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进入题目环境,检查页面内容,页面附有源代码:

<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;$a = $_GET['a'];
$b = $_GET['b'];if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){if(isset($b) && '8b184b' === substr(md5($b),-6,6)){$key1 = 1;}else{die("Emmm...再想想");}}else{die("Emmm...");
}$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){$d = array_search("DGGJ", $c["n"]);$d === false?die("no..."):NULL;foreach($c["n"] as $key=>$val){$val==="DGGJ"?die("no......"):NULL;}$key2 = 1;}else{die("no hack");}
}else{die("no");
}if($key1 && $key2){include "Hgfks.php";echo "You're right"."\n";echo $flag;
}?>

进行代码审计,将整体代码分开分别分析。

使用 $_GET 方法上传参数 $a 与 $b、$c,并进行判断来进行回显:

找到可以获取 flag 的关键代码进行审计:

if($key1 && $key2){include "Hgfks.php";echo "You're right"."\n";echo $flag;
}

审计得知,若要输出 $flag 的值,则需要 $key1 和 $ket2 均为True,即均大于零。

首先查看 $key1 大于零的条件:

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){if(isset($b) && '8b184b' === substr(md5($b),-6,6)){$key1 = 1;}else{die("Emmm...再想想");}}else{die("Emmm...");
}

代码首先对参数 a 进行判断,要求参数a的值大于 6000000 且 a的位数不超过3位,故可以使用科学计数法来给 参数a 赋值。 ?a= 1e9

接着对参数 b 进行判断,若b存在 且 参数b的后六位 等于 字符串'8b184b' 的话,即赋值 $key1=1。

故编写 MD5破解脚本:

import hashlib
for i in range(100000):x = str(i).encode()  #将字符串转换为字节串,因为hashlib.md5()函数的参数必须为字节串y = hashlib.md5(x)  #进行md5加密编码m = y.hexdigest()  #以十六进制的格式返回编码数据if(m[-6:] == "8b184b"):  #若编码后六位等于字符串"8b184b",则代表爆破成功print("爆破结果为:" + m)breakprint(i)

爆破结果如下:

成功获得 符合条件的b的值---53724。

查看 $key2 大于零的条件:

$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){$d = array_search("DGGJ", $c["n"]);$d === false?die("no..."):NULL;foreach($c["n"] as $key=>$val){$val==="DGGJ"?die("no......"):NULL;}$key2 = 1;}else{die("no hack");}
}else{die("no");
}

进行代码审计,引入了新的参数 $c:

第一个 if 判断语句:要求 $c 是一个数组,且 $c['m'] 的值不为数字 (is_numeric()函数判断),在 $c['m'] 的数据类型不为数字的同时还要求 $c['m'] 的键值大于 2022,需要用到 PHP 的弱语言特性。

PHP是一类典型的弱语言,在PHP代码中:

2023abc 与 2022 作比较时,会自动将 字符串类型的 '2022abc' 转换为 数字类型2023 来和 2022 进行比较。

故可以将 $c['m'] 赋值为 字符串 '2023abc'。

被嵌套的第二个 if 语句:$c['n'] 也为一个数组,所以 $c 是典型的 数组嵌套数组,在要求 $c['n'] 为一个数组的同时要求 $c['n'][0] 也为一个数组,所以 $c['n'] 中也嵌套一个数组。

最后利用 array_search()函数要求 $c['n'] 中可以匹配 字符串 'DGGJ',同时利用 foreach 要求 c['n'] 不存在字符串 'DGGJ',看似要求矛盾,实则依然利用PHP的弱语言特性。

若 $c['n'] 的键值包含数字0,当 数字0 和字符串'DGGJ'进行比较时,字符串'DGGJ'会自动被转换为数字零,以此可以达到目的。

所以 payload: c={"m":"2023abc","n":[[0,1],0]}。

所以最终的payload:http://61.147.171.105:53569/?a=1e9&b=53724&c={"m":"2023abc","n":[[0,1],0]}

成功获得 flag。 

这篇关于【攻防世界】easyphp(PHP代码审计)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/889319

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...