SQLmap中-u与-r命令的差异及适用场景咨询
为什么SQLmap的
-u和-r命令检测注入结果不同? 我来帮你拆解这个问题,核心在于这两个命令处理HTTP请求的逻辑完全不一样,结合你测试Mutillidae的场景,我给你理清楚来龙去脉:
1. 两个命令的核心工作原理差异
sqlmap -u:轻量URL解析,默认极简请求
当你用-u直接指定URL时,SQLmap的处理逻辑很直接:
- 它会拆分URL里的查询字符串(
?后面的部分),把每个键值对当成独立的GET参数。 - 但它自带一套参数过滤机制:比如像
page这种指向页面文件的参数,或者user-info-php-submit-button这种明显是提交按钮的参数,会被它优先降低测试优先级甚至直接跳过。 - 最关键的是:
-u默认只发送最基础的GET请求,不会带上任何额外的HTTP头信息(比如Cookie、Referer、User-Agent这些)——而很多Web应用(尤其是像Mutillidae这种带会话的PHP应用)严重依赖这些头来处理请求。
sqlmap -r:完全复用真实请求,1:1模拟浏览器行为
用-r加载Burp导出的请求文件时,SQLmap会彻底"照搬"整个请求:
- 它会把请求里所有的参数(不管是GET查询里的,还是POST表单里的)都纳入测试范围,不会随便过滤参数。
- 它会原封不动地发送所有HTTP头:Cookie、Referer、User-Agent、甚至
If-Modified-Since这种看起来不起眼的头,完全模拟你在浏览器里操作的请求环境。 - 它严格遵循请求文件里的协议版本、请求方法、头字段顺序,和你手动抓包的请求完全一致,不会因为请求格式不对被应用拒绝。
2. 你的案例里,-r比-u多了哪些关键内容?
看你提供的user.request文件,这些内容是-u命令没有的,也是导致检测结果差异的核心:
- Cookie会话标识:
PHPSESSID=cb55bd05e9618af173600ba757e996c1——Mutillidae作为PHP应用,需要用Session Cookie来识别你的会话状态,如果你用-u不带Cookie,应用可能返回空内容或者跳转到非目标页面,SQLmap根本拿不到正确的响应来判断注入。 - Referer头:指向了同一个请求页面,有些应用会检查Referer来防CSRF,没有这个头的话,请求可能被判定为非法,返回异常响应。
- 完整的浏览器标识头:User-Agent、Accept、Accept-Language这些头,虽然看似无关,但有些应用会用它们做简单的爬虫检测,缺少这些头的请求会被当成异常请求,SQLmap的测试 payload 根本无法触发正确的注入响应。
- If-Modified-Since头:这个头会让服务器返回304或者正常内容,
-u不带这个头时,响应内容和你手动测试时不一致,SQLmap自然无法识别注入点。
另外,-r不会像-u那样过滤参数,它会认真测试username和password这两个你已经确认有漏洞的参数,而-u可能因为过滤逻辑或者响应异常,只测试了page参数,所以没检测到漏洞。
3. 两者的适用场景
优先用sqlmap -u的场景
- 测试简单的无状态GET请求:比如静态页面的ID参数,不需要会话、特殊头就能正常响应的场景。
- 快速扫测单个URL的参数,确认基础注入可能性。
- 示例:
sqlmap -u "http://example.com/test?id=1"
必须用sqlmap -r的场景
- 测试需要会话验证的请求:比如登录后的页面,必须带Cookie才能访问的场景。
- 测试包含特殊HTTP头的请求:比如需要Referer、Authorization、自定义头的接口。
- 当
-u检测不到漏洞,但你手动确认存在注入时(就像你的案例)。 - 测试POST请求:把Burp抓的POST请求存成文件,用
-r加载即可。 - 应用有严格的请求格式校验:必须完全模拟浏览器请求才能得到正常响应的场景。
补充小技巧:让-u也能成功检测
如果你想用-u命令也能复现-r的效果,只需要手动补上必要的HTTP头就行,比如:
sqlmap -u "http://xxx.xxx.2.9/mutillidae/index.php?page=user-info.php&username=a&password=b&user-info-php-submit-button=View+Account+Details" \ --cookie="PHPSESSID=cb55bd05e9618af173600ba757e996c1" \ --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" \ --referer="http://xxx.xxx.2.9/mutillidae/index.php?page=user-info.php&username=a&password=b&user-info-php-submit-button=View+Account+Details"
这样带上Cookie、User-Agent和Referer,SQLmap就能拿到和-r一样的响应,自然能检测到注入点。
内容的提问来源于stack exchange,提问作者Madhan
相关产品推荐
相关产品推荐

