sqlmap指定注入点
发帖时间:2026-10-17 05:09:14
sqlmap的指定注入`-p`参数是个好东西,但多数人只用它来指定个参数名就完事了。指定注入真正的指定注入注入点指定,远比这精细得多。指定注入 拿个实际场景说。指定注入你拿到一个请求包,指定注入里面有个`id=123`,指定注入还有`sort=asc`、指定注入`page=1`。指定注入新手直接`sqlmap -u "http://target/page?指定注入id=123&sort=asc&page=1" --dbs`,跑半天可能啥也没出来。指定注入为啥?指定注入sqlmap默认会测所有参数,每个参数都要发一堆请求,指定注入目标WAF稍微敏感点,指定注入你的指定注入IP就进黑名单了。 这时候就要用`-p id`把火力集中在`id`上。但问题来了——光指定参数名还不够。如果`id`的值是`123`,sqlmap会拿它当注入点,可它测试时是替换整个值。万一后端代码是`WHERE id = '$input'`,你指定`-p id`,sqlmap会尝试闭合引号,没问题。可如果代码是`WHERE id = $input`,没有引号,sqlmap的payload里带引号反而可能触发报错。 更精细的玩法是`*`号标记。你把请求数据写成`id=123*&sort=asc`,这个星号告诉sqlmap:别管其他参数,只在这个位置注入。这跟`-p id`的区别在于,`-p`是告诉它测哪个参数,而`*`是精确到参数值里的某个位置。比如`id=123*`,sqlmap会在`123`后面直接追加payload,而不是替换整个值。有些场景下,参数值是个JSON片段或者复合结构,你只想在特定字段后面注入,这时候`*`就是唯一选择。 还有个容易被忽略的点——POST请求里的注入点。很多人用`-r request.txt`直接读包,但如果你只想测某个POST参数,得配合`-p`或者`*`。我见过有人把整个POST body都丢给sqlmap,结果它测了`username`、`password`、`csrf_token`,最后触发CSRF校验,全白跑。正确的做法是,先手动把请求包里的CSRF token去掉,再用`-p username`锁定目标。 再说说`--prefix`和`--suffix`。这俩参数能让你手动指定注入payload的前后缀。比如你知道后端是`WHERE id = ('$input')`,直接`--prefix="')" --suffix="AND '1'='1"`,sqlmap就能绕过它自己那套闭合逻辑,少走弯路。我常用这个配合`-p`来处理那种奇葩的嵌套括号查询。 最后提醒一句,指定注入点不是越少越好。有些参数虽然看起来没注入,但可能是二次注入的入口。比如`sort`参数如果直接拼进ORDER BY,`-p sort`配合`--technique=B`(布尔盲注)往往能出奇效。别光盯着数字型的`id`,字符串型的`name`、`category`反而更容易出洞,因为它们天然带引号,后端过滤容易留死角。 工具是死的,注入点是活的。多花十秒用`*`精确定位,比盲目跑全参省下半小时,还少暴露攻击痕迹。下次跑sqlmap前,先看看请求包,想想后端可能怎么写SQL,再决定怎么指定注入点——这比任何参数都管用。