1.攻防世界easyphp
进入题目页面如下
是一段PHP代码进行代码审计
<?php
// 高亮显示PHP文件源代码
highlight_file(__FILE__);// 初始化变量$key1和$key2为0
$key1 = 0;
$key2 = 0;// 从GET请求中获取参数'a'的值,并赋值给变量$a
$a = $_GET['a'];
// 从GET请求中获取参数'b'的值,并赋值给变量$b
$b = $_GET['b'];
// 检查是否在GET请求中存在,并且将$a转换为整数后大于6000000,同时$a的字符串长度小于等于3
if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){// 检查变量$b是否被设置,并且$b的MD5哈希值的最后6位等于'8b184b'if(isset($b) && '8b184b' === substr(md5($b),-6,6)){// 如果上述条件都满足,将$key1的值设置为1$key1 = 1;}else{// 如果$b不满足条件,输出提示信息并终止脚本执行die("Emmm...再想想");}
}else{// 如果$a不满足条件,输出提示信息并终止脚本执行die("Emmm...");
}// 从GET请求中获取参数'c'的值,使用json_decode函数将其解码为数组,并将结果强制转换为数组类型,赋值给变量$c
$c=(array)json_decode(@$_GET['c']);// 检查$c是否为数组,并且$c数组中的键'm'对应的值不是数字类型,同时该值大于2022
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){// 检查$c数组中的键'n'对应的值是否为数组,并且该数组的元素个数为2,同时数组的第一个元素也是数组if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){// 在$c["n"]数组中搜索值为'DGGJ'的元素,并返回其键名,赋值给变量$d$d = array_search("DGGJ", $c["n"]);// 如果没有找到值为'DGGJ'的元素,输出提示信息并终止脚本执行$d === false?die("no..."):NULL;// 遍历$c["n"]数组,检查是否有元素的值直接等于'DGGJ'foreach($c["n"] as $key=>$val){// 如果有元素的值等于'DGGJ',输出提示信息并终止脚本执行$val==="DGGJ"?die("no......"):NULL;}// 如果上述条件都满足,将$key2的值设置为1$key2 = 1;}else{// 如果$c["n"]不满足条件,输出提示信息并终止脚本执行die("no hack");}
}else{// 如果$c不满足条件,输出提示信息并终止脚本执行die("no");
}// 检查$key1和$key2的值是否都为1,如果都为1,则表示所有条件都满足
if($key1 && $key2){// 包含名为'Hgfks.php'的文件include "Hgfks.php";// 输出成功提示echo "You're right"."\n";// 输出$flag变量的值echo $flag;
}?>
重点看以下几行代码
// 检查是否在GET请求中存在,并且将$a转换为整数后大于6000000,同时$a的字符串长度小于等于3
if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){// 检查变量$b是否被设置,并且$b的MD5哈希值的最后6位等于'8b184b'if(isset($b) && '8b184b' === substr(md5($b),-6,6)){// 如果上述条件都满足,将$key1的值设置为1$key1 = 1;// 检查$key1和$key2的值是否都为1,如果都为1,则表示所有条件都满足
if($key1 && $key2){// 包含名为'Hgfks.php'的文件include "Hgfks.php";// 输出成功提示echo "You're right"."\n";// 输出$flag变量的值echo $flag;
可以知道当$key1和$key2值都为真时,输出flag
先构造$key1,通过GET传参a、b的值
$a需满足字符串长度小于等于3且值要大于6000000
常规的十进制数字表示中,要同时满足字符串长度小于等于 3 且值大于 6000000 是不可能的。但在 PHP 中,存在特殊的类型转换规则,我们可以借助科学计数法来绕过这个限制
在 PHP 里,当使用 intval()
函数转换字符串时,科学计数法表示的字符串会被正确转换为对应的整数。比如,字符串 "6e6"
代表 ,也就是 6000000。
需要大于6000000,则可以令$a的值为“7e6”
、“8e6”
、“9e6”等
$b的MD5哈希值的最后6位等于'8b184b'
用python写一个脚本爆破出$b的值,脚本如下
import hashlib
# 目标 MD5 哈希值的最后 6 位
target_suffix = '8b184b'
# 从一个简单的字符集开始生成字符串进行尝试
charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
length = 1
while True:from itertools import product# 生成所有可能的长度为 length 的字符串组合for combination in product(charset, repeat=length):s = ''.join(combination)# 计算字符串的 MD5 哈希值md5_hash = hashlib.md5(s.encode()).hexdigest()# 检查哈希值的最后 6 位是否等于目标后缀if md5_hash[-6:] == target_suffix:print(f"找到符合条件的字符串: {s}")print(f"其 MD5 哈希值为: {md5_hash}")breakelse:# 如果当前长度的所有组合都没有找到符合条件的字符串,增加长度继续尝试length += 1continuebreak
可以用pycharm来执行,结果如下
得到$b的值为bDIOS
将a、b的值通过get传参,并查看输出
构造的payload为
?a=9e6&&b=bDIOS
看到输出的结果改变,$key1以及构造成功,下面构造$key2
重点看以下几行代码
// 从GET请求中获取参数'c'的值,使用json_decode函数将其解码为数组,并将结果强制转换为数组类型,赋值给变量$c
$c=(array)json_decode(@$_GET['c']);// 检查$c是否为数组,并且$c数组中的键'm'对应的值不是数字类型,同时该值大于2022
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){// 检查$c数组中的键'n'对应的值是否为数组,并且该数组的元素个数为2,同时数组的第一个元素也是数组if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){// 在$c["n"]数组中搜索值为'DGGJ'的元素,并返回其键名,赋值给变量$d$d = array_search("DGGJ", $c["n"]);// 如果没有找到值为'DGGJ'的元素,输出提示信息并终止脚本执行$d === false?die("no..."):NULL;// 遍历$c["n"]数组,检查是否有元素的值直接等于'DGGJ'foreach($c["n"] as $key=>$val){// 如果有元素的值等于'DGGJ',输出提示信息并终止脚本执行$val==="DGGJ"?die("no......"):NULL;}// 如果上述条件都满足,将$key2的值设置为1$key2 = 1;
需要通过上传json形式的c来实现
外层条件
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022)
-
is_array($c):
$c必须是一个数组。通过json_decode
解析$_GET['c']
得到的结果要能被强制转换为数组 -
!is_numeric(@$c["m"]):
$c
数组中的键"m"
对应的值不能是一个数字。这里使用@
符号来抑制可能出现的未定义索引警告 -
$c["m"] > 2022:
虽然$c["m"]
不是数字,但在进行比较时,PHP 会尝试将其转换为数字进行比较。可以利用 PHP 的类型转换规则,使用以数字开头的字符串来满足这个条件。
由于is_numberic会将数字和数字字符串判定为真,但前导数字字符串不会以及>是弱类型比较,且是将c['m']的值与数字进行比较,我们可以直接用前导字符串来作为比较数字与2022进行比较。所以令c['m']='2025a'
键n值要满足:有且仅有两个元素的数组,第一个值为数组,第二个值要满足array_search("DGGJ", $c["n"])返回为真,同时c["n"]中又不能出现"DGGJ"。
可以利用array_search函数在比较两者是否相等时是使用的弱类型比较。由于"DGGJ"是既非数字字符串又非先导数字字符串的字符串,其在与数字进行比较时会转化为数字0。从而令c['n']的第二个值为0。(一点思考:此处若不是'DGGJ'而是其他字符串时,我们应该视情况而定,选择合适的数字)所以令c['n']=(array(1,2),0)
内层条件
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0]))
-
is_array(@$c["n"])
:$c
数组中的键"n"
对应的值必须是一个数组 -
count($c["n"]) == 2
:这个数组的元素个数必须为 2 -
is_array($c["n"][0])
:数组$c["n"]
的第一个元素也必须是一个数组
所以最后构造的$c的payload为:c={"m":"2025a","n":[[1,2],0]}
最后传参a、b、c构造payload
?a=8e6&&b=bDIOS&&c={"m":"2025a","n":[[1,2],0]}
最终得到flag
相关文章:

