在 SQL 注入中,exp()
函数有时会被滥用,主要是利用其在计算极大值时会产生溢出错误的特性,配合条件判断来获取信息。这种手法通常用于基于布尔的盲注,通过构造特殊的条件表达式,根据数据库返回的错误与否来推断信息。
例如,一个典型的利用exp()
的注入语句可能如下:
1 and (select case when (条件) then 1 else exp(710) end)
原理说明:
exp(710)
会计算 e 的 710 次方,这个值远超数据库能处理的数值范围,会触发 “数值溢出” 错误(如 MySQL 中的ER_DATA_OUT_OF_RANGE
)- 当
条件
为真时,返回 1,整个表达式正常执行,不会报错 - 当
条件
为假时,执行exp(710)
导致溢出错误,数据库返回错误信息
通过观察是否出现错误,攻击者可以判断条件是否成立,进而逐步猜解数据库信息(如用户名、密码哈希等)。
防护建议:
- 对所有用户输入进行严格的参数化查询,避免直接拼接 SQL 语句
- 限制数据库用户的权限,遵循最小权限原则
- 启用数据库的错误信息屏蔽,不在生产环境返回详细错误堆栈
- 使用 Web 应用防火墙 (WAF) 检测并拦截常见的 SQL 注入模式