SQL注入学习三

来源:互联网 发布:python assert() 编辑:程序博客网 时间:2024/06/05 03:42

前面猜测数据库的数据库名,表名,列名的方法是访问mysql的information_schema数据库,通过联合查询(union)获取信息。
但是,必须使用mysql数据库的root账号才有权限访问information_schema数据库,而且union、order by等语句的执行,也需要root权限。
当注入的系统的数据库使用普通用户进行操作,将导致我们无法访问infromation_schema,无法进行联合查询,此时,又该怎样获取数据库的数据库名、表名和列名等呢?
这篇博客将对此进行讲解。
采用暴力破解的方式,需要使用burp suite。

1. 猜列名

这里用到判断列名是否为空的sql语句

' and column_name is null-- 

sql语句拼接后为:

select firstname, surname from users where id='' and column_name is null-- '

我们可以看到后台数据库会去判断列名为column_name的列是否为空。
这时候,如果column_name列存在,不管是否为空,数据库不会报错,如果column_name列不存在,则数据库会报如下错误:
这里写图片描述
这样,通过使用包含列名的字典文件,进行暴力破解,我们就可以判断,当前表中存在哪些列,当然,结果的好坏,取决于字典的好坏。
下面进行爆破:

首先准备字典文件:

kali中自带一些字典文件。
使用如下命令,搜索名字中含有column的txt文件

find / -name *column*.txt

这里写图片描述
随意选择一个,这里我们选择golismero的文件。查看之后,发现文件中有一些带#号的行,会对我们的注入造成影响:
这里写图片描述
使用如下命令进行过滤,并且重新输出到column.txt文件中:

cat /usr/share/golis.../common-column.txt | grep -v ^# > column.txt

这样我们就得到了列的字典文件。

设置好代理,使用burp suite进行爆破。

将拦截到的请求发送到inturder里,首先clear掉所有的变量,然后选中”column_name”,然后点击add,只将列名作为变量。
这里写图片描述
之后load我们事先准备的字典文件(不进行url编码)。
这里写图片描述
然后start attack
这里写图片描述
会发现,burp suite帮助我们在自动的爆破,查看response能够看到服务器的响应,不存在的列名,服务器均响应unknown column,长度一般在380左右;存在的列名,长度一般在4000左右,我们按照长度降序,就能找到爆破出来的列名。
这里写图片描述

2. 猜当前表表名

有了当前表的列名,我们就可以进一步去猜当前表的表名,原理和猜列名大致一样。
使用如下sql注入命令

' and table_name.user is null-- 

语句拼接之后:

select firstname, surname from users where id='' and table_name.user is null-- '

就是判断表名为table_name的表中列user是否为空,如果table_name 表不存在会报错,存在不报错。按照列名爆破的方式爆破表名。
同样kali中也有现成的表名字典。
这里写图片描述
按照上述方式获取字典,然后用burp suite进行爆破,猜解出表名为:users
这里写图片描述

3. 猜库里其他表

' and (select count(*) from table_name) > 0 -- 

执行之后发现,直接猜解出了数据库名
这里写图片描述
接下来使用burp suite爆破。步骤如上。

4. 列-表的对应关系

知道了表名,就可以猜该表里的列名。

' and users.column_name is null -- 

猜解column_name

5. 猜字段内容

使用

' and user='admin

拼接之后

select firstname, surname from users where id='' or user='admin'

也就是说,只要user等于admin,就会查出结果。没有等于admin的,就没有结果返回。
一些灵活的方法:

' or user like '%a%
原创粉丝点击