提示
- git泄露
- 無參數rce
!!注意需要python3環境
github里dirsearch工具下載位置? ? ?###可能需要開節點才能打開
百度網盤dirsearch下載地址? ? ? ? ? ?###如果github里下載不了可以在網盤下載
提取碼sx5d
只給了flag在哪里呢,那么應該就是要讓信息收集了
對于我來說做ctf web題我有我自己的信息搜集三件套
- 抓包發包查看
- 目錄掃描
- 查看頁面源代碼
這里在目錄掃描的時候發現了git泄露
就像是下面圖片方框里的,直接通過瀏覽器訪問可直接下載,說明存在git泄露
這里我使用的是dirsearch來進行掃描的,每次掃buuctf的題時掃描速度太快他會一直報錯429,就像下圖箭頭指向的一樣,所以無論使用什么工具去掃描都得限速以及限制每次掃描時間
dirsearch? ? -u? ?網站url???-t? ? 每秒掃描多少個? ? ?-s? ? 每隔多少秒掃一次
如果想了解更多可以去看這位博主的博客dirsearch使用教程_dirsearch用法-CSDN博客
這里直接用githack把git泄露的源碼扒下來
現在開始代碼審計
- 首先過濾了偽協議我們不能通過偽協議注入后門了
- 將傳入的字母以及符號替換為空以后如果有;則進入(#這里就已經限定了我們的格式只能是a(b(c()))這樣的格式,如果將這些替換為空了還有其他東西比如“;;這樣的就不匹配;)
- 不能有/et|na|info|dec|bin|hex|oct|pi|log/并且有/i匹配大小寫所以不能大小寫繞過
所以整體作者想要的思路應該是無參數rce
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {// echo $_GET['exp'];@eval($_GET['exp']);}else{die("還差一點哦!");}}else{die("再好好想想!");}}else{die("還想讀flag,臭弟弟!");}
}
// highlight_file(__FILE__);
?>
首先先來了解兩個php函數
getallheaders()
返回所有http頭信息,但是他返回的是數組狀態的信息,然而它返回的信息需要給eval()來處理,但是eval()只能處理字符串類的信息
implode()
所以這里就要用到這個函數了,這個函數可以直接把getallheaders()返回的數組轉換成字符串
這里先使用讀取session的方式來做一次(###拓展###最后補充了一個做法,不過沒有匹配et的話就可以使用)
- 一般php需要啟動session才能使用,啟動session使用函數session_start()
- session是存儲在本地的和cookie同理的東西所以我們對于沒有做防護的sesseion是可控的
- 通過函數session_id()函數來
session_id()?可以用來獲取/設置 當前會話 ID。
為了能夠將會話 ID 很方便的附加到 URL 之后, 你可以使用常量?
SID
?獲取以字符串格式表達的會話名稱和 ID最后通過highlight_file()來高亮顯示文件
最后payload:? highlight_file(session_id(session_start()));
拓展
payload:implode(getallheaders())
發包的同時抓包
這里隨便加一個head頭,他的值用來執行命令,最后加了\\來注釋后面的內容
####有可能php版本不同輸出順序也不同,可以先嘗試是從下至上輸出還是從上至下輸出
這里是從下往上讀的,所以夾\\注釋掉后面讀取的上面的head頭信息