sqlmap语法
sqlmap 的语法语法核心就一句话:python sqlmap.py -u "目标URL" --dbs。但你真拿它去打生产环境,语法十有八九会撞得满头包。语法我见过太多人把 sqlmap 当傻瓜相机,语法对着一个带参数的语法链接就乱扫,结果要么被 WAF 拦成筛子,语法要么把数据库搞崩——这工具从来不是语法"输入即所得"。
先拆最基础的语法参数结构。每个请求都由三块拼起来:目标描述(告诉它打哪里)、语法请求伪装(怎么骗过服务器)、语法检测策略(用什么姿势试探)。语法你写 -u "http://example.com/page?语法id=1",这只是语法目标描述的第一层。真正的语法活儿在后面——比如你想让它用 POST 方式提交数据,就得加 --data="username=admin&password=123",语法否则它只会对 URL 里的查询串动手。
有个细节特别容易被忽略:--cookie 参数。登录后的页面才有注入点,可 sqlmap 默认不带任何会话状态。你得先抓包把 Cookie 复制出来,粘在命令里。我见过有人对着一个需要权限的接口干瞪眼半小时,最后发现是忘了加 --cookie="session=abc123"。这玩意儿就像钥匙,不带它就只能在大门外转悠。
再说请求伪装。真实攻击里,服务器日志会记录 User-Agent 和 Referer。sqlmap 默认的 UA 是 sqlmap/1.7.2#stable——这等于在门口喊"我是黑客"。你得用 --user-agent="Mozilla/5.0..." 伪装成浏览器,最好再配个 --random-agent 让它每次请求随机换。还有 --delay=2,每发一个请求等两秒,既能降低触发频率限制的概率,也能让日志看起来不那么扎眼。
检测策略才是重头戏。默认情况下 sqlmap 会先用布尔盲注试探,但你得告诉它"怎么判断真伪"。比如目标页面错误时返回 500,正常时是 200,那就加 --string="正常" 或 --code=200。否则它可能把"页面不存在"当成"注入失败",白白漏掉漏洞。另一个常用的是 --technique=BEUST,它代表布尔、报错、联合查询、堆叠、时间盲注五种技术。默认全开,但有时候你只想要时间盲注(比如目标屏蔽了所有报错信息),就写 --technique=T,能省一半时间。
说到时间盲注,有个坑必须提醒:--time-sec=5 默认等待 5 秒。如果目标网络延迟高,你可能会把正常延迟误判成注入成功。我习惯先手动 curl 测一下基线延迟,再把这个值设成基线延迟的两倍以上。
最实用的进阶参数是 --level 和 --risk。level 默认 1,范围 1-5,控制测试的深度和广度——level 3 以上会尝试对 Cookie 和 User-Agent 头注入,level 5 连 Host 头都不放过。risk 默认 1,范围 1-3,risk 2 会加入 OR 型注入,risk 3 可能用 UPDATE 之类的破坏性语句。记住一个原则:打测试环境可以拉满 level=5 risk=3,碰生产环境老老实实 level=1 risk=1,否则一个 OR 1=1 就可能把整张表的数据拖出来更新掉。
文件读写功能也值得玩味。--file-read="/etc/passwd" 能直接读服务器文件,前提是数据库用户有 FILE 权限。--os-shell 更狠,能直接弹一个交互式 shell。但这两个功能对目标系统要求极高——MySQL 需要 secure_file_priv 为空,MSSQL 得开 xp_cmdshell。别指望它万能,我试过十次里有八次失败,不是权限不够就是路径被限制。
最后说个没人写进文档的技巧:sqlmap 支持从文件读取 HTTP 请求,-r request.txt。你把 Burp Suite 抓的包原样存下来,它就能完全复现那个请求——包括 POST 体、Cookie、所有头部。这比手写 --data 和 --headers 可靠得多,尤其遇到复杂 JSON 请求或特殊编码时,手写容易出错,文件读取完美还原。
工具再强也抵不过思维僵化。sqlmap 语法背得滚瓜烂熟,不如理解每个参数背后的意图——它是在帮你控制"怎么问问题",而不是替你思考"该问什么"。遇到一个注入点,先手动确认类型,再决定用哪种技术,最后才轮到 sqlmap 上场。这工具是手术刀,不是电锯。

喜欢
讨厌