函数解释
exp()数学函数,用于计算e的x次方的函数。
约束条件
5.5<mysql版本<5.6
报错原理
exp是以e为底的指数函数,
但是,由于数字太大是会产生溢出。这个函数会在参数大于709时溢出,报错。
将0按位取反就会返回“18446744073709551615”,再加上函数成功执行后返回0的缘故,我们将成功执行的函数取反就会得到最大的无符号BIGINT值。
我们通过子查询与按位求反,造成一个DOUBLE overflow error,并借由此注出数据。
从而实现了报错注入。
注入语句
and (exp(~(select * from (操作代码) a)))
举例
可能有人会疑惑为什么这里有一个字母“a”,前面的例句还用了“x”,其实这里可以使用任何字符串,用于表示派生表命名为a。
如果我们不添加这个字符串会出现报错(Every derived table must have its own alias)表示派生表未被命名
注意看在and (exp(~(select * from (操作代码) a)))
中,“操作代码”是在from之后,也就是“操作代码查询结果”其实是一个表,通过查询新生成的表称为派生表,但是这个表没有被命名就会导致and (exp(~(select * from 操作代码查询结果)))
无法查询该表,造成语法错误,所以要在查询结果后面添加一个字符串,表示查询结果新生成的派生表命名为a。