第一章:SQLMap基础命令详解
大家好,我是老周。做渗透测试这些年,SQLMap是我最离不开的工具之一。今天咱们就来聊聊它的几个核心参数。说实话,很多人觉得SQLMap就是一条命令跑到底,其实不然。每个参数背后都有讲究,用好了事半功倍,用不好可能连目标都扫不出来。
本章核心知识点:
- -u 参数:指定目标URL
- --data 参数:处理POST请求
- --cookie 参数:维持会话状态
- --level/--risk 参数:控制检测深度
- --batch 模式:自动化运行
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检测和利用具体的注入类型,到时候会有更多实战案例。