今天是2026年8月22号

今天分享的是polar靶场WEB中等题第49-55题

Polar靶场

49.题目信息:金币大挑战

进入靶场:

我们得到21个金币就能到下一关了,但是正常点击只能得到20金币,我们在网页源码中可以看到addCoin()函数,这个函数是我们点击金币+1时给我们加金币的按钮事件:

我们可以在这个函数中看到如果我们的金币到了20,就会禁止按钮事件,我们就永远得不到第21个金币,不过这里有个漏洞,我们只要不经过按钮直接发POST请求action=add_coin就能直接绕过限制,打开BP抓金币+1的包:

发送:

成功跳转,我们到新页面看看:

可以看到最底部有一个压缩包,我们看看这个压缩包:

有两个文件,还有密码,我们先找找密码,根据底部的一段小提示,我们可以尝试一下Squirtle密码:

密码对了一半,纯数字.txt的密码是Squirtle,另一个不是,我们再找找另一个密码,我打开了名为纯数字.txt的文本发现里面是空的,我猜测这个文件名就是一个提示,我们用爆破工具纯数字来爆破试试:

还真爆出来了,密码:1170,我们用密码解压打开秘密文件:

里面是两个文件的密码,我们再找找有没有其他线索:

我们在网页源码里可以看到一个目录:uploads/Squirtle.zip这是页面底部压缩包文件的目录,这证明这里有文件上传目录,我们访问一下uploads目录:

有目录但不让访问,我们用Squirtle.php试试看有没有木马:

是空白页面,其他的都是404找不到,这证明了确实有木马,而我们刚刚获得的那串字符Squirtle1170很可能是密码,我们发个POST请求试试:

根目录直接拿到flag:flag{a9ba1f50c526df75b34bad53db1564c0}
也可以用蚁剑连接拿flag,还有flag{a9ba1f50c526df75b34bad53db1564c0}.txt里面是空的。

50.题目信息:杰尼龟系统

进入靶场:

在Ping测试这里找到了几个假flag,证明这里只是晃子,flag在别的地方:

这里面有好多诱饵,我们直接全盘扫描flag:

127.0.0.1;find / -type f -name "*flag*" 2>/dev/null

发现了一个新的flag在/var/tmp/flag,我们看看是不是真的:

成功拿到真正的flag:flag{459fc13bc7e1265b410fa7eb9e87a63e}

51.题目信息:static

进入靶场:

分析代码,题目过滤了一些PHP伪协议和一些命令执行函数,我们输入的参数必须要带上static/,并且../会被直接删除,测试payload:

?file=static/../test

我们试试../双写绕过,payload:

?file=static/..././flag

直接拿到flag:flag{030e77f73a4cb26a111daf0470c3956f}

52.题目信息:Pandora Box

进入靶场:

题目意思很明确了,就是要我们上传图片马,我们整一个上传测试一下:

上传:

上传成功,我们访问试试看:

后面被加了一个.php,我们观察地址栏会发现出现了一个参数?file=

后面就是我们上传的文件,但是名字被改了,并且会在后面加上.php,我们尝试用PHP伪协议读取index.php,payload:

?file=php://filter/read=convert.base64-encode/resource=index    #这里不用加.php题目会给我们加

温馨提示:不要直接读index
我们看看编码的内容:

源码:

<?php
        ini_set('display_errors', 1);//开启报错
        error_reporting(E_ALL);

        if (isset($_FILES['file'])) {//检查
            $file = $_FILES['file'];
            $name = $file['name'];
            $ext = pathinfo($name, PATHINFO_EXTENSION);//PATHINFO_EXTENSION取后缀
            
            if (in_array($ext, ['jpg', 'png'])) {//匹配后缀
                $upload_dir = 'upload/';
                if (!is_dir($upload_dir)) mkdir($upload_dir);//创建一个存放上传的目录
                $new_name = $upload_dir . md5(uniqid()) . "." . $ext;//生成文件的唯一的id名称
                
                if (move_uploaded_file($file['tmp_name'], $new_name)) {//将文件从保存到upload
                    echo "<p class='success'>[+] Upload Success! Path: " . $new_name . "</p>";
					echo "<a href='?file=" . $new_name . "' target='_blank'>点击跳转</a>";
                } else {
                    echo "<p style='color:red'>上传失败</p>";
                }
            } else {
                die("<p style='color:red; font-weight:bold;'>[!] 不要耍小聪明! 只允许什么你知道的</p>");
            }
        }

        // 2. 漏洞逻辑 (黑盒)
        if (isset($_GET['file'])) {
            $file = $_GET['file'];
            echo "<div class='log-box'><strong>[System Error Log]:</strong><br>";
            
            // === 绝杀点 ===
            // 强制拼接 .php,导致普通图片马失效
            // 选手必须看到报错 'include(xxx.jpg.php)' 才能反应过来
            include($file . '.php');
            
            echo "</div>";
        }
