sqlmap查看
sqlmap跑完一遍,屏幕上刷出几百行日志,很多人第一反应是直接翻到最底下看有没有“injectable”。这没错,但只盯着这一行,会漏掉大量有价值的判断依据。
先看最前面那几行。sqlmap启动后会先做一遍启发式检测,输出类似“heuristic (basic) test shows that GET parameter 'id' might be injectable”这样的提示。这句话的意思是,它用一组预定义的payload快速试探了一下,发现响应有异常。注意,这是“might be”,不是确认。真正确认要看后续的“Parameter: id (GET)”下面跟着的“Type: boolean-based blind”或“Type: UNION query”这类结论。如果只看到heuristic提示就收工,可能把误报当成漏洞。
接下来是payload注入的过程。sqlmap会逐个尝试不同技术类型,每试一个就打印一行“testing 'AND boolean-based blind - WHERE or HAVING clause'”。这些行不是废话。如果某个技术类型反复出现“WARNING: reflective value(s) found and filtering out”,说明目标对payload里的某些字符做了反射或过滤,sqlmap在自动调整。这时候可以留意它后续是否切换了tamper脚本,或者payload结构有没有变化。有次我测一个站,boolean-based blind一直卡在“testing”阶段,但时间盲注那行很快就出了结果,说明目标对布尔条件的响应做了统一处理,但对延时没有防御。
真正出结果的那几行通常长这样:
Parameter: id (GET) Type: boolean-based blind Title: AND boolean-based blind - WHERE or HAVING clause Payload: id=1 AND 5847=5847 这里要看的不是“有结果”这件事,而是Payload的具体构造。比如上面这个payload用的是“AND 5847=5847”,说明sqlmap判断目标对数字型比较的响应差异是可观测的。如果换成“AND 'abc'='abc'”,那可能是字符型注入。payload里的数字是随机生成的,每次跑都不一样,不用纠结具体数值,看结构就行。
再往下翻,如果sqlmap成功识别出DBMS,会打印“back-end DBMS: MySQL >= 5.0”之类的信息。这行很关键。不同数据库的注入利用方式差别很大。MySQL可以load_file、into outfile,MSSQL可以xp_cmdshell,Oracle有UTL_HTTP。看到DBMS类型,脑子里就要开始盘算后续能走哪条路。有次我看到“back-end DBMS: Microsoft SQL Server 2012”,立刻想到可以试xp_cmdshell,后来果然通过--os-shell拿到了系统命令执行。
如果加了--dbs参数,sqlmap会列出所有数据库。输出格式是[*] information_schema、[*] mysql、[*] test这类。这时候别急着dump。先看有没有权限读information_schema,如果连这个都读不出来,说明当前注入点的数据库用户权限极低,后面dump表大概率也会失败。反过来,如果能看到mysql库,说明权限不低,可以进一步试--privileges看具体权限。
还有一行容易被忽略:“[INFO] fetched data logged to text files under '/root/.sqlmap/output/target.com'”。sqlmap会把所有中间结果和最终数据写到本地文件。跑大目标的时候,屏幕输出可能刷得太快,来不及看,但本地日志是完整的。我习惯跑完之后直接去那个目录翻log文件,比在终端里往回滚要靠谱得多。
最后说一个实际踩过的坑。有次测一个站,sqlmap报告“Parameter: id (GET) Type: time-based blind”,payload是“id=1 AND SLEEP(5)”。看起来没问题,但实际手工验证时发现,不管加不加SLEEP,响应时间都在5秒左右。原因是目标服务器本身响应就慢,sqlmap的延时阈值设得太宽松,把正常延迟当成了注入特征。后来用--time-sec 10重新跑,结果就没了。所以看到time-based blind,最好手工确认一下基线响应时间,别全信工具。
sqlmap的输出信息量很大,每一行都有它的作用。养成逐段看的习惯,比只看结论要可靠得多。
(责任编辑:焦点)
