一、检测级别
参数 –level
该参数用来指定要执行的测试级别。有1-5五个级别,默认级别为1,级别越高将对更多的payload和边界进行测试。
sqlmap使用的payload在xml/payloads.xml文件中指定。按照文件顶部的说明,如果sqlmap错过了一次注入,你应该也可以添加你自己的payload来进行测试!
打开xml/payloads.xml便可以看到默认的payload。比如:
<test>
<title>OR boolean-based blind - WHERE or HAVING clause (Generic comment) (NOT)</title>
<stype>1</stype>
<level>4</level>
<risk>3</risk>
<clause>1</clause>
<where>1</where>
<vector>OR NOT [INFERENCE]</vector>
<request>
<payload>OR NOT [RANDNUM]=[RANDNUM]</payload>
<comment>[GENERIC_SQL_COMMENT]</comment>
</request>
<response>
<comparison>OR NOT [RANDNUM]=[RANDNUM1]</comparison>
</response>
</test>
可以看到上述检测时bool盲注的payload,在lever等于4的时候使用。
此选项不仅会影响payload,还会影响注入点:任何级别都会测试GET和POST参数,大于等于级别2时测试HTTP Cookie标头值,大于等于3级时测试HTTP User-Agent / Referer头的值。
总而言之,检测SQL注入越困难,–level必须设置的越高,建议在无法检测到某个注入点时将此值提高。
二、风险级别
参数 –risk
该参数用于指定测试执行的风险,有三个风险值。默认值是1,这对大多数SQL注入点无害。风险值2添加了大量基于时间盲注的检测。风险值3增加了基于OR的盲注测试。
在某些update情况下,基于OR注入可能会导致数据库表的更新,这当然不是攻击者想要的,通过这个参数我们可以控制测试哪些payload。
三、页面对比
参数 –string,–not-string,–regexp和–code
默认情况下,sqlmap判断true还是false的方法是比较注入的请求页面内容与原始未注入页面内容。但是这个方法并不总是有效,因为有的页面只要刷新就会发生变化,即使你没有注入任何payload,比如页面中含有动态广告。遇到这样的情况,slqmap会尽力判断响应体的片段并处理。
但是sqlmap于是并不能正确处理,我们可以用--string
参数提供一个字符串,该字符串存在于ture页面中,而不在false页面中,也可以使用--regexp
参数指定一个正则表达式而不是字符串。使用--not-string
参数可以指定一个字符串,该字符串只存在于false页面中
这些数据对我们来说很容易获取,指定一个错误的测试参数来返回false页面,然后比较ture页面赫尔false页面,查找出一个字符串或者正则表达式即可。
如果我们知道ture和false的http状态码不同(例如ture的状态码为200,false为401),我们还可以使用--code
参数将其提供给sqlmap,例如--code=200
如果我们知道ture和false页面的标题存在不同,例如ture的标题为hello
,flase的标题为hello,world
,我们可以使用参数--titles
将其提供给sqlmap。
在HTTP响应正文中包含大量其他内容(例如js脚本)的情况下,我们可以使用开关--text-only
来让slqmap只关注text文件。