進入題目是一個計算器的功能界面
查看源代碼,可以發現是有WAF的,且存在一個calc.php文件
這里接收一個num參數,可以看到這里創建了一個黑名單列表,然后用正則是去匹配,進行非法參數的過濾。
那這題就是要繞過這個過濾和過一個WAF了。先傳入一個?num=1測試一下。
傳入字母就會報錯,這里應該是被WAF文件給攔截了。
要對這WAF進行繞過,這里就涉及到一個知識點了。
PHP的字符串解析特性
我們知道PHP將查詢字符串(在URL或正文中)轉換為內部$_GET或的關聯數組$_POST。例如:/?foo=bar變成Array([foo] => “bar”)。值得注意的是,查詢字符串在解析的過程中會將某些字符刪除或用下划線代替。例如,/?%20news[id%00=42會轉換為Array([news_id] => 42)。如果一個IDS/IPS或WAF中有一條規則是當news_id參數的值是一個非數字的值則攔截,那么我們就可以用以下語句繞過:
/news.php?%20news[id%00=42"+AND+1=0–
上述PHP語句的參數%20news[id%00的值將存儲到$_GET[“news_id”]中。
HP需要將所有參數轉換為有效的變量名,因此在解析查詢字符串時,它會做兩件事:
1.刪除空白符
2.將某些字符轉換為下划線(包括空格)
在了解到PHP的字符串解析之后,我們思考一個問題,WAF它不讓num參數傳入字母,所以我們不能讓WAF文件檢測到字母,但是我們又需要傳入字母來構成我們的命令,這種情況下我們該怎么對其進行繞過呢?
繞過方法
因為num不可以傳入字母,但是我們在num參數之前添加一個空格,這樣在PHP的語言特性下會默認刪除這個空格,但是WAF會因為這個空格導致檢測不到num這個參數,最終導致WAF被繞過。
Payload
http://node4.buuoj.cn:25591/calc.php?num=a #被攔截
http://node4.buuoj.cn:25591/calc.php? num=a #繞過WAF
現在我們就對WAF進行了繞過,接下來就是一些常規操作了。
http://node4.buuoj.cn:25591/calc.php? num=var_dump(scandir(chr(47)))
scandir():列出 參數目錄 中的文件和目錄,要不然我們怎么知道flag在哪。
因為過濾了"/"符號,所以我們用chr(47)進行繞過
最終Payload
http://node4.buuoj.cn:25591/calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
