【攻防世界】web | easyphp详细题解WP

news/2026/1/25 23:40:16/文章来源:https://www.cnblogs.com/jimmysmith/p/19530754

## 今天我们来解析一道【攻防世界】中的web题--easyphp

首先我们打开这道题的场景:

发现这道题一上来就给了我们一大段的php代码,很明显这是一道代码审计题,因此我们需要看懂这段代码的意思后来构造符合代码的payload。
大概审完代码后我们知道只有当\(key1和\)key2均为1时才会包含Hgfks.php并输出flag,因此这是一道设计PHP弱类型比较、函数行为差异与逻辑矛盾点的题。

首先我们审计代码,发现一共有三个参数:

$a = $_GET['a'];
$b = $_GET['b'];
$c=(array)json_decode(@$_GET['c']); 

说明需要有三个参数来构造payload,即应该写成(?a=xxxxx&b=xxxx&c=xxxxx)的形式。

1.审计$a的条件代码语句:

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3)
//这行代码先是查看a的值是否为空。a的值不为空后,将a值使用intval()函数转化为整数并大于6000000,然后又要求a
//值的长度小于等于3
//一方面要求值大于6000000,另一方面又要求a值的长度小于等于3,这似乎很矛盾~~ 但却可以通过PHP中的科学计数法
//来轻松解决(即1e7、2e7、3e7等)

**为啥PHP科学计数法可以解决这个矛盾点?**
PHP对科学计数法格式的字符串有着特殊的解析规则
1.科学计数法的格式:数字e数字(如1e7),表示1×10^7=10000000
2.intval("1e7"):PHP会将它解析为整数10000000(大于6000000)
3.sttrlen("1e7")=3,符合if语句对a值的判断

2.审计$b的条件判断语句:

if(isset($b) && '8b184b' === substr(md5($b),-6,6))
//这行代码同样先是判断b值是否为空。b的值不为空后,接着将b值转换为MD5哈希值后取最后六位,并要求最后六位严格等于 '8b184b' 这个字符串

**那如何获取到MD5哈希值最后六位为 8b184b 这个字符串的值呢**
这里我们使用python代码来获取:

import hashlib 
for i in range(1000000): ##遍历0到1000000的数字足够找到结果b_str = str(i) ##将数字转化为字符串,MD5需要字符串输入md5_result = hashlib.md5(b_str.encode('utf-8')).hexdigest() ##计算MD5哈希值(utf-8编码)last_md5 = md5_result[-6:]  ##取最后的六位进行判断if last_md5 == '8b184b':print(f"满足条件的数字为:{b_str}")print(f"完整的md5值为:{md5_result}")break
##运行代码得到b=53724

补充①:substr(md5(\(b),-6,6))的具体含义:1.md5(\)b):对b值进行MD5哈希运算,MD5哈希会把任意长度的输入,转化为固定的32位的16进制字符串(比如:
$b=53724,转为MD5后位xxxx8b184b。之所以会要求取最后的六位,而不是整个32位MD5哈希值也是为了让
题目可解。
因为完整的MD5哈希值进行枚举的话,组合数高达32×16≈10^38,不可能完成。失去题目的考察意义,而规定取
最后的6位,组合数虽然也有16×6= 16777216(约 1600 万),但实际枚举的过程中b的值是数字(没有限制b值
的类型)。而数字枚举最快,并且MD5值分布均匀,大概在[0-100万]的范围就能找到,普通电脑枚举 30秒内就
能出结果。
2.substr(......,-6,6)):substr是 PHP 的字符串截取函数,第一个参数:要截取的字符串(这里是 MD5 哈希值)
第二个参数:起始位置(-6表示「从字符串末尾倒数第 6 位开始」) 第三个参数:截取长度(6表示截取 6 个字
符)→ 最终效果:取 MD5 哈希值的最后六位

3.审计$c的条件判断语句:

通过审计我们知道c的值是一个数组格式的json值,包含m和n两个参数,我们先来说m这个参数:

$c=(array)json_decode(@$_GET['c']); //传入的 c 参数是 GET 字符串,必须是合法的 JSON 格式(否则 json_decode 返回 null)。(array)强制将json_decode的结果转化为关联数组的形式,@:抑制错误(比如 c 参数不传时,不报错)
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022) //首先判断c的值是否为数组(只要 c 是合法 JSON 对象/数组,转成数组后就满足),满足后要求$c["m"]的值不能是 “纯数字”(包括整数、浮点数、科学计数法),并且要大于2022。
//满足上述条件的方法就是给数字加非数字后缀(如 2023a):
// is_numeric("2023a")=false(非纯数字)
// 2023a在比较时会隐式转成 2023(>2022)

​ 再来说n这个参数:

