代碼審計思路 php代碼審計思路

php代碼審計思路,代碼審計思路 。小編來告訴你更多相關信息 。

代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖
程序員寫在文章前:
上周,程序員小星已經和大家分享了在“php框架代碼審計”中自己對兼容模式和path_info模式、命名空間、tp5的正常調用流程等內容的審計思路 。本周我將就“路由動態測試”、“思路總結”、“漏洞來源”、“Nday使用方法”、“擴大攻擊面”五大部分與大家繼續探討,并附上我在研究過程中對CTF比賽的一些小心得 。
(一)路由調用動態調試
1. 如下圖所示,這里會調用一個Middleware類下run()方法來把閉包函數注冊一個中間件 。
代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖
2.繼續回到這個app中,調用一個dispatch()的方法 。
代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖

代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖
3. 這里的call_user_func回調函數,算是ctf比賽中比較經典的一個代碼執行函數,但是因為這里已經把函數寫死了,所以我們也不能使用 。但其實我們可以嘗試使用反序列化的方式,只是這與我們今天分享的內容無關,所以我們暫且跳過,繼續看回resolve() 。
代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖
4. 剛剛我們已經運行到了435行,使用resolve()方法后回調到了這個閉包函數中,所以我們現在又可以回到432行去調用閉包函數中的run()方法 。
代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖

代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖
5.前面進行的部分都是解析,現在才開始我們真正的路由調度,我們從這里直接使用這個exec()方法 。
代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖
6. 像監聽這一類的方法,我們可以選擇忽略不看,直接往主要的調用內容上看,否則恐怕會越調試越偏離 。
代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖
7. 進入一個parseModuleAndClass()方法來解析模塊和類 。
代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖
8. 我們獲取了一個命名空間,通過這命名空間我們就可以去創建一個對象,然后調用他的方法 。從以下這段代碼可以看出:
if (false !== strpos($name, \’\\\\\’))
他會把只要是\’\\\’開頭的部分都當做一個命名空間的開始,但是一般來說,調用的時候是不會去寫\’\\\’,而是去調用這個else,這里解析的就是\’/\’開頭,緊接著把解析后的一組東西(包含命名空間)返回到controller方法當中 。
代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖
9. 用class_exists來判斷這個命名空間下的類是否存在,如果存在,就進去調用Container的 get 方法 。
代碼審計思路 php代碼審計思路

文章插圖
代碼審計思路 php代碼審計思路

文章插圖
比賽心得分享:
1. 這里出現一個Loader.php,他里面有一個include的方法 。在這里,如果你寫入一個惡意文件(后綴不限),其實是可以進行代碼執行的 。不過,此漏洞在高版本的thinkphp中已經被修復了 。但是,以這個框架的復雜度來看,我們還是可以想辦法構造一些poc來調用到這個方法中來進行一些操作 。有時候在一些比賽當中,出題人也會去尋找一些類似這樣的奇奇怪怪方法,然后通過改造,讓你可以訪問,但是我估計大家得通過一些繞圈子的方法后才能繞到這個方法當中 。

推薦閱讀