从放假到现在筹办准备了接近两个星期的MOCTF新春欢乐赛终于落幕啦,这次比赛我一共出了1签到+1MISC+3WEB,下面先放官方WriteUp(哇终于能当一回官方了)
签到
签到 20
|
|
flag:moctf{500000000}
MISC
空word 100
|
|
文件是个word
打开看发现一些奇怪的换行和tab
很容易想到是摩斯密码,替换后得到
解摩斯密码,然后hex转字符串得到flag
WEB
登录一哈 300
|
|
源码放到git里泄露给大家了
index.php
flag.php
看源码就可以知道这道题考查的是session反序列漏洞了
在index.php中php的序列化handler是’php_binary’,而flag.php里没有设置,就是默认的’php’
参考https://blog.spoock.com/2016/10/16/php-serialize-problem/
index.php中的$_session['username']
可控,我们就能构造payload到session,
然后访问flag.php页面就能触发反序列化执行__destruct
了,
这里还有个考点是$this->flag == $this->name
,通过引用的方式绕过。
构造payload
|
|
提交到index.php的username,然后访问flag.php就得到flag了
字符串检查 400
|
|
原意是xxe漏洞读取任意文件
后来知道师傅们卡了很久貌似是因为client-ip
的原因,我的锅
题目打开是个json字符串验证的页面,POST包的Content-Type
字段是application/json
,
POST后接口会返回json格式正确或错误的结果
改成application/xml
,接口提示只允许本机访问,于是构造
然后就是xxe盲打漏洞了,参考https://security.tencent.com/index.php/blog/msg/69
这里我只限制了payload长度为170以内,其实完全可以更短的,希望大佬们可以测试测试
最后flag在/etc/passwd
简单审计 400
|
|
index.php
解释一下题目的意思
根据action执行对应操作,action=test
会调用test_rand_code
函数发送tcp包到访客的ipaction=upload
时会写入一个文件,文件内容有waf拦截,文件名有白名单限制后缀,
然后拼接文件名加入rand的字符串,写入文件,文件写入后过3秒unlink删除
有问题的点有这几个
1.filename检查是用$filename[count($filename)-1]
取的后缀,是按照下标取的,而写入文件时用的是end($filename)
,是取最后一个元素,只要post时提交filename[1]=jpg&filename[0]=php
就能绕过了
2.$content的waf绕过, 绕过即可
3.使用rand()生成随机数,可以被预测,参考https://www.sjoerdlangkemper.nl/2016/02/11/cracking-php-rand/
预期解法是
1.username数组bypass后缀检查,绕过content的waf
2.rand随机数预测+爆破文件名 在unlink之前访问shell
结果大佬们直接非预期解bypass了unlink
打扰了
非预期解参考一叶飘零师傅的WriteUp
预期解如下
写两个脚本,
listen.py
put.py
运行结果如下
感想
讲一下这次比赛我主要干了那些事吧
- 出题,如上所述
- 平台搭建,用的是ctfd,docker的方式搭建的,省了很多事
- 题目部署,除了ping那题,其他的web都是我部署的,尤其是cms那题,反复部署的有点吐,中间有个集大学弟来帮忙,后面比赛的时候还是出了问题
- 发布题目,emmmmmmmmmm,用ctfd的时候出现了很神奇的情况,在编辑config的时候使用谷歌的自动翻译,保存之后ctfd的web服务就挂掉啦!是个巨坑,现在还不知道咋回事
- 比赛时候的放题,放hint,运维,水群,哈哈哈哈和大佬们玩耍还是很开心的
放一些后台数据
原来只是想给我们学校和集大的学弟们体验比赛的,不过对外开放也吸引了许多师傅们来做题,虽然运维得很累,但也学到了很多东西(主要是非预期和部署各种奇葩环境)
打一波广告,http://www.moctf.com/
MOCTF平台是CodeMonster和Mokirin这两支CTF战队所搭建的一个CTF在线答题系统。题目形式与各大CTF比赛相同。目的是为两个学校中热爱信息安全的同学们提供一个刷题的平台,能够一起学习、进步。
最后祝大家新年快乐!