現代cms框架(laraval/symfony/slim)的出現,導致現今的php漏洞出現點、原理、利用方法,發生了一些變化,這個系列希望可以總結一下自己挖掘的此類cms漏洞。
今天這個漏洞是Edusoho的一個user表dump漏洞。
首先,我簡要說明一下漏洞原理。
【漏洞源碼下載: https://mega.nz/#!4chVWCAB!xBVyC9QqxMCmeuLu3rGx__PwgkLe_a5NWUITLS3QzuM 】
0x01 開啟DEBUG模式造成的隱患
Edusoho開啟調試模式以后將會在程序出錯后輸出debug信息,其中包括當前環境中所有變量的值。默認的index.php是不開啟debug的,但/api/index.php將會開啟debug:
跟進一下框架的異常處理方法。Index.php里注冊了異常處理:
ErrorHandler::register(); ExceptionHandler::register();
這里用的是Symfony框架自帶的異常處理類:use Symfony\Component\Debug\ExceptionHandler;
跟進:
調用了set_exception_handler注冊的異常處理方法。不斷跟進,發現該類的getContent方法是輸出錯誤內容的方法:
可見,這個異常類,將異常對象的”args”屬性輸出了。
認真學習過php異常處理類的同學應該知道,異常類的getTrace方法( http://php.net/manual/zh/exception.gettrace.php )是可以獲取到當前上下文中所有變量的。
所以,這里這個debug模式,等於說可以將當前函數中定義的所有變量輸出。那么試想,假設當前函數在出異常前,從數據庫或文件中讀取到了一些『敏感』信息,那么輸出這個異常是不是就可以dump出這個『敏感變量』了呢?
明顯這個猜想是可行的。
那么,我只需要在/api下找到一處出錯的代碼,並且當前函數中有敏感信息的地方,即可觸發成一個『大漏洞』。
很幸運的是我找到了好幾處。最簡單的一處,/api/src/user.php:373
這個$follwers
變量是一個未定義的變量呀,所以一定會觸發錯誤。
正好,當前函數中有$user
、$follwings
兩個變量,$user
變量是指定的用戶,$follwings
是它關注的用戶。
所以,在報錯輸出調試信息以后,將會完全打印出這兩個變量的值。而這兩個變量都是從數據庫user表里取出的數據,其中包含用戶的所有信息(郵箱、密碼hash、交易密碼hash、salt、session、IP地址、昵稱、登錄時間等)。
另外,$follwings
變量里也有這些信息,我只要批量關注所有人,這個漏洞就變成了一個dump數據庫user表的漏洞。
0x02 利用方式一,直接獲取任意用戶user表信息
訪問 http://demo.edusoho.com/api/users/{用戶id}/followings 即可,如 http://demo.edusoho.com/api/users/5/followings
0x03 利用方式二,利用社交屬性批量獲取信息
利用方式二,首先關注你想獲取密碼的人,比如我關注了這四個,分別是Id為1、2、3、4的用戶,其中1、4是管理員:
我的id是15670,直接訪問 http://demo.edusoho.com/api/users/15670/followings ,即可獲取我關注的所有人的所有信息,包括密碼等:
諸如此處的地方還有一個。
http://demo.edusoho.com/api/users/1/friendship?toIds[]=a 通過傳入數組制造warning:
其他位置肯定不止,還可能泄露其他信息,我就不一一挖掘了,只為證明問題存在。
這個漏洞已經私下里報給官方了,所以demo站已經修復。但搜索“powered by edusoho” 還是能找到很多存在漏洞的站,在時間上這個漏洞還是屬於一個0day。
比如這個站: