打開題目鏈接後只有一個滑稽??(那就看看它裏面有啥吧)
想啥呢,是審查源碼啦
可以看到有註釋source.php,訪問後可以看到其源碼
又發現一個hint.php文件,先訪問再說
提示我們flag在ffffllllaaaagggg裏面,此時題目已經完成一半啦
接着看回source.php源碼
可以看到最後的include 是可以動態構造參數的,那應該就是解題關鍵了
不過要經過三個判斷
第一個:檢查一個變量是否爲空
第二個:是否爲字符串
第三個:通過函數來檢查
我們要構造的payload本身就滿足前兩點所以無視
重要是第三點的這個函數
函數作用是分三步檢查傳進來的參數是否滿足白名單:
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
第一步:
只要我們傳的參數是source.php或者hint.php則返回真
如果不滿足繼續往下判斷
第二步:
取傳進參數首次出現?前的部分
再進行白名單判斷
如果還不滿足繼續往下判斷
第三步:
先把傳進的參數做urldecode
接着就和第二步一樣
都不滿足就輸出"you can't see it"並且返回假
要想滿足這些條件那我們傳的參數就只能是這種形式
($_REQUEST 是通過 GET,POST 和 COOKIE 輸入機制來傳遞參數,下面偷懶就用get方式傳值)
http://111.198.29.45:48818/source.php?file=source.php?(payload)
http://111.198.29.45:48818/source.php?file=hint.php?(payload)
上面這種形式就符合函數的第二個判斷
如果閒着無聊也可以滿足第三種,就是雙重url編碼,傳過去的時候會自動解碼一次,再加上函數的一次就會滿足條件
http://111.198.29.45:48818/source.php?file=source.php%253f(%253f就是?的兩次url編碼)
http://111.198.29.45:48818/source.php?file=hint.php%253f
符合條件後include得到得值就變成:
include source.php?(payload)
因爲source.php?(或hint.php?)是固定不能改的,那麼我們能利用的漏洞只有本地文件包含了
(本人技術比較菜也只能想出這種了,如果還有別的方法還望大佬們賜教)
flag文件名也知道了就差路徑不知道,一個一個試可以得到
source.php(或hint.php)?/../../../../../../ffffllllaaaagggg
ok!flag get√
可能會有疑問爲啥include source.php(或hint.php)?/../../../../../../ffffllllaaaagggg能執行成功
看官方對include的定義
因爲我們的參數是有/../../../../../../這樣的路徑所以符合最後一段話如果定義了路徑,就會忽略/前的字符串而去找/../../../../../../ffffllllaaaagggg這個文件
-----------------------------------------------------------------我是分割線--------------------------------------------------------------
看完了覺得不錯就點個贊或者評論下吧,感謝!!!
如果本文哪裏有誤隨時可以提出了,收到會盡快更正的