数字型注入和字符型注入的区别
数字型注入和字符型注入,数字本质上是型注型注同一类漏洞的两种变体,但它们触发的入和入前提条件、利用方式和绕过手法完全不同。字符直接说结论:数字型注入靠“闭合查询”,区别字符型注入靠“闭合引号”。数字这个区别决定了你payload的型注型注写法,也决定了你绕过WAF的入和入思路。
拿一个真实案例开刀。字符某后台登录接口,区别参数是数字`id`,查询语句大概是型注型注`SELECT * FROM users WHERE id = $id`。攻击者输入`1 AND 1=1`,入和入页面正常返回;输入`1 AND 1=2`,字符页面空白。区别这就是数字型注入的典型特征——参数被直接拼进SQL语句的数字位置,不需要任何引号包裹。你输入的内容就是数字本身,所以攻击者可以随意追加逻辑运算。这种注入写payload最省心,直接空格加条件就行。
字符型注入就麻烦多了。假设同一个接口改成`WHERE username = '$name'`,你输入`admin`,实际查询是`WHERE username = 'admin'`。这时候你输入`admin AND 1=1`,SQL会把它当成一个完整的字符串,根本不会执行`AND`后面的逻辑。要突破,必须先把前面的单引号闭合掉。典型的payload是`admin' OR '1'='1`。看到区别了吗?数字型注入不需要考虑引号配对,字符型注入必须精确控制引号的数量和位置,否则整条SQL直接语法报错。
更微妙的差异在于注释符的使用。数字型注入里,如果查询后面还有其它条件,比如`WHERE id = $id AND status = 1`,你注入`1 OR 1=1`会导致整个条件恒真,但如果你只想注释掉后面的`AND status = 1`,数字型注入可以用`--`注释符,也可以用`#`。字符型注入则必须先把引号闭合,再注释掉末尾的引号。比如`admin'-- -`,这里的`--`后面必须跟一个空格(MySQL要求),否则注释不生效。这种细节坑过无数新手。
绕过WAF时,两者的策略也天差地别。数字型注入因为不涉及引号,WAF的规则通常针对`AND`、`OR`、`UNION`这些关键字做过滤,你可以用`&&`、`||`替代逻辑运算符,或者用内联注释`/*!50000AND*/`混淆。字符型注入则多了一层引号过滤的麻烦。很多WAF会直接拦截单引号,这时候你就得想别的招——比如用`\`转义掉引号,或者利用宽字节注入(GBK编码下`%bf%27`绕过转义)。这些手法对数字型注入完全是多余的。
还有个容易忽略的点:数字型注入通常出现在`id`、`page`、`age`这类整数参数上,但有些开发者会把数字参数用引号包起来,比如`WHERE id = '$id'`,这时候它实际上变成了字符型注入。判断方法很简单——输入`1'`如果报错,说明是字符型;输入`1'`如果正常返回,说明是数字型。这个测试步骤我建议你每次遇到数字参数都做一遍,因为很多CMS框架会自动给参数加引号。
最后说个实战观察。SQLMap这类工具能自动识别注入类型,但手工注入时,字符型注入的payload长度通常比数字型长好几倍,而且更容易触发WAF的请求体大小限制。如果你在渗透测试中遇到字符型注入,尽量用报错注入或者时间盲注,因为联合查询需要控制列数,而字符型注入的引号闭合已经够呛,再叠加UNION的列数对齐,很容易把自己绕晕。数字型注入则相反,UNION注入是首选,因为不需要处理引号,只要确认了列数就能直接拖数据。
(责任编辑:休闲)