if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0]))
//首先判断$c["n"]的值是否为数组,满足后要求$c["n"]这个数组的长度必须为2,而且第一位还得是数组。因此便可以构造n为[[],0]

​ 接下来我们看满足条件后的要求吧:

 $d = array_search("DGGJ", $c["n"]); $d === false?die("no..."):NULL; //必须找到DGGJ($d≠false)foreach($c["n"] as $key=>$val){ // 遍历n时,不能有元素严格等于DGGJ$val==="DGGJ"?die("no......"):NULL;}

**所以这里这里的矛盾点就是要保证array_search不为false(即找到DGGJ),但在遍历n的时候又不能又元素严格等于DGGJ**
​ 因此这里的绕过思路便是利用PHP array_search 的弱类型匹配:
​ array_search默认是非严格匹配机制(第三个参数 \(strict=false),会触发隐式类型转换: ​ array_secrch函数的格式:array_search(\)needle, $haystack, \(strict=false) ​ ①.\)strict=false(非严格匹配):不要求 “值 + 类型” 都一致,PHP 会先尝试将(搜索值)和haystack(数组)的元素
​ ②. $strict=true(严格匹配):必须 “值 + 类型” 都一致(===),才会匹配成功;
​ ③.本题中没有传第三个参数,所以用默认的非严格匹配。

