第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解释为后台运行命令,那结果就完全不对了。
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会做以下几件事:
- 检测目标是否可达——先发一个正常的请求,看看服务器有没有响应。
- 识别注入点——在
id=5后面尝试各种payload,比如id=5'、id=5"、id=5 AND 1=1等。 - 判断注入类型——是布尔盲注?时间盲注?还是报错注入?
- 提取数据库信息——如果确认存在注入,它会尝试获取数据库名称、版本、表名等。
你可能会问:“为什么它要试这么多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=1和id=1 AND 1=2返回的页面确实不一样。嗯,这就确认了。但如果页面没变化,那可能就是误报,需要调整--level或--risk参数再试。
1.5 核心逻辑流程图
下面这张图,是我自己总结的SQLMap检测流程。你看一遍,基本就能理解它背后是怎么工作的了。
这张图其实就概括了SQLMap最核心的工作逻辑。你记住这个流程,后面学高级用法时就不会迷路。
1.6 实战小贴士
最后,分享几个我实战中总结的经验:
- 第一次检测别急着加
--level=5。level越高,检测的payload越多,时间也越长。我一般先用默认level(1)快速扫一遍,确认有注入后再加level深入。 - 注意目标网站的响应速度。如果网站本身就很慢,时间盲注的检测会非常耗时。这时候可以加
--time-sec=2把延时阈值设低一点。 - 保存会话文件。用
--flush-session可以清除缓存,但如果你在同一个目标上反复测试,建议不要加这个参数。SQLMap会把之前的结果存下来,下次检测时直接复用,能省不少时间。
好了,关于SQLMap的基本使用,咱们就聊到这儿。记住:-u指定目标,--batch省去交互,看懂输出结果,这三步走完,你就能判断一个网站是否存在SQL注入漏洞了。下一章,咱们会深入聊聊如何用--data和--cookie处理更复杂的请求场景。
公众号:蓝海资料掘金营,微信deep3321