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还是硬伤不怎么会,留个坑以后慢慢补。