espcms代碼審計第一彈


以前的代碼審計都是在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,跟着書上的漏洞復現成功,第一彈結束,第二彈的分析過程就自己分析吧,站在巨人的肩膀上固然會看的很遠,但是更需要自己向上攀登才能到達更遠的地方


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM