前文一篇渗透测试之SQL注入(一)给大家讲了SQL注入的产生原理,SQL注入的种类和一些防御SQL注入的手段。接下来的篇章呢都是从实例去分析SQL注入。
首先我们先分析一下DVWA靶场low等级的SQL注入。
这里有一个user id需要我们填写,那我们先填写一个1看看会发生什么。
这里查询到了user id为1号的信息,还记得我们前文说的验证SQL注入的方法吧,在1后面加个单引号,那我们输入1‘在试一试。
可以看到我们输入1'导致SQL语句不能正常解析最终导致程序报错
那我们初步判断这里是存在注入点的,那么我们可以去查看一下源代码来分析分析。
可以看到这里的SQL语句,然后可以看到后文代码没有对我们的id参数进行任何的过滤处理,这里就满足了我们的注入要求,有可控变量id且没有做任何过滤,语句被带入到数据库进行查询。知道了此处存在SQL
注入,那么我们该如何进行利用呢。
以下以MYSQL数据库为例子
首先呢在学习SQL注入之前我们需要知道的几个函数
database():当前网站使用的数据库
version():当前MYSQL使用的版本
user():当前MYSQL的用户
当我们不知道任何条件时,我们就要如下查询
select 要查询的字段名 from 库名.表名
那再根据我们看到的SQL语句,这里我们就可以利用一下联合查询
1' union select 1,database()#
这里有几个需要注意的地方
1.我们的1后面需要单引号进行闭合
2.运用union select联合查询我们后面所要查询的字段个数要和之前一致,这里有两个字段,一个是1,还一个是database()
3.最后一个注意点就是最后我们要用#注释掉后面的内容,因为在MYSQL语句种#是注释的意思
输入后可以看到爆出我们的当前数据库名字
在知道一条数据后我们就可以通过如下语句进行查询
select 要查询的字段名 from 库名.表名 where 已知条件字段名字=已知条件的值
又因为mysql 5.0以上版本自带数据库,information_schema记录有当前mysql下所有数据库名,表名,列名信息。下列是存放各信息的名字
information_schema.schemata:记录数据库信息的表
information_schema.tables:记录表名信息的表
information_schema.columns:记录列名信息的表
schema_name 数据库名
table_name 表名
column_name 列名
table_schema 数据库名
其中的' . '是为下一级的意思,知道了这些我们就可以构造一下SQL语句
上面我们已经知道了数据库名字为dvwa所以我们就可以爆出dvwa里面的表名
1'union select 1,table_name from information_schema.tables where table_schema="dvwa"#
有看到users表,users里面一般存放的是用户的信息,所以我们再爆一下users表下面的列名信息
1' union select 1,column_name from information_schema.columns where table_name='users'#
这里可以看到一些user、password字段估计就是存放用户和用户密码了,那我们再查看一下这些字段里面的内容。
1' union select 1,concat(user,password) from users#
这里就爆出了账号和密码的MD5值,然后我们可以把MD5值解密就可以查看到用户密码了
这一般就是SQL注入的一般步骤了,当然这只是SQL注入的一小部分,还有一些高级注入技巧会在后续文章写出。