1. 程式人生 > 遊戲 >火速跟風!萬代推出降臨上海的實物大自由高達版鋼普拉

火速跟風!萬代推出降臨上海的實物大自由高達版鋼普拉

開啟環境,只看到:flag在哪裡呢?
檢視原始碼也沒有發現任何有用的內容,直接用工具掃看看,用dirsearch掃完還是沒發現。這時想到有沒有可能存在原始碼洩露。
用GitHack試一下,結果真的存在git洩露,並得到一個index.php:

<?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__); ?>

分析程式碼,包含了flag.php,輸出:flag在哪裡呢? 就是現在的頁面。接著GET方式傳入exp引數。
* 第一個if是個正則匹配(preg_match() 函式是用來匹配的,如果存在就返回真),過濾了 data/filter/php/phar偽協議,不能以偽協議直接讀取檔案。

* 第二個if是要求我們有一個’;‘(preg_replace 函式執行一個正則表示式的搜尋和替換)(?R)引用當前表示式,後面加了?遞迴呼叫。只能匹配通過無引數的函式。 就是隻允許:a(b(c())); a();這種格式。
有關遞迴參考:https://blog.csdn.net/technofiend/article/details/49906755

   第三個if過濾了一些關鍵字

這樣一來,失去了引數,我們進行RCE的難度則會大幅上升。既然getshell基本不可能,那麼考慮讀原始碼。看原始碼,flag應該就在flag.php。我們想辦法讀取,首先需要得到當前目錄下的檔案。
scandir()函式可以掃描當前目錄下的檔案 但是scandir函式要有一個引數呀,這裡就有一個localeconv函數了。
localeconv() 函式是用來返回一包含本地數字及貨幣格式資訊的陣列。 但返回的結果為陣列型別,就用current()函式 返回陣列中的當前單元, 預設取第一個值。 每個陣列中都有一個內部的指標指向它的"當前"元素,初始指向插入到陣列中的第一個元素。
pos()函式是current()函式的別名。
array_reverse()函式以相反的元素順序返回陣列。 next() 函式將內部指標指向陣列中的下一個元素,並輸出。
最後用 show_source()、 highlight_file()、readfile()三個中的一個函式將結果列印到螢幕。

先構造:?exp=print_r(scandir(current(localeconv())));
在這裡插入圖片描述

會發現當前目錄下的flag.php排在倒數第二個位置.這裡我們有next函式可以輸出陣列中內建指標加’1’指向的位置.可是我們無法通過3個next函式得到flag.php因為next函式它的返回型別並不是一個數組.所以換個思路,先將陣列倒轉過來,然後再通過next函式得到flag.php.接著在對應進行列印輸出.
構造payload:?exp=print_r(array_reverse(scandir(current(localeconv()))));把陣列反過來了:
在這裡插入圖片描述

這樣就可以把陣列反過來了,再加上個next把指標指向下一個,構造:highlight_file(next(array_reverse(scandir(current(localeconv())))));
得到答案。