1.攻防世界easyphp
进入题目页面如下 是一段PHP代码进行代码审计 <?php // 高亮显示PHP文件源代码 highlight_file(__FILE__);// 初始化变量$key1和$key2为0 $key1 0; $key2 0;// 从GET请求中获取参数a的值,并赋值给变量$a $a $_GET[a]; // 从GET请求中获取参数b的值ÿ…...

深度学习 Pytorch 神经网络的学习
本节将从梯度下降法向外拓展,介绍更常用的优化算法,实现神经网络的学习和迭代。在本节课结束将完整实现一个神经网络训练的全流程。 对于像神经网络这样的复杂模型,可能会有数百个 w w w的存在,同时如果我们使用的是像交叉熵这样…...

如何利用天赋实现最大化的价值输出-补
原文: https://blog.csdn.net/ZhangRelay/article/details/145408621 如何利用天赋实现最大化的价值输出-CSDN博客 如何利用天赋实现最大化的价值输出-CSDN博客 引用视频差异 第一段视频目标明确,建议也非常明确。 录制视频的人是主动性…...

Vue简介
目录 Vue是什么?为什么要使用Vue?Vue的三种加载方式拓展:什么是渐进式框架? Vue是什么? Vue是一套用于构建用户界面的渐进式 JavaScript (主张最少)框架 ,开发者只需关注视图层。另一方面,当与…...

three.js+WebGL踩坑经验合集(6.2):负缩放,负定矩阵和行列式的关系(3D版本)
本篇将紧接上篇的2D版本对3D版的负缩放矩阵进行解读。 (6.1):负缩放,负定矩阵和行列式的关系(2D版本) 既然three.js对3D版的负缩放也使用行列式进行判断,那么,2D版的结论用到3D上其实是没毛病的,THREE.Li…...

