【過年了,每天發一篇以前的存貨,一共七篇。】
現代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
0x02 利用方式二,利用社交屬性批量擷取資訊
利用方式二,首先關注你想擷取密碼的人,比如我關注了這四個,分別是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。 比如這個站: http://mooc.sinepharm.com/api/users/1/followings