当前位置:首页 > 百科

sqlmap指定数据库类型

```html

用 sqlmap 做注入测试时,指定如果知道目标数据库是数据 MySQL,就没必要让它把 Oracle、库类SQL Server、指定PostgreSQL 挨个猜一遍。数据指定数据库类型能省掉大量盲注请求,库类尤其在时间盲注场景下,指定效率差距可能是数据几分钟和几小时的差别。

指定数据库类型靠 --dbms 参数。库类写法很直接:

sqlmap -u "http://target.com/news.php?指定id=1" --dbms=mysql

这里 mysql 就是告诉 sqlmap:别试别的了,目标就是数据 MySQL。sqlmap 支持的库类 dbms 值包括 mysql、mssql、指定oracle、数据postgresql、库类sqlite、access、firebird、db2、sybase、informix 等。大小写不敏感,写 MySQL 和 mysql 效果一样。

为什么值得手动指定

sqlmap 默认会跑一套指纹识别流程,通过报错信息、函数行为、注释语法等特征去判断后端数据库。这个过程本身要发不少请求。如果目标站点的 WAF 对请求频率敏感,或者页面响应本身就慢,指纹识别阶段就可能触发封禁或超时。

更关键的是,不同数据库的注入 payload 差异很大。MySQL 用 concat() 拼字符串,Oracle 得用 || 或者 concat() 但行为不同,SQL Server 又是 + 号。sqlmap 如果不确定 dbms,就得对每种可能都试一遍。指定之后,它直接按 MySQL 的语法构造 payload,请求数能砍掉一大半。

我遇到过一种情况:目标站是 MySQL,但报错信息被 PHP 的 display_errors 关掉了,页面返回空白。sqlmap 自动识别时反复试探,跑了十几分钟还在 fingerprint 阶段。加上 --dbms=mysql 之后,三十秒内就确认了注入点。

怎么判断该指定哪种

不一定非得等 sqlmap 识别出来。手工测试时就能拿到线索。比如构造 ?id=1' 报错,如果页面回显里有 You have an error in your SQL syntax,基本就是 MySQL。出现 ORA-01756 这种格式,那是 Oracle。Unclosed quotation mark 通常指向 SQL Server。

另一个办法是看 URL 特征。ASP 或 ASPX 后缀的站,SQL Server 概率大。PHP 站配 MySQL 是经典组合。但这只是经验判断,不能当铁律。最稳妥的还是先手工发几个探测请求,看报错或页面行为差异。

如果实在拿不准,可以不指定,让 sqlmap 自己跑。但建议加上 --dbms 的同时配合 --smart 参数,让 sqlmap 在快速判断后尽早收敛,而不是穷举所有可能性。

指定错了会怎样

如果写错了数据库类型,sqlmap 会按错误的语法构造 payload,结果要么报语法错误,要么返回空数据。它不会自动纠正,也不会回退到自动识别模式。所以指定之前最好有七八成把握。

有个细节:--dbms 的值可以用逗号分隔多个,比如 --dbms=mysql,mssql。这种写法适合你确定目标只可能是这两种之一,但又分不清具体是哪个的场景。sqlmap 会在这几个类型里做选择,比全量识别快,比单一指定灵活。

和其他参数的配合

指定 dbms 之后,--technique 参数可以更精确地控制注入技术。比如确认是 MySQL 且页面有报错回显,直接 --technique=E 走报错注入,速度最快。如果是 MySQL 但无回显,用 --technique=T 走时间盲注,配合 --time-sec=3 控制延迟。

还有个实用组合:--dbms=mysql --os=linux。当你需要 --os-shell 或 --file-read 时,指定操作系统能帮 sqlmap 选对路径分隔符和命令语法。Windows 用 \ 和 cmd.exe,Linux 用 / 和 /bin/sh,搞混了文件读写直接失败。

实际测试中,我习惯先手工确认数据库类型,再带上 --dbms 跑 sqlmap。多花两分钟手工探测,能省下后面十几分钟的等待。尤其是面对有速率限制的目标,每一轮请求都值得花在刀刃上。

```

分享到: