i春秋联合百度举办了百度杯 CTF挑战赛,据说每周一赛,持续半年,前三名有奖金。听起来挺不错的,就在这两天,第一期开始了。话说三道题给两天的时间果然不是那么简单的……
QQ截图20160904194149.png


关键字:百度杯 CTF Writeup 9月第一周赛
比赛网址:http://www.ichunqiu.com/racing/ctf_54791?from=banner2
i春秋ID@ohlinge


0x01 Upload

解题思路
       随意上传一个图片,burpsuit看到返回有路径信息;直接写出一个php的一句话木马:
111.png

       发现上传不了php文件后缀,再测试下php3/php4/php5也是禁止上传,各种大小写平凑也是不行,看来不好突破呀!上网查查,还有包括phtml也可在php容器下执行,但是然并卵,还是禁止的。试了下.p3等无意义后缀,发现可以上传,确定为黑名单。再找了下,貌似pht也可以执行,抱着试一试的态度试了一下,成功上传!

       新的问题出现了。(<?)和(php)这两个关键字符会被过滤掉,这下好了,貌似不行了。后来想到seay的书上讲到<script language=”php”>也是可以的执行php代码的。试了下,看到language里面的php又被过滤掉了,改成PHP可以了。上传成功,一句话菜刀链接之,然而我过狗菜刀也是not allow,想想主办方也不会让你拿到shell吧!

       既然根目录下面有flag.php,那么直接使用文件包含不就得了?
222.png
       然后请求方式设为:/u/1.pht?id=php://filter/convert.base64-encode/resource=../flag.php
       利用php伪协议读取到原本看不到flag的flag.php的源码:
3333.png
       解密得到flag.php源码,成功拿到flag:
444.png


0x02 Code

解题思路
       这个题的官方提示就两个字,可以想象,脑洞估计不是一般的大!在做完上一道后的好长时间内,都没有做出来这道,题,卡在了index.php源码里面的config.php.想象着flag就在config.php里面……然而并没有卵用!后来听说是上次Xnuca WEB 赛前指导的一道原题,去看了下解题思路。思路大概是一样的,变化不大。

       首先是index.php?jpg=hei.jpg,可以知道是一个文件包含,于是包含了index.php:

555.png

       把后面的base64解密出来得到index.php源码
666.png

       起初就卡在了config.php哪里,以为饶过了就可以了,但是这个是绕不过的。其实是该考虑到phpstorm软件会产生./idea 文件夹,然后访问 .idea/workspace.xml 得到这个xml文件

       看到除了index.php/config.php之外,还有一个fl3g_ichuqiu.php文件,然后直接访问这个文件,Burpsuit截断,看到cookie里面多了一个user字段,一个base64加密的字段。同时,为了搞清楚fl3g_ichuqiu.php文件源码,需要用到上面的文件包含。这里注意“_”会被源码里面的正则过滤掉,而config哪里刚好可以补上,所以访问链接为:index.php?jpg=fl3gconfigichuqiu.php 。同样解密后得到源码:

777.png

       可以看到cookie user字段解密结果为system的时候,可以echo出flag。这里用之前写出来的一个php脚本来计算出16种不同的base64加密值,然后用Burpsuit Intruder暴力枚举。脚本poc如下:

function ss($txt,$m){
  for($i=0;$i<strlen($m);$i++){ 
     $tmp .= chr(ord($m[$i])+10);
  }
  $m=$tmp;
  $tmp='';
  $txt=base64_decode($txt);
  $rnd = substr($txt,0,4);
  $txt = substr($txt,4);
  for($i=0;$i<strlen($txt);$i++){
     $key .= $txt[$i] ^ $m[$i];
  }
  $s='0123456789abcdef';
  $txt1='system';
  for($i=0;$i<strlen($txt1);$i++){
    $tmp .= chr(ord($txt1[$i])+10);
  }
  $txt1=$tmp;
  $tmp='';
  for($i=0;$i<16;$i++){
     $tmp = $key.$s[$i];
     for($ii=0;$ii<strlen($txt1);$ii++){
       $txt2 .= $txt1[$ii] ^ $tmp[$ii];
     }
     file_put_contents('1.txt',base64_encode($rnd.$txt2)."\r\n",FILE_APPEND); 
     $txt2='';
   }
}

ss('eldUVRdOWRhI','guest'); 

       ss第一个参数为guest用户的加密user字段,即下图;
888.png

       然后在本地PHP环境下执行,得到1.txt,带入Burpsuit枚举最终获取flag:

999.png


0x03 YeserCMS

解题思路:
       一个没有听说过的cms,估计也就是伪装的CMS系统。后来看到了评论框,知道了是cmseasy
001.png
       于是在网上找了些cmseasy的相关漏洞,验证了几个后最后发现这个是可以用的:/celive/live/header.php 存在的注入漏洞,POST提交注入字符,得到了管理员账号及密码hash,账号:admin,解密后的密码为Yeser231
成功进入后台!

       接下来,尝试了网上已经爆出的各种easycms后台Getshell种种的……最终都以失败告终。最后在模板编辑那里:/index.php?case=template&act=fetch&admin_dir=admin&site=default
提交post数据id变量存在文件包含成功包含到根目录下的flag.php文件内容:
002.png