XCTF 攻防世界 题解
XCTF联赛的题目复现。
Web
NaNNaNNaNNaN-Batman
把文件中的eval改成alert,后缀改成.html后浏览器打开,得到完整的代码。
1 | function $() { |
很简单的绕过,长度要求16位,be0f23开头,e98aa结尾,合并相同部分,输入be0f233ac7be98aa,得到flag{it's_a_h0le_in_0ne}。
unserialize3
1 | class xctf{ |
CVE-2016-7124,当序列化字符串中的表示对象数量的值大于实际个数时会跳过**__wakeup()函数的执行,因此构造payload为O:4:"xctf":1:{s:4:"flag";s:3:"111";},得到cyberpeace{19d4c21c56f7a95ad5612bfbc13411df}**。
Cat
fuzz后发现宽字节出现报错,提示了一个UnicodeEncodeError at /api/ping,细看报错信息是Django的框架,还有一些源码泄漏,那么可以对此错误信息进行分析,大致可以推测出来是通过php获取数据来发给Django的api。
先是合并了requests.FILES和requests.POST数据。
1 | # 合并 requests.FILES 和 requests.POST |
然后是核心的ping()函数。
1 |
|
以及escape()函数,对敏感字符进行了转义,最后进行gbk编码。
1 | r = '' |
因为%A0之类的宽字节并不在GBK编码表中,故转码时出错,且Django未关闭debug,故抛出了错误信息。
那么在php中构造post请求发送给其他服务就会用到CURLOPT_POSTFILEDS这个函数,且当CURLOPT_SAFE_UPLOAD为False的时候,可以通过@/绝对路径的方式来访问文件。
还有就是在开头的这段代码中将v和InMemoryUploadedFile比较,一样的话就读取它,而Django的debug模式开启后,所有的数据库查询将会以django.db.connection.queries的形式被保存在内存中 , 这会消耗大量的内存。
而在报错页面中也给出了数据库的绝对路径/opt/api/database.sqlite3,那么只要访问数据库的绝对路径就可以读取到全部的数据了。
构造payload为/?url=@/opt/api/database.sqlite3,得到flag为AWHCTF{yoooo_Such_A_G00D_@}。
ics-05
点开设备维护中心跳转到了index.php,右键源代码看见?page=index,根据提示推测是任意文件读取。
构造?page=php://filter/convert.base64-encode/resource=index.php得到源码。
1 |
|
此处的切入点在preg_replace()的/e模式会造成命令执行。
1 | pat=/south/e&rep=system(%27ls%27)&sub=south |
然后得到cyberpeace{a4d5263a734d6818bbcdee5be09eb1c4}。
ics-06
id爆破到2333得到cyberpeace{5200767bf6b1f80ef28c49c10a21774b}。
Triangle
wtf.sh-150
/post.wtf?post=../存在路径穿越,可以读取到源码。
1 | $ source user_functions.sh |
可以看到这边的逻辑是登陆为admin就可以拿到flag,同时利用路径穿越查看其他泄漏出的路径。然后在/post.wtf?post=../users/中发现admin用户的token,就可以伪造登陆来获得flag。
但是只拿到了一半,Flag: xctf{cb49256d1ab48803,后半部分笔记取自瑞雪丰年师傅博客。
1 | >l\\ |
1 | >ls\\ |
1 | >95 |
1 | xctf{cb49256d1ab48803149e5ec49d3c29ca} |
Guess
先是一个文件包含,http://111.198.29.45:55174/?page=php://filter/convert.base64-encode/resource=index。
1 |
|
然后看看上传页面,http://111.198.29.45:55174/?page=php://filter/convert.base64-encode/resource=upload。
1 |
|
大概的思路就是使PHPSESSID为空,然后得到$ss的MD5值即可求出原值,随后通过PHP_MT_SEED爆破种子求得上传的文件路径。
1 |
|
得到Payload为http://111.198.29.45:55174/?page=phar://uP1O4Ds/cu7eBI3ZvjTvjlezNnYH2p4B3FAZV67Q_south.php.png/south,同时Post如下参数。
1 | south=system("find / -name '*flag*' "); |
有两个地方放了Flag,网站根目录下的是假的。