SQL注入之SQLMap从入门到放弃

by LauCyun Jan 10,2017 09:24:34 20,723 views

SQLMap 是一个开源的渗透测试工具,可以用来进行自动化检测,利用 SQL 注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

同时它也支持五种注入模式:

  1. 基于布尔的盲注,即可以根据返回页面判断条件真假的注入;
  2. 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;
  3. 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
  4. 联合查询注入,可以使用 union 的情况下的注入;
  5. 堆查询注入,可以同时执行多条语句的执行时的注入。

本文将介绍如何熟练掌握 SQLMap 工具的使用来进行 SQL 注入漏洞的检测。

0x0 SQLMap 的安装

因为 SQLMap 是一款跨平台的工具,但它是基于 Python,所以电脑里要先安装 Python 环境(推荐安装 Python 2.7.*)。

官方网站:http://sqlmap.org/
下载地址:https://github.com/sqlmapproject/sqlmap/zipball/master
演示视频:https://asciinema.org/a/46601
教程:http://www.youtube.com/user/inquisb/videos

对于不知道如何安装 Python 环境的小伙伴,可以参考以下文章:

安装完成后,输入命令python -Vpython --version检查一下其是否安装成功,如图1所示:


图1 Python版本信息

接着先下载 SQLMap 项目,输入如下命令:

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

下载完成后在终端输入命令:python sqlmap.py -h,看是否返回了信息,如图2所示即正常运行。


图2 SQLMap

0x1 常用命令

通过 SQLMap 的 hh 命令你可以看到 SQLMap 里面的各种命令的介绍,下面我将介绍常用的命令。


图3 SQLMap高级帮助信息

至于详细的介绍可以参考:超详细SQLMap使用攻略及技巧分享

1 输出等级 v

v这个命令,在 SQLMap 里可以理解成是一共输出的信息,它的测试等级是非常多的,一共分了七个等级出来,这七个等级在测试的时候会在界面里返回不同的内容。

默认是 1,也可以在命令后指定-v 3就是等级 3 的输出。

0:只显示 Python 的 tracebacks 信息、错误信息 [ERROR] 和关键信息 [CRITICAL];
1:同时显示普通信息 [INFO] 和警告信息 [WARNING];
2:同时显示调试信息 [DEBUG];
3:同时显示注入使用的攻击荷载;
4:同时显示 HTTP 请求;
5:同时显示 HTTP 响应头;
6:同时显示 HTTP 响应体。

推荐大家在初学的时候指定为 3 等级,这样会给出 payload,方便于学习。

2 指定目标 U

使用参数-u–url指定一个 URL 作为目标,该参数后跟一个表示 URL 的字符串,还可以指定端口,如:

python sqlmap.py -u "www.example.com/user.php?id=1"
python sqlmap.py -url "www.example.com/user.php?id=1"

3 列库 dbs

在检测出了存在注入后,就要进行对数据库的列举,命令是--dbs

4 列表 tables

在列出了 Web 程序的库后,要根据这个库来列出表,命令是-D ‘库名’ --tables

5 列出表中字段 columns

得到了库和表之后,可以根据这个库表来列出表里的字段进行数据的读取,命令是-D ‘数据库名字’ -T ‘表的名字’ --columns

这样直接讲命令未免有些枯燥,我用一个 SQL 注入实例来进行讲解。

0x2 实战

实战目标:http://pt.srba.net.cn/rightinfo.php?id=25

首先,使用sqlmap -u进行把你怀疑存在注入的 URL 放进 SQLMap 里让它进行自动化的测试,如图4所示:


图4 指定目标 URL 进行测试

SQLMap 识别后端数据库为“MySQL”是否要继续进行测试,我这里输入了3,意味着提高测试等级为 3 级,测试等级 level 并不是我们前面所说的输出信息等级,后面会详细的讲。


图5 SQLMap 识别数据库后需选择测试等级

后面 SQLMap 开始测试数据库的版本号,并且问我需不需要进行联合字符的注入测试,我这里选了 yes。


图6 SQLMap测试结果

