0x01 前言概述
好消息好消息好消息~作者又在MySQL中发现了一个Double模型数据溢出。如果您想知道如何使用溢出来注射数据,您可以阅读作者之前的博客文章:BIGINT Overflow Error based injections,drops这里还有相应的翻译。当我们得到它时。MySQL在函数中,作者对数学函数更感兴趣,它们还应该包含一些数据类型来保存值。所以作者跑去测试哪些函数会溢出错误。然后作者发现,当传输一个超过709的值时,函数exp()会导致溢出错误。
mysql> select exp(709);
-----------------------
| exp(709) |
-----------------------
| 8.218407461554972e307 |
-----------------------
1 row in set (0.00 sec)
mysql> select exp(710);
ERROR 1690 (22003)DOUBLE value is out of range in 'exp(710)'
在MySQL中,exp与ln和log相反,简单介绍一下功能,就是log和ln都返回以e对数为底数,见等式:
mysql> select log(15);
------------------
| log(15) |
------------------
| 2.70805020110221 |
------------------
1 row in set (0.00 sec)
mysql> select ln(15);
------------------
| ln(15) |
------------------
| 2.70805020110221 |
------------------
1 row in set (0.00 sec)
指数函数是对数函数的反函数,exp()即为以e等式:
mysql> select exp(2.70805020110221);-----------------------
| exp(2.70805020110221) |
-----------------------
| 15 |
-----------------------
1 row in set (0.00 sec)
0x02 注入
当涉及注入时,我们使用否定查询来引起它“DOUBLE value is out of range”错误。作者之前的博客文章提到,如果0按位取反,将返回“18446744073709551615”,此外,由于函数成功执行后返回0,我们将取反成功执行的函数***的无符号BIGINT值。
mysql> select ~0;
----------------------
| ~0 |
----------------------
| 18446744073709551615 |
----------------------
1 row in set (0.00 sec)
mysql> select ~(select version());
----------------------
| ~(select version()) |
----------------------
| 18446744073709551610 |
----------------------
1 row in set,1 warning (0.00 sec)
我们通过子查询位求反,我们造成了一个DOUBLE overflow error,并注出数据。
0x03 注出数据
得到表名:
得到列名:
检索数据:
0x04 一蹴而就
本查询可从当前上下文中查询dump出所有的tables与columns。我们也可以dump所有的数据库都出来了,但是因为我们提取了一个错误,它会回到很少的结果。
0x05 读取文件
你可以通过load_file()函数读取文件,但作者发现有13行限制,句子也可以在BIGINT overflow injections中使用。
注意,你无法写文件,因为这个错入写入的只是0。
0x06 Injection in Insert
一步一步就好
对于所有的insert,update和delete语句DIOS也可以使用查询。
0x07 Injection in Update
0x08 Injection in Delete
和前面的BIGINT注入一样,exp也适用于注入MySQL5.5.5以上版本。在这种情况下,以前的版本是“一言不发”。
也许还有其他函数会产生这样的错误。(需要你发现:)
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。