攻防世界web新手第四题easyphp

news/2024/12/31 0:00:12/
<?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;
}?> Emmm...

这是题目
惯例:代码审查

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

这里很明显,若key1与key2均为真,则打印flag变量,猜测flag变量就是结果,来自Hgfkg.php,所以我们的目标是让key1与key2为1或true!

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){if(isset($b) && '8b184b' === substr(md5($b),-6,6)){$key1 = 1;

这里可以看出,我们需要构造a和b,满足两个if条件,使key1赋值为1,

$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;

这里可以看出,我们需要构造c,满足两个if条件使key2赋值为1。
到这里我们基本明确了问题就是a,b,c如何构造的问题。

接下来我们看一下条件:
对于a和b,需要满足这两个条件

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){if(isset($b) && '8b184b' === substr(md5($b),-6,6))

isset($a):a不为空

intval($a) > 6000000:a强制类型转换后大于60000000

strlen($a)<= 3:a变量字符串长度小于等于3

isset($b):b不为空。

‘8b184b’ === substr(md5($b),-6,6):b的md5加密后后六位要全等于8b184b。

条件要求总结完毕,接下来挨个突破:
a变量长度小于等于3且类型转换后大于6000000,所以大概率是科学计数法,所以猜测a可以是1e8。

b变量的md5加密后后六位要全等于8b184b。
ai写脚本爆破

<?php
function findNumberWithMd5Suffix($suffix, $start = 0, $end = PHP_INT_MAX) {for ($i = $start; $i <= $end; $i++) {// 将数字转换为字符串并计算MD5哈希$hash = md5((string)$i);// 检查哈希值的后六位if (substr($hash, -6) === $suffix) {return $i;}}return null; // 如果没有找到,则返回null
}// 寻找符合条件的数字
$bValue = findNumberWithMd5Suffix('8b184b');if ($bValue !== null) {echo "找到的b的值: " . $bValue . "\n";
} else {echo "在给定范围内未找到符合条件的数字。\n";
}
?>

用AI生成爆破代码如上,得到b的值为53724.
在这里插入图片描述
接下来就是构造C了,
对于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])){

c需为Jason格式的值,c的m键对应的值不是数字且不是数字字符串,c的m键的值要大于2022
c的n键对应的值需为数组且该数组长度为2且第一位为数组,
使用AI写代码构造C
在这里插入图片描述
至此,a,b,c已构造完毕
构造url:http://61.147.171.105:64218/?a=1e8&&b=53724&&c={“m”:“2024Year_”,“n”:[[0],9]}
提交:显示no
在这里插入图片描述
再结合代码:

$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;

可以看出我们把c的n键对应的值漏了一些要求,要求数组c内要包含“DGGJ”,又要求不能包含,所以只能考虑绕过了,
array_search函数会先转换成相同类型再进行判定,所以我们的c的n键"n":[[0],9]要改为"n":[[0],0],此时array_search(“DGGJ”, $c[“n”])为true,就不会执行后面的判定了,这里是因为字符串“DGGJ”转换为数值类型相当于0,所以后面一个只能是0,至于前面数组内的值就任意了,再测试
在这里插入图片描述

拿到flag

总结:考察的是代码理解,payload构造和函数绕过
知识点:
1.@
对于这个 @ 符号,之前很少在意,看别人的代码看见时,只知道它是错误屏蔽的符号。今天再一次接触到了它,不得不认真了解一下。
@ 是可以屏蔽函数执行过程中遇到问题而产生的一些错误、警告信息,这样用户就看不到程序的出错信息。这样除了用户界面会友好一些外,更重要的是安全性,因为屏蔽了出错文件的路径等信息。想想看,你的文件路径要是完全暴露给黑客,他们该有多开心,因此,在一些敏感的文件输出的位置,还是记得加上 @ 符号!
2.substr

`substr()` 函数是 PHP 中用于处理字符串的强大工具,它允许开发者从给定的字符串中提取出特定长度的子字符串。下面将详细解释 `substr()` 函数的使用方法及其应用场景。
1. **基本用法**
`substr()` 函数接收三个参数:原始字符串 `$string`,起始位置 `$start` 和截取长度 `$length`- `$string`:要截取的原始字符串。
- `$start`:从字符串的哪个位置开始截取。如果 `$start` 是正数,那么它表示从字符串开头算起的字符位置。如果 `$start` 是负数,那么它表示从字符串末尾算起的字符位置。
- `$length`:截取的子字符串长度。如果省略或者设置为 `null`,则会截取到字符串的末尾。

3.is_numeric()函数,作用是判断输入是不是数字或数字字符串。
4.array_search
array_search()函数在数组中搜索值并返回键。
array_search函数 类似于==
在进行比较的时候,会先将字符串类型转化成相同类型,再比较
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行


http://www.ppmy.cn/news/1559076.html

相关文章

理想的未来在AI——李想深度解析理想汽车的智能化之路

摘要&#xff1a; 在2024年的AI Talk中&#xff0c;理想汽车董事长兼CEO李想分享了他对人工智能的深刻见解和理想汽车在智能化道路上的最新进展。本文整理了访谈的精华内容&#xff0c;探讨了李想如何将理想汽车从传统车企转型为人工智能企业&#xff0c;并展望了人工智能技术如…

第一个C++程序|cin和cout|命名空间

第一个C程序 基础程序 使用DevC5.4.0 写一个C程序 在屏幕上打印hello world #include <iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; } 运行这个C程序 F9->编译 F10->运行 F11->编译运行 mai…

docker-开源nocodb,使用已有数据库

使用已有数据库 创建本地数据库 数据库&#xff1a;nocodb 用户&#xff1a;nocodb 密码&#xff1a;xxxxxx修改docker-compose.yml 默认网关的 IP 地址是 172.17.0.1&#xff08;适用于 bridge 网络模式&#xff09;version: "2.1" services:nocodb:environment:…

TCP 传输可靠性保障

TCP 如何保证传输的可靠性&#xff1f; TCP传输可靠性的保障主要通过以下几个核心机制实现&#xff1a; ‌1. 三次握手与连接管理‌&#xff1a; TCP在建立连接时采用三次握手过程&#xff0c;确保通信双方实体真实存在&#xff0c;并同步连接参数。这一过程为后续的可靠数据传…

Java连接HANA数据库

package hs.hsapp.util; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class HanaJdbc { private static final String DRIVER “com.sap.db.jdbc.Driver”; //jdbc 4.0 private static…

HarmonyOS NEXT 实战之元服务:静态案例效果---手机查看电量

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

React 组件通信完整指南 以及 自定义事件发布订阅系统

React 组件通信完整指南 1. 父子组件通信 1.1 父组件向子组件传递数据 // 父组件 function ParentComponent() {const [data, setData] useState(Hello from parent);return <ChildComponent message{data} />; }// 子组件 function ChildComponent({ message }) {re…

<packaging>jar</packaging>和<packaging>pom</packaging>的区别

在Maven项目中&#xff0c;<packaging> 元素在 pom.xml 文件中定义了项目打包的方式。<packaging> 的值决定了构建过程中生成的构件类型。以下是 <packaging>jar</packaging> 和 <packaging>pom</packaging> 两种最常见的打包类型的区别&a…