第一章:SQLMap基础命令详解

大家好,我是老周。做渗透测试这些年,SQLMap是我最离不开的工具之一。今天咱们就来聊聊它的几个核心参数。说实话,很多人觉得SQLMap就是一条命令跑到底,其实不然。每个参数背后都有讲究,用好了事半功倍,用不好可能连目标都扫不出来。

本章核心知识点:

  • -u 参数:指定目标URL
  • --data 参数:处理POST请求
  • --cookie 参数:维持会话状态
  • --level/--risk 参数:控制检测深度
  • --batch 模式:自动化运行
SQLMap基础命令 核心参数体系 -u 参数 --data --cookie --level/--risk --batch 实战组合应用 五个核心参数 + 实战组合 = 高效SQL注入检测

1. -u 参数:指定目标URL

-u 参数是SQLMap最基础的参数,说白了就是告诉工具「我要测哪个网址」。用法很简单:

sqlmap -u "http://example.com/page?id=1"

我个人习惯在测试前先手动访问一下目标URL,确认参数确实存在且能正常返回数据。为什么?因为我在项目中遇到过好几次,开发把参数名改了但页面没更新,结果SQLMap扫了半天全是无效请求。

小技巧:URL最好用双引号括起来,尤其是当URL包含特殊字符时。比如 &、? 这些符号,不加引号可能会被shell解释掉。

这里有个坑要注意:-u 后面跟的URL必须包含可注入的参数。像 http://example.com/about 这种静态页面,你传给SQLMap它也没法注入。至少得有个 ?id=1 或者 ?page=2 这样的参数。

2. --data 参数:处理POST请求

很多网站用POST方式提交数据,比如登录表单、搜索框。这时候 -u 就不够用了,得用 --data 参数。

sqlmap -u "http://example.com/login" --data "username=admin&password=123"

--data 参数会把数据以POST方式发送。我记得有一次测一个后台管理系统,登录接口就是POST的。当时我直接用 --data 把用户名和密码传进去,SQLMap很快就找到了注入点。

注意:--data 里的参数名和值要跟实际页面保持一致。我曾经见过有人把参数名写错了,结果SQLMap一直在发无效请求,白白浪费了半小时。

另外,如果POST数据里有特殊字符,比如 +、&、% 这些,建议用URL编码。SQLMap虽然会自动处理一部分,但手动编码更保险。

3. --cookie 参数:维持会话状态

很多网站需要登录才能访问,这时候就需要 --cookie 参数了。用法很简单:

sqlmap -u "http://example.com/dashboard?id=1" --cookie "PHPSESSID=abc123; security_level=high"

你想想看,如果不带cookie,SQLMap发出去的请求就跟匿名用户一样,服务器直接返回302重定向到登录页,那还测个啥?

我个人习惯用浏览器开发者工具复制cookie。按F12打开控制台,找到Network标签,随便点一个请求,复制Request Headers里的Cookie字段就行。

避坑指南:我曾经遇到过一个问题——cookie过期了。当时我复制了cookie开始跑,跑了半小时发现所有请求都返回登录页。后来才意识到cookie有有效期,尤其是那些带时间戳的token。所以建议在跑之前先确认cookie是否有效。

4. --level/--risk 参数:控制检测深度

这两个参数是SQLMap的「油门」和「刹车」。--level 控制检测的深度,--risk 控制检测的风险程度。

参数 取值范围 说明
--level 1-5 1级只测GET/POST参数,2级加测Cookie,3级加测User-Agent/Referer,4-5级测更多HTTP头
--risk 1-3 1级用常规payload,2级加时间盲注,3级加OR/AND布尔注入等高危payload

默认情况下,--level=1,--risk=1。这个配置对大多数场景够用了。但如果你怀疑某个参数有注入但SQLMap没扫出来,可以试试提高level。

sqlmap -u "http://example.com/page?id=1" --level=3 --risk=2

嗯,这里要注意:level和risk不是越高越好。我见过有人直接上 --level=5 --risk=3,结果跑了整整一天还没跑完。而且风险高了容易触发WAF,甚至可能对数据库造成影响。

警告:--risk=3 会使用一些可能修改数据的payload,比如 UPDATE、DELETE 语句。在生产环境测试时,建议不要超过 --risk=2。

5. --batch 模式:自动化运行

--batch 参数是懒人福音。加了它之后,SQLMap会使用默认选项自动回答所有交互式问题。

sqlmap -u "http://example.com/page?id=1" --batch

不加 --batch 的时候,SQLMap会问一堆问题:

  • 「检测到参数可能可注入,是否继续?」
  • 「是否尝试其他注入技术?」
  • 「是否使用提供的payload?」

这些问题对新手来说可能一头雾水。加了 --batch 后,SQLMap全选「是」,一路跑到底。

我个人习惯在初步探测时用 --batch,快速看看目标有没有注入点。如果发现了可疑点,再手动去掉 --batch,仔细调整参数深入测试。

小技巧:--batch 可以和 --level、--risk 组合使用。比如:

sqlmap -u "http://example.com/page?id=1" --level=3 --risk=2 --batch

这样既提高了检测深度,又不用手动确认每个步骤,适合批量扫描多个目标。

实战组合示例

说了这么多,咱们来一个完整的例子。假设我要测一个需要登录的POST接口:

sqlmap -u "http://example.com/search" \
  --data "keyword=test&category=1" \
  --cookie "session=xyz789" \
  --level=2 \
  --risk=1 \
  --batch

这条命令的意思是:

  • 目标URL是搜索接口
  • 用POST方式提交keyword和category两个参数
  • 带上cookie维持登录状态
  • 检测级别2(会顺便测一下cookie参数)
  • 风险级别1(只用常规payload)
  • 全自动运行,不需要手动确认

这个配置是我最常用的「安全起步配置」。既不会漏掉常见的注入点,又不会因为payload太激进导致问题。

本章总结:

  • -u 是基础,指定目标URL
  • --data 处理POST请求,别跟 -u 搞混
  • --cookie 维持会话,登录态测试必备
  • --level/--risk 控制检测深度和风险,别盲目开高
  • --batch 自动化运行,适合快速探测

好了,第一章的内容就到这里。这些参数看着简单,但用好了能省不少事。下一章咱们聊聊如何用SQLMap检测和利用具体的注入类型,到时候会有更多实战案例。


专注资料整理