[RoarCTF 2019]Easy Calc

一只本本發表於2024-11-20

開啟是一個計算器

檢視網頁原始碼發現,程式透過呼叫clac.php檔案給num傳參再計算,其中encodeURIComponent函式對計算表示式中的符號進行轉碼。例如表示式為1+1,則返回1%2B1,故url為calc.php?num=1%2B1。另外這裡還提示我們他已經部署了waf,waf會過濾一些非法字元

訪問calc.php發現直接顯示了程式碼,程式碼首先判斷若沒有設定引數num則返回當前檔案原始碼,否則按黑名單過濾字串,最後再返回結果。我們可以利用 PHP的字串解析特性Bypass 。
即利用waf和php對變數的解析差異:假如waf不允許num變數傳遞字母,可以在num前加個空格,這樣waf就找不到num這個變數了,因為現在的變數叫“ num”,而不是“num”。但php在解析的時候,會先把空格給去掉,這樣我們的程式碼還能正常執行,還上傳了非法字元。

由於黑名單中包含了一些尋找路徑的常用字元,所以我們可以選用scandir函式加chr函式查詢路徑,再用var_dump將結果以變數陣列形式輸出,其中chr(47)為/字元,查詢當前目錄。payload為:/calc.php? num=var_dump(scandir(chr(47))),發現有個可疑路徑為f1agg

構建payload讀取f1agg的內容var_dump(file_get_contents("/flagg")):

/calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))

結果為:string(43) "flag{85176371-f832-4e42-8a69-59af8306bc25}"

相關文章