web-dev-qa-db-ja.com

X-Forwarded-ForヘッダーのSELECTステートメントでブラインドSQLインジェクションを手動で利用する

以下のコードでこの脆弱性の悪用に苦労しています:

_<?php
ini_set('display_errors', 0);

define("INDEX", 1);
include '../db.php';

if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  $query = "SELECT * FROM banned_ip WHERE ip='$ip'";

  $res = mysql_query($query);

  if(mysql_num_rows($res) > 0) {
      die('<h2>Banned!</h2>');
  }
}
?>
_

上記のコードのX-Forwarded-ForヘッダーにブラインドSQLインジェクションがあります。 OWASP Testing Guide から別のペイロードを試し、 このコースをPentesterlabで 読みましたが、これを利用することはまだ不可能です。

私の仮定:

  • banned_ipテーブルは空なので、このチェック:if(mysql_num_rows($res) > 0)はfalseを返します。このテーブルに挿入するか、別のテーブルから選択してゼロ以外の応答を返す方法が必要です。
  • バックエンドデータベースはMySQL $res = mysql_query($query);のようです。そのため、MySqlに固有のいくつかのコマンドを知らない可能性があるため、役立つ場合があります
2
jpiechowka

機能しないアプローチ(マルチクエリ、挿入/削除/更新)

mysql_query はマルチクエリをサポートしていません:

multiple queries are not supported

つまり、;を介して別のクエリを追加してデータを削除、編集、または挿入しても機能しません。あなたはあなたが持っている選択クエリで立ち往生しています。

選択したデータが表示されていないことも確認できるため、実際にはブラインドインジェクションが行われています。

ありそうもないアプローチ:シェルファイルを書く

理論的には、たとえばPHP Shellを取得するために、ファイルにデータを書き込もうとすることができます。次のようになります。

' UNION SELECT '<?php passthru($_GET['x']);' INTO OUTFILE '/var/www/404.php' -- -

ただし、これに対して十分な権限があることはほとんどありません。 mysqlユーザーが実際に書き込むことができるファイルとディレクトリへの書き込み権限を持つSQLユーザーだけでなく、mysqlサーバーも--secure-file-privオプションなしで実行する必要があります。最近のシステムではデフォルトではそうではありません。

データブラインドの読み取り:エラーベース

上記は、唯一の攻撃ベクトルがデータベースからのデータの読み取りであることを意味します。運が良ければ、エラーが表示されます。

エラーが表示された場合は、読み取りたい情報を含むエラーを作成するだけです。 1つの方法は、extractvalueを使用することです。

' or extractvalue(1,version()) -- -

バージョンを尋ねるだけでなく、INFORMATION_SCHEMAからテーブル名と列名を選択できます。興味深い表を見つけたら、データを読んでください。

データブラインドの読み取り:コンテンツベース

多分あなたは運が悪かったし、エラーは表示されません。はい/いいえの質問をすることでデータを抽出できます:

' AND substring(version(),1,1)='5

ご覧のとおり、インジェクションを含むクエリ全体は、MySQLバージョンが5の場合はtrueを返し、それ以外の場合はfalseを返します。つまり、何が起こるかによって-スクリプトが死ぬか死ぬか-MySQLのバージョンを知っています。

バージョンを尋ねる代わりに、mysqlユーザーテーブルの最初のユーザーのパスワードハッシュの最初の文字など、他のデータを要求できます。

Asciiを使用し、値が特定の数値より大きいか小さいかを尋ねることでアプローチを最適化し、可能な文字のウィンドウを狭めることができます。

ただし、多くのリクエストが必要になるため、実際の悪用にはツールまたはカスタムスクリプトを使用することをお勧めします。

データブラインドの読み取り:タイミングベース

完全を期すために:まったくフィードバックが返されない(禁止メッセージがない)場合でも、要求が完了するまでの時間に基づいて、selectへの注入を利用できます。

アイデアはコンテンツベースの悪用と同じですが、異なる応答を取得する代わりに、遅いタスクを実行するかしないかを決定します。

' AND IF(SUBSTRING(version(), 1, 1)='5',BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null) %23
1
tim

クエリから何が返されると思いますか?そのブラインドなので、おそらく何も見えません。

テスト環境にデプロイした場合は、dbのレコードを操作できるかどうかを確認できます。私が見ることができるものから、あなたは間違いなくできる。

この場合、次のことができます。

X-Forwarded-For: '; DELETE * FROM banned_ip; '

次のリクエスト時に、DBに接続しているユーザーにDELETEが許可されている場合、IPは禁止されなくなります。

テーブル/データベースの構造がわからない場合、他のことを行うのは困難です。わかっている場合は、そこにIPを挿入して、禁止されているかどうかを確認できます。

挿入する値をさまざまなテーブルと列にプローブしようとする何らかの自動化ツール(いわゆるブルートフォース攻撃)を使用して、IPが禁止されているかどうかを確認できます。

さらに、この脆弱性を使用すると、データベース全体にアクセスできます。ユーザー名とパスワードの列を持つusersという名前のテーブル(99.9%の場合)がある場合、パスをMD5、SHA、SHA2の順にハッシュしてユーザーをそこに挿入しようとすることができます...非常に多くの機会があります。 ..

しかし、あなたが何かを見ることができると期待しないでください。それが「ブラインド」と呼ばれる理由です。


編集:ところで、私はあなたが達成しなければならないことを例で見ることができます。そこに正確に書かれています。そして、それを達成する方法がそこに正確に書かれています。基本的には、adminsテーブルへのアクセスを取得し、そこからパスワードハッシュを取得する必要があります。したがって、管理者の資格情報を使用してアプリケーションを攻撃する必要があります。

0
Fis