sqlmap用法

sqlmap用法

sqlmap是用法我用过最顺手的自动化注入工具,没有之一。用法它把SQL注入检测和利用压缩成一条命令,用法省掉我大量手写payload的用法时间。但很多人只拿它跑个`--dbs`就完事,用法根本没榨干它的用法价值。

先看最基础的用法用法。目标URL存在注入点时,用法直接指定参数:
sqlmap -u "http://example.com/page?用法id=1" --dbs
它先测试注入类型,再枚举数据库。用法第一次跑会问一堆交互问题,用法比如是用法否接受风险、是用法否继续测试其他参数,我通常直接加`--batch`跳过所有询问,用法让工具用默认策略跑。用法省事,但有时候默认策略会漏掉某些注入点,所以关键目标我会手动回答。

拿到数据库名后,下一步是掏表。指定库名:
sqlmap -u "http://example.com/page?id=1" -D target_db --tables
接着dump指定表的数据,比如用户表:
sqlmap -u "http://example.com/page?id=1" -D target_db -T users --dump
它会自动识别密码哈希,并尝试用内置字典破解弱口令。有一次我直接dump出admin的明文密码——那站点居然用MD5存密码,连盐都没加。

但sqlmap真正厉害的不是这些基础操作,而是它的进阶功能。绕过WAF是重中之重。默认的注入payload很容易被安全设备拦截,这时用`--tamper`参数加载脚本混淆请求。比如:
sqlmap -u "http://example.com/page?id=1" --tamper=space2comment --batch
这会把空格替换成`/**/`注释符,很多规则简单的WAF直接懵了。实际渗透中,我常用`between`、`randomcase`、`charencode`这几个tamper脚本组合,能绕掉大多数基于关键词匹配的防护。

另一个容易忽略的是文件读写。如果目标数据库是MySQL且具备FILE权限,你可以直接写webshell:
sqlmap -u "http://example.com/page?id=1" --file-write /local/shell.php --file-dest /var/www/html/shell.php
前提是你知道web根目录路径。不知道的话,先跑`--sql-shell`进去执行`select @@datadir`猜路径。我遇到过用`--os-shell`直接拿到交互式系统shell的情况,那玩意儿比菜刀好用多了,因为它自动处理了上传和命令执行。

别忽视请求定制。真实环境里,目标URL往往需要登录态或特定请求头。用`--cookie`、`--headers`、`--data`指定POST参数,或者把原始HTTP请求保存成文件,用`-r`加载:
sqlmap -r request.txt --level=2 --risk=2
`--level`和`--risk`调高后,会测试更多参数和更危险的payload,比如时间盲注和联合查询。代价是速度变慢,但漏报率明显下降。我一般对生产系统用`--level=3 --risk=1`,对测试环境直接拉满。

最后说点个人感受。sqlmap不是万能的——遇到参数被加密、请求带签名的情况,它就抓瞎了。这时候得配合Burp Suite抓包,手动分析加密逻辑,再用sqlmap的`--prefix`和`--suffix`去拼接payload。另外,新版sqlmap支持`--proxy`配合代理工具,调试起来方便很多。

工具只是工具,关键看你怎么用。我见过有人拿默认参数跑了一整天一无所获,也见过老手调几个参数五分钟就拿下库。多读官方wiki,多试不同tamper组合,比盲目堆`--level 5`管用得多。