ctf show web入门99

打开靶场,通过代码审计我们发现这是一道通过合法的参数绕过条件限制,最终利用 file_put_contents 实现任意文件写入的题目,我们的主要目的就是把一个木马写入该网站,然后拿flag

php 复制代码
$allow = array();
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1, $i));
}

这串代码的意思是重复877-36次每次迭代rand(1, i) 生成一个 1 到 i之间的随机整数arraypush(i 之间的随机整数array_push(i之间的随机整数arraypush(allow, ...) 将该随机数追加到 allow 数组的末尾

数组 $allow 的变化

复制代码
假设执行前 $allow 未定义(或为空),PHP 会将其自动创建为数组(但会抛出一个 Notice: Undefined variable)。建议先 $allow = [];。

最终 $allow 是一个索引数组,键从 0 到 840,共 841 个元素。

随机数的范围

复制代码
第 1 轮($i=36):随机范围 [1, 36]

第 2 轮($i=37):范围 [1, 37]

...

最后一轮($i=876):范围 [1, 876]

随着循环进行,随机数的上限逐渐增大,后面生成的数值可能更大(但仍然是均匀分布的整数)

所以1到36包含在这个数组的可能性最大

php 复制代码
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}

条件:我们需要传入一个 _GET\['n'\],并且这个值必须存在于 allow 数组中。

结果:如果条件满足,程序会创建/写入一个名为 _GET\['n'\] 的文件,内容为 _POST'content'。

这道题的破绽在于 PHP 的 弱类型比较。

在 PHP 中,in_array(value, array) 函数默认是弱类型检查(没有设置第三个参数为 true)。当它拿一个字符串去和一个整数进行比较时,PHP 会尝试将字符串转换为数字。

弱类型转换规则:

如果一个字符串以数字开头,PHP 在进行数学比较或类型转换时,会截取开头的数字部分,忽略后面的非数字字符。

例如:

"1.php" 会被转换为整数 1

因为1到36被包含的概率最大所以我们的文件名为1.php

然后我们就可以开始构造payload

我们先创建一个名为"1.php"的文件,并且在文件内写上一个一句话木马执行后我们在打开一个原url+1.php网站,通过psot方式执行命令

这里通过1=system('ls');命令列出当前目录的文件和子文件夹发现有一个flag36d.php

判断flag应该藏在这个文件下,我们尝试读取该文件内容

通过1=system('tac flag36d.php');命令查看该文件下的内容

得到flag为:ctfshow{024752ba-1087-4064-9c44-36f4887f0aa9}

相关推荐
Lvan的前端笔记3 小时前
docker:每个前端项目一个 Nginx 容器还是只有一个Nginx容器
前端·nginx·docker
三天不学习4 小时前
Egg.js 4 突然爆火,原因是否归结于AI 原生落地需求爆发?
前端·javascript·全栈·egg.js
aqi004 小时前
鸿蒙版本的电子书阅读APP开放源码啦
android·华为·ai编程·harmonyos·鸿蒙
墨天梦4 小时前
B19_SunnyWeather到阅读客户端
android·kotlin
xcs194054 小时前
前端 vue 的前端页面debugger 进不去
前端·javascript·vue.js
美狐美颜sdk5 小时前
直播APP源码可以直接接入视频美颜sdk吗?技术方案详解
android·人工智能·音视频·美颜sdk·直播美颜sdk
明月_清风5 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
qq_284274056 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
Csvn6 小时前
框架性能优化
前端
qq_284274057 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造