以前的代碼審計都是在CTF比賽題里面進行對於某一段代碼的審計,對於后端php整體代碼和后端整體架構了解的卻很少,所以有空我都會學習php的代碼審計,以提高自己
環境就直接用的是phpstudy,學習的前期對於環境的搭建以能夠滿足我們學習的需求即可,沒有必要將每個組件分開安裝,反而本末倒置了。
使用的代碼審計工具是 Seay源代碼審計系統
同時參考書籍也是尹毅的 《代碼審計-企業級web代碼安全架構 》
作者的博客:
https://seay.me/
espcms是2014版本的。
我們使用seay代碼審計工具
常見的代碼審計思路有以下四種:
1,根據敏感關鍵詞回溯參數傳遞過程
2,查找可控變量,正向追蹤變兩個傳遞過程
3,尋找敏感功能點,通讀功能點代碼
4,直接通讀全文代碼
espcms的代碼審計,我們跟書中一樣,使用對於敏感函數回溯參數過程。
先按照書上審計的過程走一遍,我們再自己根據敏感函數尋找一些漏洞
我們找到
22條提示我們可能存在sql注入漏洞,繼而我們點擊該條
可以看到這里將我們傳入的$parentid代入$sql語句中進行查詢,而$parentid變量的值是在oncitylist()函數里面沒有進行設么過濾,傳參過來的函是accept()
這里僅對$parentid變量進行了是否為空的檢測。
右鍵定位accept()函數
可以看到accept函數里面的內容
在這個位置對於輸入的$k進行了daddslashes函數,daddslashes函數實際上是包裝之后的addslashes函數
即對於我們輸入的parentid參數輸入的單引號等預定義字符進行過濾,不過之前的$sql語句里面我們發現
我們可以可以發現對於$parentid參數沒有單引號進行閉合,所以 daddslashes 實際上沒有起到任何作用。
如果這個語句寫成下邊這種情況:
$sql = "select * from $db_table where parentid='$parentid'";
同時還是像之前一樣使用了addslashes()函數,那么除非有寬字節注入或者其他的特殊情況,不然我們就不能進行注入了。
我們發現這里有注入之后,可以看到該函數在important這個類里面
於是我們全局變量搜索出現了important類的位置,重點關注的是new 了important類的地方
可以看到在adminsoft/index.php這個頁面new 了important這個類
點擊之后可以看到在index.php頁面$archive和$action這兩個變量都有默認的值,我們在本地搭建的網站不輸入參數直接訪問就可以看到(當然在代碼的邏輯里面也可以很清楚看出)
可以看到當我們沒有任何參數輸入的時候,archive=adminuser&action=login
但是實際上我們是想
調用important類里面的oncitylist函數,同時傳遞一個parentid的值。
在這里傳入的$action與’on’字符串進行連接,組合成為新的$action,所以我們傳入的$action=citylist,這里我們令$archive也為citylist,本來覺得archive為何值不重要,不過用其他array組里面的值就會報錯,應該是代碼里面其他地方做了限制。
因為是在admin的界面下進行的注入,所以我們需要先登錄,再在url輸入我們構造的payload
現在可以看到已經出現了citylist
不過我們的目的是傳遞parentid參數,
因為我們訪問成功之后實際上已經調用了important類里面的oncitylist方法,不過因為我們沒有主動傳遞parentid的值,所以其默認為1而已。
於是我們手動使用get方法傳遞parentid的值
構造payload之后,我們可以看到現在返回頁面的citylist只剩下了北京,根據我們之前的分析,此處parentid存在不需要單引號閉合的sql注入漏洞,於是我們開始常規注入
字段數為5
回顯位置: 3
在3的位置查詢數據庫名字和用戶名
OK,跟着書上的漏洞復現成功,第一彈結束,第二彈的分析過程就自己分析吧,站在巨人的肩膀上固然會看的很遠,但是更需要自己向上攀登才能到達更遠的地方