[RoarCTF 2019]Easy Calc


進入題目是一個計算器的功能界面

「RoarCTF 2019」Easy Calc

 

查看源代碼,可以發現是有WAF的,且存在一個calc.php文件

「RoarCTF 2019」Easy Calc

 

「RoarCTF 2019」Easy Calc

 

這里接收一個num參數,可以看到這里創建了一個黑名單列表,然后用正則是去匹配,進行非法參數的過濾。

「RoarCTF 2019」Easy Calc

 

那這題就是要繞過這個過濾和過一個WAF了。先傳入一個?num=1測試一下。

「RoarCTF 2019」Easy Calc

 

傳入字母就會報錯,這里應該是被WAF文件給攔截了。

「RoarCTF 2019」Easy Calc

 

要對這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

 

「RoarCTF 2019」Easy Calc

 

現在我們就對WAF進行了繞過,接下來就是一些常規操作了。

http://node4.buuoj.cn:25591/calc.php? num=var_dump(scandir(chr(47)))

scandir():列出 參數目錄 中的文件和目錄,要不然我們怎么知道flag在哪。

因為過濾了"/"符號,所以我們用chr(47)進行繞過

「RoarCTF 2019」Easy Calc

 

最終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)))

 

「RoarCTF 2019」Easy Calc


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM