Code
题目内容:
考脑洞,你能过么?
加载进页面只有一个图片,检查url发现大概率是个文件包含。
直接把index.php放到参数后,访问发现存在一个加载错误的图片,查看源代码会发现是Base64编码的链接。
解码过后会发现是index.php的代码,然后进行代码审计。
其中的正则是将file中的非a-zA-Z0-9都变成空,然后将config匹配为_,然后包含file赋值给txt,最后输出。
这时候我们不知道flag文件在哪,再加上Can you find the flag file?这句话,说明flag可能就藏在哪里。刚才扫目录发现的./idea(.idea文件夹 .idea存放项目的配置信息,包括历史记录,版本控制信息等)等一系列的配置文件,结合代码中的Created by PhpStorm那么flag可能就在idea中,访问/.idea/workspace.xml果然发现了flag文件的名字。
那么结合刚才的代码审计我们可以构造payload:?jpg=
,因为_会被直接过滤掉,而config又会被替换成_。访问过后发现还是一个img标签,src里面包含这个base64编码,解码过后发现还是一个代码审计。
<?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 "╮(╯▽╰)╭";
}
?>
这里是有关加解密的代码,就是当我们访问http://eci-2ze76po4leyst90klq4m.cloudeci1.ichunqiu.com/fl3g_ichuqiu.php``是会在cookie中加上一个
user,这里的user参数是加密过得,就是上面的decrypt函数,如果看不懂可以参考
https://blog.csdn.net/rfrder/article/details/108542365`或者是其他的解题。