第一届贵州理工校赛--ez-uploadez-upload-plus
最近复习完文件上传的漏洞靶场,那么就要用题目来进行巩固一番,贵州理工校赛是我写博客的起点啊,其中两道题因为那时还没有怎么接触,所以没有做出来,那么现在就要去把它搞定了,那么就开搞吧。
靶场地址:https://www.qsnctf.com/
一、ez-upload
题目提示:当前目录无法解析,说明其文件上传和目录穿越的结合
可以看到题目提示随便传,那么直接传一句话木马
<?php eval($_POST['cmd']); ?>
可以看到上传成功,那么试一下访问
发现并没有进行解析,那么就需要进行目录穿越,首先就是需要试一下目录穿越的功能点在哪
最后尝试在下面12.php那里可以进行目录穿越,如下所示
可以看到上传成功了,那么进行访问
可以看到解析成功了,那么使用蚁剑进行连接即可
连接成功,那么寻找flag即可,或者使用下面命令可以直接输出
cat /f*
ok,此题的难点在于需要寻找到目录穿越的功能点,然后就简单。
二、ez-upload-puls
此题的难度结合了上一题的解题思路,还有在上传文件时检验文件的长度,如下所示
可以看到一句话木马也太大,说明检验其长度,那么就需要进行不断地尝试了
那么从两张图可以看出文件字节数不大于11字节,那么这里又要进行考虑了,只能少于11字节的话那么如何上传一句话木马呢,毕竟<?php ;?>这里都八个字节了,并且还要执行系统命令,php执行系统命令的函数都要大于3字节了。那么这里就介绍php中另一种执行系统命令的方式
1、php短标签和反引号
php短标签(Short Open Tags)
PHP 短标签是一种简化的代码起始 / 结束标记,目的是减少代码冗余,常见于快速输出内容的场景。
1. 常见形式及作用
-
<? ?>
:替代完整标签<?php ?>
,用于包裹 PHP 代码。例:<? echo "hello"; ?>
等价于<?php echo "hello"; ?>
。 -
<?= ... ?>
:这是<? echo ... ?>
的简写(最常用!),专门用于快速输出变量或表达式的值。例:<?= "hello" ?>
等价于<?php echo "hello"; ?>
,输出结果为hello
。
2. 关键
- 字节极短:
<?= ?>
仅占 3 个字符(<
、?
、=
),比完整标签<?php echo ...; ?>
节省大量字节,这也是你在 “文件内容≤11 字节” 限制下能使用它的核心原因。 - 默认支持:虽然早期 PHP 需要在
php.ini
中开启short_open_tag
配置,但现代 PHP(5.4+)中,<?= ?>
始终可用(不受short_open_tag
影响),因此几乎所有环境都能直接运行。
反引号():执行运算符
PHP 中的反引号(,注意不是单引号'
)是执行运算符,专门用于执行系统命令并返回命令的输出结果。
1. 作用及用法
反引号包裹的内容会被当作系统命令执行,执行结果会作为字符串返回。例如:
<?= `ls /`; ?> // 等价于 <?php echo shell_exec('ls /'); ?>
- 这里反引号内的
ls /
是 Linux 命令,执行后会返回根目录的文件列表; - 结合短标签
<?= ?>
,就能直接输出命令的执行结果(这正是你上传文件后能看到目录内容的原因)。
那么这里我们就可以构建payload了,使用语句如下
<?=``;
在反引号里面我们就可以执行系统命令,?>是可以省略的。
那么如下图所示,记住这里也包含了上一题的目录穿越,不然上传的无法解析
那么进行访问一下
可以看到flag了,那么有出现了一个问题,就是怎么读取flag,我们要时刻考虑的是,在我上面构造的payload中
<?=``;
这是基础的,如果你的条件不符合这个,那么是不会解析的。我们可以数数,上面的语句已经占了六个字节,那么也就是说我们需要使用五个字节去读取flag,那么就常见的读取文件内容payload,我们在上面的上传的文件已经知道了flag在根目录,那么读取flag就需要
cat /f*
七个字节,无法上传,空格是不可以去掉的,/是代表根目录,也是无法去除的,那么有没有更短的读取文件的命令呢。哎,就有那么一个,nl
nl命令
nl
是 Linux/Unix 系统中的常用文本处理命令,核心功能是 为文件内容添加行号并输出,比 cat -n
更灵活(支持自定义行号格式、空行是否编号等)。它在日常文本处理和 CTF 命令执行场景中都可能用到,尤其适合需要快速定位行内容的场景。
1.基本语法
nl [选项] 文件名
如果不指定文件名,默认读取标准输入(可通过管道符 |
接收其他命令的输出)。
那么将上面的payload换成nl,如下所示
nl /f*
六个字节,还差一个,那么这里就需要知道读取文件的一个特性,就是如果在读取文件命令后面只是加上所在目录,但是没有文件名,然后再加上通配符*,那么命令就会读取所在目录所有可读的文件并输出,语句如下
nl /*
此命令的意思是读取根目录下所有可读文件并输出,并且是五个字节,符合长度,如下所示
成功读取,此题结合了很多的知识,短标签,反引号,nl命令等,难度还是有点的。