sql >> データベース >  >> RDS >> Mysql

MySQLインジェクション-SELECTクエリを使用して更新/削除します

    質問に直接答える前に、攻撃者ができることは読むだけであっても注意する価値があります。 彼ができないはずのデータ、それは通常 まだ本当に悪い。 JOINを使用して検討してください sおよびSELECT システムテーブル(mysql.innodb_table_statsなど)からのing )、SELECTで始まる攻撃者 インジェクションとデータベースに関する他の知識はありません スキーマをマップしてから、MySQLにあるデータ全体を盗み出すことができます。大多数のデータベースとアプリケーションの場合、すでに 壊滅的なセキュリティホールを表します。

    しかし、質問に直接答えるには、MySQL SELECTへのインジェクションによって私が知っているいくつかの方法があります。 データの変更に使用できます。幸いなことに、それらはすべて合理的に必要です。 可能性のある異常な状況。以下のすべてのインジェクションの例は、質問からのインジェクション可能なクエリの例に関連して示されています。

    SELECT id, name, message FROM messages WHERE id = $_GET['q']
    

    1。 「スタック」または「バッチ」クエリ。

    注入されたステートメントの後に他のステートメント全体を配置するだけの古典的な注入手法。 別の回答 で提案されているように 、$_GET['q']を設定できます 1; DELETE FROM users; -- クエリが連続して実行される2つのステートメントを形成し、2番目のステートメントがusers内のすべてを削除するようにします。 テーブル。

    緩和策中

    ほとんどのMySQLコネクタ-特にPHPの(非推奨)mysql_*を含む および(非推奨ではありません)mysqli_* 関数-スタッククエリまたはバッチクエリをまったくサポートしていないため、この種の攻撃は単純に機能しません。ただし、一部の -特にPHPのPDOコネクタを含みます(ただし、セキュリティを強化するために、サポートを無効にすることができます

    2。ユーザー定義関数の活用

    関数はSELECTから呼び出すことができます 、およびデータを変更できます。データベースにデータ変更関数が作成されている場合は、SELECTを作成できます。 たとえば、0 OR SOME_FUNCTION_NAME()を渡すことで呼び出します。 $_GET['q']の値として 。

    緩和策中

    ほとんどのデータベースには、データを変更する機能はもちろんのこと、ユーザー定義の機能が含まれていないため、この種のエクスプロイトを実行する機会はまったくありません。

    3。ファイルへの書き込み

    Muhaimin Dzulfakarの(やや思いがけない名前の)論文高度なMySQLエクスプロイトINTO OUTFILEを使用できます またはINTO DUMPFILE MySQLの句は、結果をファイルにダンプすることを選択します。以来、UNIONを使用して 、任意の結果をSELECTにすることができます ed、これにより、ユーザーがmysqldを実行している任意の場所に、任意のコンテンツを含む新しいファイルを書き込むことができます。 アクセスできます。おそらく、これはMySQLデータベースのデータを変更するだけでなく、それが実行されているサーバーへのシェルアクセスを取得するために悪用される可能性があります。 MySQLサーバーはPHPサーバーと共同ホストされています。

    緩和策中

    多くの要因が、この印象的なサウンドの攻撃の実際的な悪用可能性を低下させます:

    • MySQLは決してありません INTO OUTFILEを使用できます またはINTO DUMPFILE 既存のファイルを上書きしたり、存在しないフォルダに書き込んだりします。これにより、.sshの作成などの攻撃が防止されます mysqlに秘密鍵があるフォルダ ユーザーのホームディレクトリをSSHで接続するか、mysqldを上書きします 悪意のあるバージョンのバイナリ自体で、サーバーの再起動を待機しています。
    • 中途半端なインストールパッケージでは、特別なユーザー(通常はmysqlという名前)が設定されます )mysqldを実行します 、およびそのユーザーに非常に限定された権限のみを付与します。そのため、ファイルシステム上のほとんどの場所に書き込むことができないはずです。また、通常、WebアプリケーションのWebルートに書き込むようなこともできないはずです。
    • MySQLの最新のインストールには、 --secure-file-priv デフォルトで設定され、MySQLが指定されたデータインポート/エクスポートディレクトリ以外の場所に書き込むことを防ぎ、サーバーの所有者が意図的に無効にしない限り、この攻撃をほぼ完全に無力にします。幸いなことに、そのようなセキュリティ機能を完全に無効にすることはできません。明らかに、 oh気にしないで待ってください

    4。 sys_exec()の呼び出し lib_mysqludf_sysからの関数 任意のシェルコマンドを実行するには

    lib_mysqludf_sysと呼ばれるMySQL拡張機能があります それ-その星から判断すると GitHub およびスタックオーバーフローのクイック検索 -少なくとも数百人のユーザーがいます。 sys_execという関数を追加します シェルコマンドを実行します。 #2で述べたように、関数はSELECT内から呼び出すことができます;意味はうまくいけば明白です。 ソース から引用するには 、この関数は「セキュリティ上の問題になる可能性があります」

    緩和策中

    ほとんどのシステムには、この拡張機能がインストールされていません。



    1. MySQLでテーブルの列名を取得しますか?

    2. ORDERBY句のCASEWHENステートメント

    3. MicrosoftAccessのデータソースとしてテキストまたはExcelを開くまたはリンクする

    4. MySQLとは:概要