回到本题,所以PHP执行时的步骤如下:
①.当搜索字符串"DGGJ"时,PHP 会从字符串开头找数字字符,找到就转成对应整数;如果开头没有数字,直接转成0(例如:"123abc" → 123;"abc123" → 0;"DGGJ" → 0(无任何数字)
②.数组中的0会和"DGGJ"发生弱比较:0 == "DGGJ" → 结果为 true;
③.但0 === "DGGJ" → 结果为 false(严格匹配,类型不同),使得遍历时找不到DGGJ
因此结合 m 和 n 的合法值,c 参数的 JSON 格式为:

{"m":"2023a","n":[[],0]} //注意:JSON 中不能有空格(比如{"m": "2023a"}有空格,会导致 json_decode 失败),必须紧凑写

同时也要注意:
1.不是array_search函数 “主动转”,而是 PHP 的弱类型比较机制自动触发的;
2.转换的触发条件是 “搜索值和数组元素类型不同(字符串 vs 整数)”,且 “非严格匹配”;
3.转换方向是「字符串转整数」,而非「整数转字符串」(这是 PHP 的固定规则)

所以本题的最终payload为:

?a=1e7&b=53724&c={"m":"2023a","n":[[],0]}

输入后便可成功拿到flag:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1216140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bazel 编译报错:error loading package @com_google_absl//absl/strings:

bazel 编译报错:error loading package @com_google_absl//absl/strings:报错: error loading package @com_google_absl//absl/strings:解决方法:首先: conda 配置一个新的python环境,如:python==3.12然后: pi…

《枪炮、病菌与钢铁:人类社会的命运》书评与推荐文章

《枪炮、病菌与钢铁&#xff1a;人类社会的命运》书评与推荐文章 引言&#xff1a;一个问题的力量 1972年7月&#xff0c;在新几内亚的热带雨林中&#xff0c;一位年轻的美国生物学家贾雷德戴蒙德正在进行鸟类演化研究。在那里&#xff0c;他遇到了当地政治家耶利&#xff0c…

穿越文明的边界:列维-施特劳斯《忧郁的热带》深度书评与推荐

穿越文明的边界:列维-施特劳斯《忧郁的热带》深度书评与推荐 引言:一部为所有游记敲响丧钟的游记 当克洛德列维-施特劳斯在1955年出版《忧郁的热带》时,他或许没有想到这部作品会成为二十世纪人类学乃至整个人文社会科学领域的一座里程碑。这部被作者自称为"为所有游…

充电器

【硬核科普】从 220V 到 5V 的魔法之旅:你的手机充电头里到底发生了什么? 我们每天都要做一件事:把手机插上充电器。 墙上的电是凶猛的 220V 交流电(AC),而手机里的电池是娇气的 3.7V - 4.4V 直流电(DC)。如果…

2026有代表性的AI营销 GEO 公司盘点

随着DeepSeek作为国产大模型代表之一,在企业服务、开发者工具、B2B决策支持等场景中迅速普及,其已成为用户获取专业商业信息的核心入口。越来越多的企业意识到:在DeepSeek中被准确提及、优先推荐,就是获取高质量B端…

努力训练,我要拿 Celeste 金草莓(4) || 好吧其实我已经一周没打开 Celeste 了 || 努力训练,我要看曼联北伐

第四周。 兜里还剩十五块三毛,正好够买一箱快过期的压缩饼干。这叫“穷且意坚”。 我站在天台上看这城市的霓虹灯,它们像某种巨大的脉冲血管,搏动着贪婪的节奏。风大得想把我这把枯骨吹散,但我偏不。我有“青云之志…

2025年教我学英语 - 其他

2025年教我学英语 - 其他1、红色 - red [red] 橙色 - orange [ˈɒrɪndʒ] 黄色 - yellow [ˈjeləʊ] 绿色 - green [ɡriːn] 蓝色 - blue [bluː]2、紫色 - purple [ˈpɜːpl] 粉色 - pink [pɪŋk] 棕色 - brown…

Linux软件安装 —— PostgreSQL高可用集群安装(postgreSQL + repmgr主从复制 + keepalived故障转移)

文章目录一、节点说明二、软件下载三、安装PostgreSQL四、安装repmgr1、前置准备2、编译安装&#xff08;两台节点&#xff09;3、配置repmgr4、添加主从到repmgr集群五、安装keepalived&#xff08;root用户&#xff09;1、编译并安装&#xff08;两台节点&#xff09;2、配置…

Linux软件安装 —— ClickHouse集群安装(集成Zookeeper)+ chproxy负载均衡

文章目录一、节点规划二、JDK安装三、Zookeeper安装四、ClickHouse安装1、软件下载&#xff08;1&#xff09;tar安装包下载&#xff08;2&#xff09;rpm安装包下载2、前置准备&#xff08;1&#xff09;CentOS取消打开文件数限制&#xff08;2&#xff09;CentOS取消SELINUX3…

Linux软件安装 —— ClickHouse单节点安装(rpm安装、tar安装两种安装方式)

文章目录 一、节点说明二、软件下载1、tar安装包下载2、rpm安装包下载 三、前置准备1、CentOS取消打开文件数限制2、CentOS取消SELINUX 四、安装1、tar安装2、rpm安装 五、配置clickhouse六、启动clickhouse七、密码配置1、default用户密码设置2、新建用户&#xff08;1&#x…

HarmonyOS PC 多窗口,到底在解决什么

子玥酱 &#xff08;掘金 / 知乎 / CSDN / 简书 同名&#xff09; 大家好&#xff0c;我是 子玥酱&#xff0c;一名长期深耕在一线的前端程序媛 &#x1f469;‍&#x1f4bb;。曾就职于多家知名互联网大厂&#xff0c;目前在某国企负责前端软件研发相关工作&#xff0c;主要聚…

【无线传感器】基于遗传算法GA无线传感器网络中聚类以增强网络寿命附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

那 HarmonyOS PC 应用到底该怎么落代码?

子玥酱 &#xff08;掘金 / 知乎 / CSDN / 简书 同名&#xff09; 大家好&#xff0c;我是 子玥酱&#xff0c;一名长期深耕在一线的前端程序媛 &#x1f469;‍&#x1f4bb;。曾就职于多家知名互联网大厂&#xff0c;目前在某国企负责前端软件研发相关工作&#xff0c;主要聚…

【机械臂路径规划】基于RRT算法规划一个6自由度路径,用于将SM-465变速箱的主轴从壳体中移出,同时避免与主箱体或已安装的副轴发生碰撞附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

基于51单片机的自动豆浆机系统 智能豆浆机

目录 系统概述硬件设计软件设计安全保护机制扩展功能 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 基于51单片机的自动豆浆机系统是一种智能化厨房设备&#xff0c;通过单片机控制实现豆浆制作全流程自动化。系统具备水位…

基于51单片机红外测温 非接触式红外测温仪 MLX90614 嵌入式系统

目录 MLX90614红外测温模块概述硬件连接与接口软件驱动实现温度数据处理校准与误差修正典型应用场景 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; MLX90614红外测温模块概述 MLX90614是一款非接触式红外测温传感器&#xff0c;由Me…

基于51单片机红外线感应自动门 液晶显示 自动 手动

目录 系统概述硬件组成功能实现核心代码片段注意事项 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 基于51单片机的红外线感应自动门系统结合了红外传感、液晶显示和自动/手动控制功能。该系统通过红外传感器检测人体信号&…

01.Nginx简介

01.Nginx简介01.Nginx简介 01.1 背景介绍———————————————————————————————————————————————————————————————————————————无敌小马爱学习…

计算机想学习某个方向,怎么知道学习路线

前言 最近很多初学计算机的同学&#xff0c;一直在问&#xff0c;说“甘哥&#xff0c;我对XXX方向比较感兴趣。现在我应该怎么规划&#xff0c;毕业的时候才能找到这个方向的好的公司的岗位呢” 针对同学的疑惑&#xff0c;阿甘总结下来&#xff0c;其实主要分为两类&#xff…