赞
踩
MySQL数据库是目前应用最广泛的数据库。使用SQLMap如何进行最基础的MySQL数据库注入?
➢了解SQLMap的注入MySQL数据库的原理、主要特点。
➢掌握使用SQLMap进行MySQL数据库的注入。
MySQL本身就是一个大数据库。数据库里面个有种各样的数据,为了方便查找和使用这些数据,我们要把他们分门别类的区分开来分别存放。如果不按照规定划分好会显得很乱。这些数据都要被分类整理,才能摆放的规矩合理,每一堆数据整理到了一起,所以会产生数据表与数据库。
我们创建网站的时候都会现在数据库里创建一个库,使得每一个库的数据都对应着一个网站的数据。创建了这个库,表明了我们接下来操作的数据都要在存放在这个库里,一个数据库就类似于一个储物柜。
MySQL自带四个数据库,分别是information_schema,mysql,performance_schema和test。
information_schema数据库:它提供了访问数据库元数据的方式,元数据就是关于数据的数据。在MySQL中,information_schema保存着关于MySQL服务器所维护的所有其他数据库的信息。稍后我们会对information_schema数据库加以详细的解释说明。
mysql数据库:这个是mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除,如果对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。
performance_schema数据库:mysql 5.5 版本新增了一个性能优化的引擎:
PERFORMANCE_SCHEMA这个功能默认是关闭的,需要设置参数
performance_schema才可以启动该功能,这个参数是静态参数,只能写在my.ini 中,不能动态修改。
test数据库:这个是安装时候创建的一个测试数据库,和它的名字一样,是一个完全的空数据库,没有任何表,可以删除。
我们进行MySQL数据库注入的时候主要使用的就是information_schema数据库。
下面详细解释下information_schema数据库。这个数据库是最常用的系统默认数据库,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
information_schema记录了数据库当中大部分我们需要了结的信息,比如字符集,权限相关,数据库实体对象信息,外检约束,分区,压缩表,表信息,索引信息,参数,优化,锁和事物等等。通过information_schema我们可以窥透整个MySQL实例的运行情况,可以了结MySQL实例的基本信息,甚至优化调优,维护数据库等。
在MySQL中,把information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。
SQL注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
使用SQLMap进行MySQL数据库注入的原理与手工进行SQL注入类似,都是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
MySQL数据库注入,本质上还是SQL注入(SQLInjection)。SQLInjection攻击技术就其本质而言,它利用的工具是SQL的语法,针对的是应用程序开发者编程中的漏洞,当攻击者能操作数据,向应用程序中插入一些SQL语句时,SQL Injection攻击就发生了。SQL注入存在主要由有以下几点。
➢程序员水平和经验的欠缺,对SQL注入不够重视或者没有防范意识。
➢现在许多教程或者模版存在SQL注入漏洞。
➢Internet上给出的许多解决办法并未解决办法。
➢数据库管理员对数据库权限设置不合理。
解析首先是在浏览器中通过改写网站url查找注入点,借此判断是否能够进行SQL注入。有注入点说明存在SQL注入漏洞。其次使用sqlmap判断一下是否存在注入漏洞(主要是看能否返回信息),使用的命令一般是python.exesqlmap/sqlmap.py-u+网站的url。
接下来是使用SQLMap进行SQL注入操作来获取数据库中的各种信息。SQLMap是一个开源的自动化SQL注入工具,我们只需要在命令提示符中输入相对应的命令,点击回车,即可自动执行相关SQL注入操作。获取数据库信息,主要使用的命令包括如下几条:
(1)获取当前库名–current-db
(2)获取该库中的表名-D “数据库名”–tables
(3)获取该库中的列名-D “数据库名”-T “表名”–columns
(4)获取该库中的某个列名的字段内容-D“数据库名”-T “表名”-C “列名” --dump
具体包括例如私自添加系统帐号或者是数据库使用者帐号,修改系统账号或数据库使用者的权限或个人信息等。
登录后台后发布的内容,也可以发布对首页的更新,这时候更新可能就是一些非法信息,也可以对系统进行添加账户或者是数据库账号。这个需要拿到web shell 或者是更高的权限
拿到web shell 或者获取到服务器的权限以后,我们将一些网页木马挂在服务器上,去攻击别人。甚至在严重些我们可以控制整个web服务器,这个都是非常危险的。
下面讲解如何在代码层面防止SQL注入。
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。在magic_quotes_gpc=On的情况下,如果输入的数据有单引号(’)、双引号(”)、反斜线()与NUL(NULL 字符)等字符都会被加上反斜线。这些转义是必须的。如果这个选项为off,那么我们就必须调用addslashes()这个函数来为字符串增加转义。stripslashes() 函数删除由addslashes() 函数添加的反斜杠。
mysql_real_escape_string()是用于过滤查询语句sql字符串中的非法字符的(如:单引号等) mysql_real_escape_string() 函数可以转义SQL 语句中使用的字符串中的特殊字符。如果成功,则该函数返回被转义的字符串。如果失败,则返回false。
采用sql语句预编译和绑定变量,是防御sql注入的最佳方法。
String sql = “select id, no from user where id=?”;
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ps.executeQuery();
如上所示,就是典型的采用sql语句预编译和绑定变量。为什么这样就可以防止sql 注入呢?
其原因就是:采用了PreparedStatement,就会将sql语句:“select id, no from user where id=?” 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如
select ,from ,where ,and, or ,order by 等等。所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些sql命令的执行,必须先得通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。所以sql语句预编译可以防御sql注入。
不是所有场景都能够采用sql语句预编译,有一些场景必须的采用字符串拼接的方式,此时,我们严格检查参数的数据类型,还有可以使用一些安全函数,来方式sql注入。
比如String sql = “select id,no from user where id=” + id;
在接收到用户输入的参数时,我们就严格检查id,只能是int型。复杂情况可以使用正则表达式来判断。这样也是可以防止sql注入的。
安全函数的使用,比如:
MySQLCodec codec = new MySQLCodec(Mode.STANDARD);
name = ESAPI.encoder().encodeForSQL(codec, name);
String sql = “select id,no from user where name=” + name;
ESAPI.encoder().encodeForSQL(codec, name)
该函数会将name 中包含的一些特殊字符进行编码,这样sql 引擎就不会将name中的字符串当成sql命令来进行语法分析了。
注:实际项目中,一般我们都是采用各种的框架,比如ibatis,mybatis,hibernate等等。他们一般也默认就是sql预编译的。对于ibatis/mybatis,如果使用的是#{name}形式的,那么就是sql预编译,使用${name} 就不是sql预编译的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。