测试完毕后,SQLMap 提示 get 方式的 id 参数存在注入,并且有两种注入方式:基于布尔的盲注(boolean-based blind)和基于时间的注入(AND/OR time-based blind)

最后,得到的信息如下:

URL存在SQL注入,有基于布尔的盲注(boolean-based blind)和基于时间的注入(AND/OR time-based blind)两种。
数据库版本:MySQL >= 5.0.12。
中间件:Microsoft IIS 6.0
服务器版本:Windows 2003 or XP
生产环境:PHP 5.4.45, ASP.NET

获得了注入点之后,就可以进行对数据库的列举,如图7所示:


图7 列举数据库

这里一共列出来 4 个库,查看一下该 Web 程序所使用的数据库名。

使用命令: --current-db


图8 列举当前数据库

得到了这个应用程序使用的是ztbase库,接下来只要针对这个数据库进行操作就可以了。

这里使用的参数是-D DBName tables,其实它是用了字典的方式去尝试暴力列举它的表名。


图9 列举ztbase的数据库表

得出了五个表,接着可以去读取数据库表的内容。

图10  读取数据库表的内容

这个表是的数据比较多的,然后为了方便演示过程就直接对 id 进行读取,从图中可以看到,id 的内容均已被读出来,在这行命令的后面还可以加上--dump将结果保存下来。

其它表就不一一介绍了Raising Hands

另外还有几个常用的命令可以了解一下。

--users 列出所有的用户
--passwords 列出数据库用户账号和密码


图11 列举所有的用户

0x3 SQLMap其他命令

1 --level

刚开始在前面说了,--level算是一共注入测试等级,一共是五级,级别越高,检测的内容也就越多,检测级别大于等于 2 时会检测 cookie 是否有注入,检测级别大于等于 3 时会检测 User-Agent 和 Referer 是否有注入。

推荐使用 3 等级进行测试。

2 --os

--os是检测数据库版本信息的一个命令,但是 SQLMap 默认会自动去检测。

3  *指定注入点

SQLMap 可以区分一个 URL 里面的参数来进行注入点测试,但在遇到了一些做了伪静态的网页就无法自动识别了。

/admin/1/类似于这种,SQLMap 便无法进行注入测试,但它实际上可能是这样的: /admin.php?id=1

它只是把参数隐藏在了 URL 中,对于这种网页,直接在参数后加上一个星号即可。

python sqlmap.py -u "www.example.com/admin/1*"

星号之后,众生平等。

4 POST数据

使用参数:--data

在 URL 后跟上你要提交的 POST 数据,SQLMap 也会去自动测试。

python sqlmap.py -u "http://example.com/admin.php" --data="id=1&name=admin"

5 cookie

使用参数:--cookie

这种方式多半来进行 cookie 的注入检测,设置比较繁琐,也可以像我之前所说的直接设置测试等级为 3,会自动测试是否存在 cookie 注入。

python sqlmap.py -u "http://www.example.com/admin.php" --cookie "customerId=591edabaab5b52292042df8a"

6 从文件载入 HTTP 请求测试

使用参数:-r

可以可以理解抓个包下来,获取 HTTP 请求然后保存在文件里,然后让 SQLMap 自己去解析请求来进行注入测试。

可以从 burp suite 上抓包下来配合 SQLMap 进行联合使用。

7 Google搜索进行测试

使用参数:-g

SQLMap 会自动爬取谷歌上的搜索结果来进行注入,对带有 GET 参数的 URL 进行挨个测试,前提是你能够科学上网。

8 超时延迟

使用参数:--timeout

默认的超时时间是 30 秒,可以使用命令--timeout 31来进行修改,比如修改为 31 秒超时。

9 注入测试的脚本

使用参数:--tamper

SQLMap 是自带了一个脚本库的,内置的脚本库对 payload 进行了混淆,可能有些可以有效的规避防火墙规则。

在 SQLMap 的安装目录 tamper 文件夹内,脚本文件可以自己编写的。

这篇算是个很快速的入门过程,更加详细的内容请期待我针对 SQLMap 这款工具出的达人课内容。

0x4 参考

Tags