蘋果 iOS 14.7/iPadOS 14.7/macOS Big Sur 11.5/watchOS 7.6 開發者預覽版 Beta 2 推送
阿新 • • 發佈:2021-06-06
點開題目,發現只是一個計算框
檢視一下原始碼
發現了一串程式碼
.ajax是指通過http請求載入遠端資料
輸入的算式會被傳進calc.php檔案中
且提示網頁存在waf(就是防火牆)
訪問cala.php試試
有一串php程式碼
1 <?php 2 error_reporting(0); 3 if(!isset($_GET['num'])){ 4 show_source(__FILE__); 5 }else{ 6 $str = $_GET['num']; 7 $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];8 foreach ($blacklist as $blackitem) { 9 if (preg_match('/' . $blackitem . '/m', $str)) { 10 die("what are you want to do?"); 11 } 12 } 13 eval('echo '.$str.';'); 14 } 15 ?>
其中foreach
語法結構提供了遍歷陣列的簡單方式。foreach
僅能夠應用於陣列和物件,如果嘗試應用於其他資料型別的變數,或者未初始化的變數將發出錯誤資訊。
有兩種語法
foreach (iterable_expression as $value) statement foreach (iterable_expression as $key => $value) statement
這裡順便記一下正則表示式匹配的幾個引數
/i (忽略大小寫) /g (全文查找出現的所有匹配字元) /m (多行查詢) /gi(全文查詢、忽略大小寫) /ig(全文查詢、忽略大小寫)
給num傳數字行
給num傳字母則不行
應該是waf的原因
然後就不會了。。
查了一下,可以利用php的解析規則來繞過
就是當php進行解析的時候,如果變數前有空格,就會刪去空格再進行解析
而前面的黑名單中就沒有考慮到這個狀況
我們就可以在num的前面加個空格來繞過
因為這是我們的變數名就是“ num”而不是“num”了
試試看能不能行
成功繞過了
接下來就是執行命令了
忘記前面過濾掉“/"了
可以使用chr(47)來繞過
chr()就是返回當前整數代表的ascii字元,而chr(47)就是/
成功了
發現了flagg資料夾,猜測flag就在這裡
訪問看看
這個可以用file_get_contents() 函式來讀取
構造payload:? num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)));
成功得到flag