前文一篇渗透测试之SQL注入(一)给大家讲了SQL注入的产生原理,SQL注入的种类和一些防御SQL注入的手段。接下来的篇章呢都是从实例去分析SQL注入。

首先我们先分析一下DVWA靶场low等级的SQL注入。

SHA2 解密sql server_sql后面加个大括号里面放个表名是啥意思

这里有一个user id需要我们填写,那我们先填写一个1看看会发生什么。

SHA2 解密sql server_sql查看所有表_02

这里查询到了user id为1号的信息,还记得我们前文说的验证SQL注入的方法吧,在1后面加个单引号,那我们输入1‘在试一试。

可以看到我们输入1'导致SQL语句不能正常解析最终导致程序报错

SHA2 解密sql server_sql 注入不能做到_03

那我们初步判断这里是存在注入点的,那么我们可以去查看一下源代码来分析分析。

SHA2 解密sql server_sql 注入不能做到_04

可以看到这里的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语句种#是注释的意思

SHA2 解密sql server_sql 如何md5_05

输入后可以看到爆出我们的当前数据库名字

在知道一条数据后我们就可以通过如下语句进行查询

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"#

SHA2 解密sql server_SHA2 解密sql server_06

有看到users表,users里面一般存放的是用户的信息,所以我们再爆一下users表下面的列名信息

1' union select 1,column_name from information_schema.columns where table_name='users'#

SHA2 解密sql server_SHA2 解密sql server_07

这里可以看到一些user、password字段估计就是存放用户和用户密码了,那我们再查看一下这些字段里面的内容。

1' union select 1,concat(user,password) from users#

SHA2 解密sql server_sql后面加个大括号里面放个表名是啥意思_08

这里就爆出了账号和密码的MD5值,然后我们可以把MD5值解密就可以查看到用户密码了

SHA2 解密sql server_sql 注入不能做到_09

这一般就是SQL注入的一般步骤了,当然这只是SQL注入的一小部分,还有一些高级注入技巧会在后续文章写出。