攻防世界【favorite_number】解题方法
攻防世界【favorite_number】解題方法
1. 簡單分析
進入場景,直接給出了php源碼
2. php數組下標溢出
第一層繞過:繞過數組的比較
-
php中使用$_POST["stuff"]接收數組,post請求中需要使用stuff[0]=admin&stuff[1]=user進行傳遞
-
為了繞過$stuff[0] != 'admin',利用數組key溢出,把key設置為2^32,即4294967296
stuff[4294967296]=admin&stuff[1]=user&num=123
構造payload如下
3. 多行匹配
繞過第二層:正則匹配數字
正則表達式 "/^\d+$/im"的意思是匹配一串數字,不能有其它字符,但是/m是多行匹配,即只要有一行匹配成功,preg_match返回true
換行符的ascii碼為0x0a,所以構造如下payload
4. 獲取目錄結構
繞過第三層:繞過過濾敏感關鍵字
php中有system函數,但是卻把cat、flag等關鍵字過濾掉了
所以為了獲取flag,需要先找到flag所在的位置
通過用&&(ascii碼為0x26)符號連接多條指令,獲取目錄結構
最終可以獲取目錄結構如下
5. 獲取文件類型
從前面可以知道,根目錄下有一個名為flag的文件或者目錄,通過指令
ls -l /獲取詳細文件內容如下
6. 獲取flag的inode號
由第一個字符是-可知flag是一個文件,現在只剩下一個問題,如何在不使用cat、flag關鍵字的情況下讀取flag文件的內容
linux每個文件都有一個inode信息,inode結構用于指向一個文件,可以通過find加-inum參數:按照 inode 號搜索文件
首先獲取flag文件的inode號
7. tac顯示文件內容
最后再使用tac指令顯示flag文件的內容(tac功能同cat,唯一的區別是以行為單位倒序打印文件內容)
其中需要使用開單引號括起來find的結果
另一種方式
思路:把/flag關鍵字寫入到一個文件中,用tac讀出來,再以字符串作為tac的參數
cd /tmp printf /fla > test printf g >> test tac `tac test`注意:
- 需要切換到tmp目錄下,別的目錄有些沒有創建文件的權限
- echo被過濾掉了,可以使用printf
總結
以上是生活随笔為你收集整理的攻防世界【favorite_number】解题方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OC中block的理解
- 下一篇: 【报告分享】2021年春节档电影报告-艺