使用 OpenResty 构建高效的动态图片水印代理服务20250127
使用 OpenResty 构建高效的动态图片水印代理服务 在当今数字化的时代,图片在各种业务场景中广泛应用。为了保护版权、统一品牌形象,动态图片水印功能显得尤为重要。然而,直接在后端服务中集成水印功能,往往会带来代码复杂度增加、…...

Kafka下载
一、Kafka下载 下载地址:https://kafka.apache.org/downloads 二、Kafka安装 因为选择下载的是 .zip 文件,直接跳过安装,一步到位。 选择在任一磁盘创建空文件夹(不要使用中文路径),解压之后把文件夹内容…...
【C++语言】卡码网语言基础课系列----5. A+B问题VIII
文章目录 练习题目AB问题VIII具体代码实现 小白寄语诗词共勉 练习题目 AB问题VIII 题目描述: 你的任务是计算若干整数的和。 输入描述: 输入的第一行为一个整数N,接下来N行每行先输入一个整数M,然后在同一行内输入M个整数。 输出…...

IP服务模型
1. IP数据报 IP数据报中除了包含需要传输的数据外,还包括目标终端的IP地址和发送终端的IP地址。 数据报通过网络从一台路由器跳到另一台路由器,一路从IP源地址传递到IP目标地址。每个路由器都包含一个转发表,该表告诉它在匹配到特定目标地址…...

仿真设计|基于51单片机的温湿度、一氧化碳、甲醛检测报警系统
目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现(protues8.7) 程序(Keil5) 全部内容 资料获取 具体实现功能 (1)温湿度传感器、CO传感器、甲醛传感器实时检测温湿度值、CO值和甲醛值进…...
QModbusTCPClient 服务器断开引起的程序崩溃
最近使用QModbusTCPClient 与一套设备通信,有一个QTimer频繁的通过读取设备寄存器。程序运行良好,但是有个问题:正常进行中设备断电了,整个程序都会崩溃。解决过程如下: 1.失败方案一 在QModbusTCPClient的errorOccu…...
Vue 3 30天精进之旅:Day 11 - 状态管理
在开发复杂的前端应用时,状态管理是一个不可或缺的部分。Vuex是Vue.js官方提供的状态管理库,能够高效地管理应用中的共享状态。它使得各个组件之间的状态共享和维护变得更加简单和清晰。今天,我们将探讨以下几个方面: Vuex概述安…...
npm 和 pip 安装中常见问题总结
安装路径的疑惑:NPM 和 PIP 的安装机制 NPM 安装路径规则: 依赖安装在项目目录下: 当你运行 npm install --save-dev jest,它会在当前目录(例如 F:\)下创建一个 node_modules 文件夹,把 jest 安…...

Flutter开发环境配置
下载 Flutter SDK 下载地址:https://docs.flutter.cn/get-started/install M1/M2芯片选择带arm64字样的Flutter SDK。 解压 cd /Applications unzip ~/Downloads/flutter_macos_arm64_3.27.3-stable.zip执行 /Applications/flutter/bin/flutterManage your Flut…...
Two Divisors ( Educational Codeforces Round 89 (Rated for Div. 2) )
Two Divisors ( Educational Codeforces Round 89 (Rated for Div. 2) ) You are given n n n integers a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,…,an. For each a i a_i ai find its two divisors d 1 > 1 d_1 > 1 d1…...

亚博microros小车-原生ubuntu支持系列:17 gmapping
前置依赖 先看下亚博官网的介绍 Gmapping简介 gmapping只适用于单帧二维激光点数小于1440的点,如果单帧激光点数大于1440,那么就会出【[mapping-4] process has died】 这样的问题。 Gmapping是基于滤波SLAM框架的常用开源SLAM算法。 Gmapping基于RBp…...

Java面试题2025-并发编程进阶(线程池和并发容器类)
线程池 一、什么是线程池 为什么要使用线程池 在开发中,为了提升效率的操作,我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务,可以将任务分成几块,分别交给几个线程去执行,最终做一个汇总就可…...
Stable Diffusion 3.5 介绍
Stable Diffusion 3.5 是由 Stability AI 推出的最新一代图像生成模型,是 Stable Diffusion 系列的重要升级版本。以下是关于 Stable Diffusion 3.5 的详细信息: 版本概述 Stable Diffusion 3.5 包含三个主要版本: Stable Diffusion 3.5 L…...
云计算部署模式全面解析
目录 引言公有云私有云混合云三种部署模式的对比选择建议未来趋势结语 1. 引言 随着云计算技术的快速发展,企业在选择云部署模式时面临着多种选择。本文将深入探讨云计算的三种主要部署模式:公有云、私有云和混合云,帮助读者全面了解它们的特点、优势及适用场景。 © iv…...
Vue 与 Electron 结合开发桌面应用
1. 引言 1.1 什么是 Electron? Electron 是一个使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用程序的框架。它结合了 Chromium 渲染引擎和 Node.js 运行时,使得开发者可以使用 Web 技术创建原生桌面应用。1.2 为什么选择 Vue.js 和 Electron? Vue.js 是一个渐进式 JavaSc…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...