這題考查的是: 字符串解析特性+目錄讀取+文件內容讀取
字符串解析特性詳解:PHP字符串解析特性 ($GET/$POST參數繞過)(含例題 buuctf easycalc)_參數解析 繞過-CSDN博客
ascii碼查詢表:ASCII 表 | 菜鳥工具 (jyshare.com)
用到的函數有:
print_r()? ?讀取復雜對象,字符串、數組、對象等
chr()? ? ? ? 將ascii碼值轉換為字符
scandir()? 讀取目錄;成功返回文件數組;失敗返回false;目錄必須用引號包裹
file_get_contents()? ? ?將文件內容讀取到字符串中;以二進制流讀取;圖片、字符數據都可用
全是知識盲區啊;又學到了新知識
打開題目發現是一個計算器界面;查看源碼發現設置了waf;具體內容不知道什么情況
通過抓包測試發現了calc.php的一段源碼信息;里面對輸入的一些特殊字符進行了過濾
過濾的字符:空格 ' " \t \r \n ` [ ] $ ^
嘗試輸入num參數進行測試發現只能輸入數字;字母和其他符號都不通過;應該是waf搞的鬼
這里徹底蒙圈了;知識匱乏了;看了大佬的wp發現可以利用字符串解析特性進行繞過
百度了一下php參數的字符串解析特性:1.去掉空白符? 2.將某些字符轉化為下劃線
大佬的文章:PHP字符串解析特性 ($GET/$POST參數繞過)(含例題 buuctf easycalc)_參數解析 繞過-CSDN博客
構造payload:?%20num=phpinfo()
發現成功執行了phpinfo()函數;好了;waf已經繞過了;接下來就是繞過calc.php的過濾操作了
現在不知道flag在哪里;先要讀取一下目錄文件
由于' " 都被過濾了;所以用chr()進行輸入繞過;chr(47)是/
構造payload:print_r(scandir(chr(47)))? ? ? ? ? ?讀取根目錄下的文件信息;然后打印該數組
找到了疑似存放flag的文件名為f1agg
注意:文件名中第二個是數字1;不是l;我在這兒耽擱了好一會兒才發現
構造payload:print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
成功讀取到了flag
10