WHUCTF2020 Writeup
准备考研去了,很久没有写过博客,包括网鼎杯的 Writeup 也咕咕咕了,刚好最近有个武大的比赛,闲来就做了一下,太久没打,只会做 easy 题目了,有些题目还是蛮有意思的,只写了和 Web 相关的几题。
Easy_sqli
打开就是登陆框,试了万能密码发现有 Login success!,但是界面还是主页,应该后面就没有什么逻辑了,还爆出了执行的 sql 语句,非常贴心:
1 | |
经过测试,发现对一些关键词进行了过滤,关键词被替换成空,目前根据自己的解法发现了 from, select, or, where,采取双写绕过即可。然后发现只要 sql 语句是对了,那么就会有 Login success!,盲注解一波就出来了。
exp:
1 | |
这里还有个小插曲,我字符集里面没有 ? 和 ~,搞得我很迷惑,问了一下出题人,地方是对的但是 flag 不正确,那就是字符的问题,后来直接用 ascii 表跑就出来了。
Ezphp
php 的代码审计,源码:
1 | |
看到前两关就看出来是南邮2019的原题了,这里有三个绕过:
- 传入的
num的值不可以等于23333,并且这个值要被正则表达式/^23333$/匹配到,换行符绕过正则匹配。 - 传入
str1和str2的md5值不可以一样,但是经过strtr函数替换后的md5值要一样 - 反序列化长度逃逸,把字符串的
x都替换成yy
第一关使用 num=23333%0a 即可绕过
第二关的 str1 要是数字,str2 随便用一个 md5 后是 0e 开头且为纯数字的即可。str1 需要 md5 后以 0e 开头,后面只包含 pggnb 中一个或多个的字母,其余是数字,这样一替换就都是 0e 造成 php 弱类型的绕过。
1 | |
跑出来 11230178 即可成立,md5 值为 0e732639146814822596b49bb6939b97,替换后就为纯数字了,第二关过。
第三关就是 php 反序列化长度变化尾部字符串逃逸,可以参考 0ctf2016 的 piapiapia,题目将传入的 username 和 变量password打包成一个数组然后序列化,如果反序列化出来数组第二个元素等于 123456,即可得到flag。因此我们需要构造 a:2:{i:0;s:5:"admin";i:1;s:6:"123456";}";i:1;s:5:"aaaaa";} 来将字符串闭合控制第二个元素为我们的 123456,但是长度会变,我们要添加的字符串为 admin";i:1;s:6:"123456";},长度为20,因此我们构造20个x,xxxxxxxxxxxxxxxxxxxx";i:1;s:6:"123456";},这样x就会被替换成yy,我们就多了20个位置,把我们的 payload 挤出去,就刚好可以闭合了。
完整 payload:
1 | |
ezcmd
这道题也是一个原题,GXYCTF2019 的 Ping Ping Ping,源码:
1 | |
过滤了 {,} ,没有过滤 $,空格可以使用 $IFS$9 绕过,管道符被过滤了,但是可以用 ; 进行另一条命令的执行,首先 ?ip=;ls 就可以看到 flag 就在 flag.php
然后过滤了读的命令关键字,这里用 ca\t 即可绕过,同时也过滤了 flag.php 的关键字,我们可以用拼接的方法来绕过:
1 | |
完整 payload:?ip=;a=lag;ca\t$IFS$9f$a.php
ezinclude
这道题有点脑洞,在 /contact.php 里有提交表单的选项,随便提交发现 url 上有一些参数,题目说是文件包含,那么往这方面去想,后来发现直接加一个 file 参数就可以读了,flag就出来了,可能是给新生的送分题吧。
完整 payload: /thankyou.php?firstname=&lastname=&country=australia&subject=&file=php://filter/convert.base64-encode/resource=flag.php
Easy_unserialize
这题考察的是上传 phar 触发反序列化,刚好补了一下我的坑。。可以参考创宇的 paper: https://paper.seebug.org/680/
还是学弟发现在主页加参数 ?acti0n=php://filter/convert.Base64-encode/resource=upload.php 可以读到源码,于是把 view.php 和 upload.php 的源码看了一下, upload 的源码好像没有什么利用的点,看到 view.php 的时候,发现了一个 phar 的危险函数:
1 | |
这里有一个 file_exists 可以利用,而且最后还会进行代码执行。
1 | |
虽然 upload.php 没有什么利用点,但是可以看到黑名单
1 | |
我们可以用 show_source() 函数把 flag.php 读一下,而且 phar 可以直接上传,那我们先构造:
1 | |
exp 的模板,有时候限制 gif 的话可以增加 gif 头,生成 phar 文件后,直接上传。
我们可以知道,要通过 delete 这个参数来触发 file_exists 才可以利用 phar,因此构造参数 detele=phar://phar.phar包含一下,就可以得到flag了。
WHUCTF{Phar_1s_Very_d@nger0u5}
shellofAWD
这题是一个流量包,听名字应该是在打 AD 时的流量包,打开流量包很快就可以发现🐎,并且还可以看到靶机的 ip,筛选一下进行分析。
后来跟踪下一个 tcp 流,发现送了一堆参数
base64解码ant参数得到
1 | |
再看看 _0x6aa401ad3c537 的参数:
1 | |
当然,可以看到其实并没有什么用,可能就测试一下功能,不过大概知道了他传东西的套路了,看到 tcp.stream eq 3 时,发现了
拿到了比较关键的代码
1 | |
其中有一段解码的引起了注意,将参数里 $c=$_POST["oc86831f79ec72"]; 进行解码,可以得到:
1 | |
这里就是比较关键的代码了,首先传 pass 设置 SESSION,这是 AES 的密钥,我们查到流量包有两个传 pass 的,最后一个得到的 key 就是后面我们用来解密的 AES 密钥。
可以知道 key = 91ee1bfc4fd27c90,接下来就是硬解后面的流量包了。发现执行了 ln -s /flag jquery.min.js ,这样 jquery.min.js 就指向了 flag,读它就得到了flag(tcp.stream eq 6)
最后在 tcp.stream eq 7 里的回应里解密可以得到结果的 base64,结果解码就是flag了。
exp:
1 | |
总体来说还是挺好玩的,总结了一些思路可以回去训练新人,武大的师傅还是很强,剩下两题web也没咋看,js还是硬伤不怎么会,留个坑以后慢慢补。
