介绍sqlmap
SQLmap 是一款开源、跨平台的自动化 SQL 注入检测和利用工具,被誉为渗透测试领域的“瑞士军刀”。它由 Python 语言开发,能够极大地简化手动进行 SQL 注入测试的复杂流程,是网络安全从业者进行安全评估和漏洞验证的行业标准工具之一。
🎯 核心功能
SQLmap 的功能非常强大,覆盖了从漏洞发现到利用的完整链条:
- 自动化漏洞检测:能够自动识别并利用多种类型的 SQL 注入漏洞,支持 GET、POST、Cookie、HTTP 头部等多种注入点。
- 数据库指纹识别:自动探测后端数据库的类型和版本,支持 MySQL、Oracle、SQL Server、PostgreSQL、SQLite、Access 等多种主流数据库。
- 数据枚举与提取:可以枚举数据库名、表名、字段名,并直接导出(Dump)表中的敏感数据,如用户名和密码。
- 高级权限利用:在条件允许的情况下,支持获取数据库管理员权限、读取或写入服务器文件,甚至通过
--os-shell参数获取目标操作系统的命令行 Shell。 - WAF 绕过:内置了超过 60 种 Tamper 脚本,可以对注入 Payload 进行混淆和编码,以尝试绕过 Web 应用防火墙(WAF)的防护。
下载
1.本文附安装包
2.官网:https://sqlmap.org/
3.GitHub 仓库下载源码压缩包,解压后即可使用
4.使用 Git 命令克隆项目:git clone https://github.com/sqlmapproject/sqlmap.git
安装sqlmap
一、配置python环境(有就不用)
1) 下载解压 sqlmap 文件,双击 python-3.11.0b1-amd64.exe 启动安装,出现下图所示界面,勾选 “Add_Python 3.11 to PATH”,点击 “Cancel”:
注意,勾选 “Add_Python 3.11 to PATH”,会自动配置环境变量。
2) 右击此电脑,点击 “属性”:
3) 点击 “高级系统设置”:
4) 点击 “环境变量”:
5) 在 “系统变量” 中选择 “Path”,点击“编辑”:
6) 点击 “编辑文本”:
7) 在 “变量值” 后,把自己安装的 python 路径,复制粘贴进去就可以了:
注意:在粘贴路径 “D:\install\python” 时,前面要加上英文输入法下的 “;”。
8) 配置完整,Win + R ,用 cmd 调出命令行,输入 python ,出现版本号及其他信息就安装完成
二、开始”整“sqlmap
(一)在文件夹找到python文件夹
1.上面那个界面既然你已经处于>>>提示符下,直接输入以下代码并回车,即可看到确切的路径:
import sys print(sys.executable)- 解释:这条命令会直接打印出当前正在运行的 Python 解释器文件的完整路径(例如
C:\Users\...\Python310\python.exe)。 - 注意:如果你只想看文件夹路径而不是文件路径,可以输入
print(sys.prefix)。
2.使用命令行where命令(最快捷)
如果你想退回到普通的命令提示符(C:\Users\...>)来查看,可以按以下步骤操作:
- 在当前的
>>>后面输入exit()并回车,或者按Ctrl + Z然后回车,退出 Python 环境。 - 回到黑色窗口的普通命令行模式后,输入以下命令并回车:
where python - 系统会直接列出
python.exe所在的完整路径。
(二)存放sqlmap代码
1.在 python 目录下,新建一个 sqlmap 文件夹:
2.把 sqlmap的这个.zip 文件解压到 sqlmap 文件夹下:
(三)命令行测试
1.在 sqlmap 文件夹中打开控制台(在地址栏输入 cmd 回车):
2.输入命令 python sqlmap.py 或 python sqlmap.py -h ,显示下图所示界面,安装成功
安装好了sqlmap,能怎么使用
既然你已经安装好了 SQLmap,并且之前成功配置了 Python 环境,那么使用它非常简单。SQLmap 是一款命令行工具,没有图形界面,主要通过命令提示符(CMD)来操作。
以下是保姆级的使用教程,带你从启动到完成一次基础的数据库检测。
🛠️ 第一步:如何启动 SQLmap
- 打开命令提示符(CMD)。
- 使用
cd命令进入你解压 SQLmap 的文件夹。
- 例如:
cd D:\Tools\sqlmap(根据你实际安装的路径修改)
- 输入以下命令验证是否启动成功:
如果显示了版本号,说明可以开始使用了。python sqlmap.py --version
🚀 第二步:基础检测命令(GET 请求)
假设你要检测的目标网址是http://example.com/news.php?id=1(注意:请仅对你拥有授权的目标或靶场进行测试)。
1. 检测是否存在注入点
这是最基础的命令,用来判断这个 URL 的参数(这里是id)是否有漏洞。
python sqlmap.py -u "http://example.com/news.php?id=1" --batch-u: 指定目标 URL。--batch:强烈建议新手加上。它的意思是“全程使用默认选项”,避免工具每步都停下来问你 Yes/No。
2. 获取所有数据库名称
如果上一步检测出有漏洞,你可以用这个命令列出网站所有的数据库名:
python sqlmap.py -u "http://example.com/news.php?id=1" --dbs --batch--dbs: 枚举数据库管理系统的所有数据库。
3. 获取指定数据库的表
假设你发现了数据库名叫webapp,想看里面有哪些表:
python sqlmap.py -u "http://example.com/news.php?id=1" -D webapp --tables --batch-D: 指定要操作的数据库名。--tables: 列出该数据库下的所有表。
4. 获取指定表的字段(列)
假设你发现了表名叫users,想看里面有哪些列(如用户名、密码等):
python sqlmap.py -u "http://example.com/news.php?id=1" -D webapp -T users --columns --batch-T: 指定要操作的表名。--columns: 列出字段。
5. 导出数据(Dump)
最后,如果你想把users表里的username和password内容导出来:
python sqlmap.py -u "http://example.com/news.php?id=1" -D webapp -T users -C username,password --dump --batch-C: 指定要导出的列名(多个列用逗号隔开)。--dump: 导出数据内容。
📝 第三步:进阶场景(POST 请求与 Cookie)
并不是所有漏洞都在 URL 链接里,很多在登录框或搜索框(POST 请求)中。
1. POST 请求注入(如登录表单)
如果注入点在 POST 数据中,使用--data参数:
python sqlmap.py -u "http://example.com/login.php" --data="username=admin&password=123" --batch--data: 后面跟的是 POST 提交的数据,格式通常是参数名=参数值。
2. 携带 Cookie 注入
有些网站需要登录才能访问,或者注入点在 Cookie 里(如id=1),你需要加上 Cookie 信息:
python sqlmap.py -u "http://example.com/index.php" --cookie="id=1; session=abc123" --batch- 注意:如果注入点在 Cookie 中,通常还需要加上
--level=2或更高等级,告诉 SQLmap 去检测 Cookie。
⚙️ 第四步:关键参数速查表
为了让你更灵活地使用,这里整理了几个最常用的参数:
| 参数 | 说明 | 示例 |
|---|---|---|
| -u | 指定目标 URL | -u "http://..." |
| --dbs | 获取所有数据库名 | --dbs |
| --tables | 获取表名 | -D 库名 --tables |
| --columns | 获取字段名 | -T 表名 --columns |
| --dump | 导出数据 | -C 字段 --dump |
| --data | 指定 POST 数据 | --data="id=1" |
| --level | 探测等级(1-5,默认1) | --level=3(测Cookie/UA) |
| --risk | 风险等级(1-3,默认1) | --risk=2(增加测试深度) |
| --tamper | 使用脚本绕过 WAF | --tamper=space2comment |
⚠️ 避坑指南与注意事项
- Level 和 Risk 参数:
- 默认情况下,SQLmap 只检测 URL 参数(Level 1)。如果你想检测 Cookie 或 HTTP 头,需要设置
--level=2或3。 - 默认风险等级是 1(最安全)。在 CTF 比赛或深度测试中,可以设为
--risk=2或3,但这可能会对数据库造成更大影响,生产环境慎用。
- 默认情况下,SQLmap 只检测 URL 参数(Level 1)。如果你想检测 Cookie 或 HTTP 头,需要设置
- 网络与代理:
- 如果目标网站有防火墙或速度很慢,可以使用
--delay=1设置请求延迟,或者使用--proxy设置代理。
- 如果目标网站有防火墙或速度很慢,可以使用
- 法律红线:
- 再次强调:SQLmap 是极其强大的攻击工具。请务必在本地搭建的靶场(如 DVWA、sqli-labs)或获得明确书面授权的环境中进行练习。未经授权扫描政府、教育或商业网站属于违法行为。
建议你先在本地搭建一个DVWA或sqli-labs靶场,用上面的命令练练手,熟悉流程后再进行更深入的学习。
面试中可能会问到的关于sqlmap问题
在网络安全相关的面试中,关于 SQLmap 的提问通常旨在考察候选人对 SQL 注入原理的理解、工具的熟练程度以及实战经验。以下是面试中可能会遇到的关于 SQLmap 的常见问题,分为基础、进阶和实战场景三类。
🧐 基础概念与命令
这类问题主要考察你是否真正使用过 SQLmap,以及对基本流程的掌握。
请简述 SQLmap 的工作原理。
- 回答要点:SQLmap 是一个自动化 SQL 注入工具。它通过向目标 URL 的参数、Cookie、POST 数据等位置发送各种精心构造的 SQL 语句(Payload),然后根据服务器的响应(如页面内容变化、响应时间延迟、数据库报错信息)来判断是否存在注入点,并进一步利用漏洞获取数据库信息。
写出几个 SQLmap 最常用的命令参数及其作用。
- 回答要点:这是一个高频问题,你需要能流利说出几个核心参数。
-u: 指定目标 URL。--dbs: 枚举目标数据库服务器上的所有数据库名。--tables: 获取指定数据库中的所有表名。--columns: 获取指定表中的所有字段名。--dump: 导出指定表或字段的数据。--batch: 自动以默认选项运行,避免交互式提问,适合批量或自动化操作。--os-shell: 在满足特定条件时,获取目标操作系统的交互式 Shell。
- 回答要点:这是一个高频问题,你需要能流利说出几个核心参数。
如何对 POST 请求的注入点(如登录框)进行测试?
- 回答要点:主要有两种方式。
- 使用
--data参数,后面跟上 POST 请求的数据体。例如:sqlmap -u "http://example.com/login" --data="username=admin&password=123"。 - 更推荐的方式是使用 Burp Suite 等抓包工具,将完整的 HTTP 请求(包括 Headers、Cookies 和 POST 数据)保存到一个文本文件(如
request.txt)中,然后使用-r参数加载该文件。例如:sqlmap -r request.txt。这种方式更准确,能保留所有请求头信息。
- 使用
- 回答要点:主要有两种方式。
SQLmap 支持哪些 SQL 注入技术?
- 回答要点:SQLmap 支持多种注入技术,可以通过
--technique参数指定。常见的有:- B: Boolean-based blind (布尔盲注)
- E: Error-based (报错注入)
- U: UNION query (联合查询注入)
- S: Stacked queries (堆叠查询注入)
- T: Time-based blind (时间盲注)
- 回答要点:SQLmap 支持多种注入技术,可以通过
⚙️ 进阶原理与技巧
这类问题考察你对工具底层逻辑和高级功能的理解。
--level和--risk参数有什么区别?在什么情况下会调整它们?- 回答要点:
--level(探测等级):范围是 1-5,默认是 1。等级越高,SQLmap 测试的位置越多。Level 1 只测试 URL 参数;Level 2 会额外测试 HTTP Cookie;Level 3 会测试 User-Agent 和 Referer 等 HTTP 头。当怀疑注入点在 Cookie 或其他请求头中时,需要提高 level。--risk(风险等级):范围是 1-3,默认是 1。等级越高,使用的 Payload 越激进,可能对数据库造成更大影响(如进行更多次的查询、尝试更复杂的注入)。在常规测试中保持默认即可,在 CTF 或深度渗透时可能会提高到 2 或 3。
- 回答要点:
SQLmap 的
--os-shell功能是如何实现的?需要满足哪些条件?- 回答要点:这是一个经典的原理性问题。
--os-shell并非直接获取 Shell,其本质是利用 SQL 注入漏洞,在数据库服务器上写入一个 WebShell 文件,然后通过访问这个 WebShell 来执行系统命令。 - 需要满足的条件:
- 数据库用户具有高权限:例如 MySQL 的
root用户,至少需要有FILE权限。 - 知道网站的物理绝对路径:需要知道 Web 目录在哪里,才能把 WebShell 写到能被 Web 服务器访问的位置。
- 数据库配置允许文件写入:例如 MySQL 的
secure_file_priv配置项不能限制文件导出。
- 数据库用户具有高权限:例如 MySQL 的
- 回答要点:这是一个经典的原理性问题。
如何使用 SQLmap 绕过 WAF(Web应用防火墙)?
- 回答要点:SQLmap 提供了多种绕过手段。
--tamper参数:这是最主要的方式。SQLmap 内置了大量的 tamper 脚本,用于对 Payload 进行编码、混淆和替换。例如space2comment(用注释符替换空格)、charunicodeencode(字符编码) 等。--delay参数:设置请求延迟,降低扫描速度,避免触发 WAF 的频率限制。--random-agent参数:随机更换 User-Agent,避免被 WAF 识别为扫描器。- 使用代理 (
--proxy):通过代理 IP 隐藏真实来源。
- 回答要点:SQLmap 提供了多种绕过手段。
SQLmap API 是什么?有什么用途?
- 回答要点:SQLmap API 是一个基于 JSON 的接口服务,允许用户以编程方式(而非命令行)与 SQLmap 进行交互。
- 用途:主要用于将 SQLmap 集成到自动化平台、扫描器或自定义脚本中。通过 API,你可以创建扫描任务、配置参数、启动扫描、获取状态和结果,非常适合批量自动化测试场景。
🎯 实战场景与排错
这类问题考察你解决实际问题的能力。
如果目标网站有登录验证,如何使用 SQLmap 测试登录后的页面?
- 回答要点:核心是带上认证信息。最常用的方法是使用 Burp Suite 抓取一个已登录状态下的完整请求包,保存为
request.txt文件,然后使用sqlmap -r request.txt命令。SQLmap 会自动读取文件中的 Cookie 或其他认证信息。也可以手动指定--cookie参数。
- 回答要点:核心是带上认证信息。最常用的方法是使用 Burp Suite 抓取一个已登录状态下的完整请求包,保存为
扫描过程中,你发现 SQLmap 的 User-Agent 被 WAF 拦截了,你会怎么办?
- 回答要点:
- 使用
--random-agent参数,让 SQLmap 随机使用常见的浏览器 User-Agent。 - 使用
-A参数手动指定一个正常的 User-Agent 字符串。 - 结合
-r参数,使用一个包含正常 User-Agent 的请求文件。
- 使用
- 回答要点:
在什么情况下,你会选择使用
-r参数加载请求文件,而不是-u和--data?- 回答要点:当目标请求比较复杂时,
-r是更优选择。例如:- 请求包含复杂的、自定义的 HTTP 头。
- 注入点可能在某个不常见的 Header 中(如
X-Forwarded-For)。 - POST 数据格式不是简单的
key=value,而是 JSON 或 XML。 - 需要精确复现一个包含 Cookie、Referer 等信息的特定请求。
- 回答要点:当目标请求比较复杂时,
如何对多个 URL 进行批量扫描?
- 回答要点:将所有待测试的 URL 保存到一个文本文件(如
urls.txt)中,每行一个 URL。然后使用-m参数指定该文件。例如:sqlmap -m urls.txt --batch。
- 回答要点:将所有待测试的 URL 保存到一个文本文件(如