第1章:SQLMap基本使用——命令行参数解析、目标URL指定方式、基础检测命令(-u)、检测结果解读

大家好,我是老周。做渗透测试这些年,SQL注入一直是我最常碰到的漏洞类型。而SQLMap,说白了就是我的“瑞士军刀”。今天咱们就从最基础的东西开始聊——怎么用SQLMap去检测一个目标。

嗯,先别急着敲命令。我见过太多新手上来就sqlmap -u http://xxx一顿操作,结果要么报错,要么跑半天没结果。其实,搞清楚几个核心参数,你就能少走很多弯路。

1.1 SQLMap命令行参数解析

SQLMap的参数很多,但常用的其实就十几个。我个人习惯把它们分成三类:目标指定、请求配置、检测控制。你想想看,就像你去医院体检,总得先告诉医生你是谁、有什么症状,然后医生才会安排对应的检查项目。

参数分类 常用参数 作用说明
目标指定 -u--url 指定目标URL,最基础的方式
请求配置 --data--cookie--headers 模拟POST请求、携带Cookie、自定义请求头
检测控制 --level--risk--threads 控制检测深度、风险等级、并发线程数
输出控制 -v--batch--flush-session 控制输出详细程度、自动应答、清除缓存
我的小习惯:每次测试前,我都会先加一个--batch参数。为什么?因为SQLMap默认会问你一堆问题,比如“检测到疑似注入,是否继续?”、“是否使用默认的payload?”等等。加上--batch后,它会自动选择默认选项,省得你一直盯着屏幕按回车。

1.2 目标URL指定方式

指定目标URL,最直接的方式就是-u参数。但这里有个坑——URL的格式必须正确。我曾经见过有人把http://example.com?id=1写成了http://example.com?id=1(少了个问号),结果SQLMap直接报错说“无效的URL”。

正确的格式是这样的:

# 基础GET请求
sqlmap -u "http://example.com/page.php?id=1"

# 带多个参数的GET请求
sqlmap -u "http://example.com/search.php?q=keyword&page=1"

# POST请求(需要配合--data参数)
sqlmap -u "http://example.com/login.php" --data "username=admin&password=123"

嗯,这里要注意:URL最好用双引号括起来。尤其是在Linux终端里,如果不加引号,&符号会被shell解释为后台运行命令,那结果就完全不对了。

避坑指南:我曾经在Windows的CMD里测试,忘了加引号,结果&符号被当成了命令分隔符,SQLMap只识别了前半段URL,跑了半天告诉我“目标不可达”。后来排查了半小时才发现是这个问题。所以,养成加引号的好习惯

1.3 基础检测命令(-u)

好了,现在咱们来跑第一个真正的检测命令。假设目标是一个新闻网站,URL是http://news.example.com/article.php?id=5。我们想看看这个id参数是否存在SQL注入漏洞。

sqlmap -u "http://news.example.com/article.php?id=5" --batch

这条命令执行后,SQLMap会做以下几件事:

  1. 检测目标是否可达——先发一个正常的请求,看看服务器有没有响应。
  2. 识别注入点——在id=5后面尝试各种payload,比如id=5'id=5"id=5 AND 1=1等。
  3. 判断注入类型——是布尔盲注?时间盲注?还是报错注入?
  4. 提取数据库信息——如果确认存在注入,它会尝试获取数据库名称、版本、表名等。

你可能会问:“为什么它要试这么多payload?” 说白了,每个网站的后端代码不一样,有的过滤了单引号,有的过滤了关键字,SQLMap就是在用各种姿势试探服务器的“底线”。

1.4 检测结果解读

跑完命令后,你会看到一堆输出。很多新手看到满屏的英文就慌了,其实核心信息就那么几行。我教你快速定位关键内容:

输出内容 含义 我的解读
Parameter: id (GET) seems injectable 参数id存在注入可能 恭喜,找到漏洞点了!
Type: boolean-based blind 注入类型:布尔盲注 说明服务器不会直接报错,但页面内容会变化
Type: time-based blind 注入类型:时间盲注 说明页面内容不变,但响应时间会变化
Type: error-based 注入类型:报错注入 说明服务器会返回数据库错误信息,最容易利用
web server operating system: Linux 目标操作系统 Linux还是Windows,后续利用方式不同
web application technology: Apache, PHP 7.3 目标Web技术栈 Apache+PHP,还是Nginx+Python?
back-end DBMS: MySQL >= 5.0 后端数据库类型及版本 MySQL 5.0以上,意味着可以获取information_schema
重点:如果看到Parameter: xxx seems injectable,说明SQLMap认为这个参数存在注入。但注意,它说的是“seems”(似乎),不是100%确定。我遇到过几次误报的情况,比如参数本身是数字型,但SQLMap的payload恰好触发了其他逻辑。所以,人工验证一下总是没错的

举个例子,有一次我检测一个电商网站,SQLMap报告id参数存在布尔盲注。但我手动测试时发现,id=1 AND 1=1id=1 AND 1=2返回的页面确实不一样。嗯,这就确认了。但如果页面没变化,那可能就是误报,需要调整--level--risk参数再试。

1.5 核心逻辑流程图

下面这张图,是我自己总结的SQLMap检测流程。你看一遍,基本就能理解它背后是怎么工作的了。

SQLMap 基础检测核心流程 1. 目标指定(-u) 2. 发送HTTP请求 3. 注入点检测 是否可注入? 4. 提取数据库信息 (库名、表名、字段) 4. 报告未发现注入 (尝试调整参数重试) 输出检测结果:注入类型、数据库版本、操作系统等

这张图其实就概括了SQLMap最核心的工作逻辑。你记住这个流程,后面学高级用法时就不会迷路。

1.6 实战小贴士

最后,分享几个我实战中总结的经验:

  • 第一次检测别急着加--level=5。level越高,检测的payload越多,时间也越长。我一般先用默认level(1)快速扫一遍,确认有注入后再加level深入。
  • 注意目标网站的响应速度。如果网站本身就很慢,时间盲注的检测会非常耗时。这时候可以加--time-sec=2把延时阈值设低一点。
  • 保存会话文件。用--flush-session可以清除缓存,但如果你在同一个目标上反复测试,建议不要加这个参数。SQLMap会把之前的结果存下来,下次检测时直接复用,能省不少时间。
我的习惯:每次检测前,我都会先手动访问一下目标URL,确认参数是正常工作的。有时候网站做了WAF(Web应用防火墙),直接发SQLMap的请求会被拦截。手动访问一下,至少能确认网络是通的。

好了,关于SQLMap的基本使用,咱们就聊到这儿。记住:-u指定目标,--batch省去交互,看懂输出结果,这三步走完,你就能判断一个网站是否存在SQL注入漏洞了。下一章,咱们会深入聊聊如何用--data--cookie处理更复杂的请求场景。


公众号:蓝海资料掘金营,微信deep3321