一道學習中所遇到的ctf
步驟:
我們點擊題目鏈接,然后在頁面先點擊”雲平台后台管理中心“
然后url后面跟了參數page,題目提示了一個文件包含,我們試試index.php
看到了輸出了ok,應該是進行了當前目錄下的文件讀取,也就造成了文件包含,我們在試試用file讀取windows的固定文件
c:/windows/win.ini
但是現在我們並不知道路徑以及當前目錄下的flag文件的文件名,輸入index.php不能打開文件內容,但是輸出了ok,那么出題者思路應該 是讓我們把index.php打開來審計。既然存在了文件包含,可以成功執行file偽協議,那么我們嘗試一下php偽協議,有一個用法是讀取php文件內容
payload是:?page=php://filter/read=convert.base64-encode/resource=xxx.php,將xxx.php換成index.php
成功執行了此協議,此php協議的用法是將index.php文件讀取並以base64顯示出來,直接拿去base64解碼
解出來還有很多html代碼,但是php的就這一段,首先要讓請求頭里面的x-forwarded-for的值為”127.0.0.1“
那么我們先用burp抓個包並發送到repeater,
發現並沒有x-forwarded-for服務,那么我們加上”x-forwarded-for: 127.0.0.1“,如果成功則返回:
”Welcome My Admin ! Please include me in!“字樣
發現成功回顯,那么我們在看看下面的代碼,先讓if生效,將所需的get參數全部加上,然后看到了preg_replace()函數,就是php中匹配正則表達式的函數,函數里面的參數值分別由三個get參數傳參。
而preg_replace()函數里面的第一個和第二個參數存在一個代碼執行漏洞,第一個參數的值是一個正則表達式,只要這個值等於:/(.*)/e,那么第二個參數就可以進行代碼執行,且第三個參數可以是任意值。
這就是preg_replace的"/e"漏洞
這三個參數可以 通過get請求的參數傳參,因此我們對三個get請求參數的值改成這樣:?pat=/(.*)/e&rep=phpinfo()&sub=ab
成功代碼執行
現在我們讀目錄文件,直接用system()函數
這就知道了隱藏flag的文件的路徑和文件名了,原來整個這么復雜的文件名,猜是肯定猜不到的
接下來直接利用此題的文件包含漏洞讀取文件,可以用file協議加文件的整個路徑,也可以page后面直接跟文件名讀取,txt文件應該可以直接讀出內容,因為剛剛試了page后面跟的文件是對當前目錄下的文件讀取。
成功讀取出flag!
本篇貼子只為記錄學習而寫,總結的思路如果有問題請指明,謝謝各位大佬!