?>

我们已经知道了大致内容了,所以源码基本没用了,但是我们可以想想其他的,比如这个伪协议可以用,那我们何不试试zip://伪协议,把我们的一句话木马压缩一下后把后缀改为.jpg

我们上传这个后,用zip://伪协议来读取,payload:

?file=zip://upload/b7c22812f6271a5ee6e973f87d046040.jpg%23shell    #这里的#要url编码一下,后面的shell不用加.php题目会给我们加

成功了,我们发个POST包试试:

成功了,找到flag了,直接读取:

成功拿到flag:flag{47ea7bc31157e1a1a6ca01e26163b726}

53.题目信息:Signed_Too_Weak

进入靶场:

这是一个登录口,我们先用备用账号密码登录:

提示当前为普通用户权限,我们观察地址栏可以看到一串字符:

这个是JWT签名,我们在网上找一个JWT解析网站可以看到里面的内容:

username的值为user,应该是要我们把user改为admin,但我们没有密钥,无法修改,我们可以用jwt‑cracke爆破工具来爆破密钥:

./jwtcrack "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InVzZXIiLCJpYXQiOjE3ODczOTMyNTEsImV4cCI6MTc4NzM5Njg1MX0.pB1OG_3J2QhqBwY7_QwPVDkTvP6MRElH7uZlu1Ov2uc"

成功爆出密钥,我们用这个密钥来对JWT签名进行修改:

把生成的JWT签名复制给key成功拿到flag:flag{1ef71ce34edda6640854cd8d4638af3a45b011eaf21fc8ee71eca8ad24ce1cdd}

这flag有点长啊。

54.题目信息:云中来信

进入靶场:

这题限制我们只能用http、https头和只能用preview.polar域名访问,我们可以进行SSRF攻击(服务端请求伪造),用@127.0.0.1来把前面的preview.polar当成用户名,实际访问的是127.0.0.1,我们可以这样来绕过白名单,就像以内部人员的身份来非法读取,我们试试直接在后面输入命令:

会请求失败,证明这题不是命令注入,我们试试访问云服务商元数据服务接口:/latest/meta-data/

有提示了,让我们访问/latest/api/token先拿token:

返回了token,我们根据提示的格式来摆放,然后携带我们的JSON请求头来重新访问云元数据接口:

得到了一个地址:/latest/meta-data/ctf/a8dc35b6f9a5e9e44482,我们访问看一下:

给我们返回了flag,成功拿到flag:flag{62b08b6daed71ed85c0655abe1ea8cd2}

55.题目信息:路飞的HTTP协议冒险

进入靶场:

点击吃肉:

要吃800块肉,问一下达旦:

我们找找有没有什么方法,在查看器中可以看到按钮事件,值为1:

我们把值改为800:

点击按钮:

成功跳转,我们问问香克斯:

得到情报:需要获得rubberpower才可以变强,我尝试了cookie、POST传参,但没有用,尝试GET传参?power=rubber意为力量=橡胶,发现可以开二档了:

我们进入二档:

我们先问问罗宾:

她说要让血液blood``加速boost并将限制limit``解除unlock来开二档赢得胜利,抓包发现是个POST包:

那我们发POST请求:

blood=boost&limit=unlock    #意为血液=加速与解除=限制

二档开启成功,跳转到了新页面:

我们先问问弗兰奇:

让我们带上请求头:X-Luffy-Gear3,值为Bonelnflate,我们照做:

三档成功了,下一步:

继续问雷利:

这里提示开四档需要雷利的认证,也就是在cookie里加上:Trainer: Rayleigh,还有:gear4(四档): BoundMan(弹力人),成功开启四档:

下一关:

问问甚平:

解除封印之前要先确认状态,我们回到封印界面,发个POST包可以发现方式会变:

经过多次尝试,发现携带 ETag "seal‑memory‑v1";服务器校验:只有当前资源ETag和请求头匹配,意为确认封印仍然存在,然后发DELETE包清除资源,整体意为:只有当前资源 ETag 和请求头匹配,才接受 DELETE 执行删除。完美对应甚平台词:清除之前,先确认它仍是当前状态,最后拿flag:

在包中发现flag目录,访问flag目录后成功拿到flag:flag{15b606dc5a9492c260984aa627338bfd}

流程可能有点长...

今天就到这里。

"别轻信页面提示,有些校验藏在 HTTP 头部里。"