题目链接:https://www.ichunqiu.com/battalion?t=1&r=0 50分值的code感觉分少了, 打开题目链接 ~

首页有两个值得注意的点,第一个就是那个图片了,第二个就是链接的那个参数。对于图片很容易误导进入杂项图片隐写的坑,不过好在题目分类是web,就不用过多考虑图片的问题了;第二个点很像任意文件读取,尝试读取一下index.php
确实是能读取到的,不过经过了base64编码,解码得到代码
整个代码大意就是文件名只能含有字母数字和. 并且config字符串会被下划线替代
下方红框说明目前为止我们的思路是没有问题的,接下来就是要继续寻找相关线索;注意到第一条”created by phpstorm“通过搜索引擎搜索了下相关安全问题,得到相关文件泄露问题,参考链接; 使用phpstorm新建项目时,会生成一个.idea文件夹,这个文件夹有一个workspace.xml,访问可以得到一些信息。
访问之后,得到了几个相关的php链接,看到这几个链接之后,之前index.php的用意就明了了,flag肯定是存在于fl3g_ichuqiu.php上的,而index又要求文件名只能有字母数字,那么下划线怎么办,哈哈哈哈,index自然已经帮我们想好了用config替换即可,通过任意文件读取访问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 "╮(╯▽╰)╭";
}
?>

1)将用户的cookie,和变量key传入decrypt这个函数,看一下这个函数的作用 
将传入的文本进行base64解码,赋给变量txt 
将base64编码后的文本的前4位赋给变量rnd 
将变量4位以后的内容赋给变量txt 
将得到的变量rnd和传入的变量key进行md5加密,然后赋值给变量key 
令变量s的值为0 
对新txt的内容进行如下操作: 
将内容以32个字节为度进行划分 
txt内容与key相应位置进行异或运算,然后拼接,最终赋值给变量tmp 
将tmp变量的每个字节转化为ascii,-10,再转为字符然后拼接,赋值给变量tmp1 
最终返回tmp1 
2)将传回的值赋值给变量username 
3)如果变量username=system,则输出flag 
4)否则,先将guest和变量key传入encrypt这个函数,看一下这个函数的作用 
首先将传入的文本内容转为ascii然后+10,再转为字符,将加密后的文本赋值给tmp变量 
将变量tmp的值赋给变量txt 
变量rnd=随机输出的4个数 
将得到的变量rnd和传入的变量key进行md5加密,然后赋值给变量key 
令变量s的值为0 
对新txt的内容进行如下操作: 
将内容以32个字节为度进行划分 
txt内容与key相应位置进行异或运算,然后拼接,最终赋值给变量ttmp 
最后把rnd和ttmp拼接,返回base64加密后的内容
所以说,我们现在是需要得到变量key和变量rnd,如何得到呢,可以通过guest得到,首先获取到guest对应的cookie值 V1hrNEQbWE5P

我们根据他的加密方式写出php来进行爆破

<?php
    $txt1 = 'guest';
    for ($i = 0; $i < strlen($txt1); $i++) {
        $txt1[$i] = chr(ord($txt1[$i])+10);
    }
    $cookie_guest = 'V1hrNEQbWE5P'; 
    $cookie_guest = base64_decode($cookie_guest);
    $rnd = substr($cookie_guest,0,4); 
    $temp = substr($cookie_guest,4);
    $key='';
    for ($i = 0; $i < strlen($txt1); $i++) {
        $key .= ($txt1[$i] ^ $temp[$i]);//$key=md5($rnd.$key);
    }
 
    $txt2 = 'system';
    for ($i = 0; $i < strlen($txt2); $i++) {
        $txt2[$i] = chr(ord($txt2[$i])+10);
    }
 
    $md5 = '0123456789abcdef';
    for ($i = 0; $i < strlen($md5); $i++) {
        $key_new = $key.$md5[$i];
        $cookie_system='';
        for ($j = 0; $j < strlen($txt2); $j++) {
            $cookie_system .= ($key_new[$j] ^ $txt2[$j]);
        }
        $cookie_system = base64_encode($rnd.$cookie_system);
        echo $cookie_system."</br>";
    }  
?>

运行得到结果

将结果通过burpsuite的intruder模块进行爆破得到结果,flag{f2998fb5-134c-498b-bb8e-2e6b365a8077}

总结,这道题真的是考知识面呀。文件读取,文件泄露,代码审计,爆破~~~~~真是有意思