何が起こっているのかをよりよく理解するためにPHPでSQLインジェクタブルWebアプリビルドを作成し、sqlmapですべてを自動化しました。
関連するコードは次のとおりです。
_mysqli_query($conn, SELECT trans FROM `dictionary` WHERE `Word` LIKE '$unfiltered_variable');
_
私はSQLMapをいじってみましたが、取得できたのは辞書の内容だけでした(これは辞書のウェブサイトだったため)が、PHPのsqli_query()
関数はスタックをサポートしていないため、他に何もできませんでした。クエリ。
だから質問:
1)データベースのコンテンツを取得する以外の目的で悪用される可能性のあるものはありますか?
2)データベースの内容を秘密にすることを意図していない場合、この脆弱性を保護する意味はありますか?
少しの間、方程式からPHPを完全に削除しましょう。
SQLインジェクションを使用すると、攻撃者はSQLクエリを操作して、クエリで実行したいものにすることができます。これは、データベースの内容のダンプ、データの変更、さらにはコードの実行である可能性があります。
あなたが提供した例は確かにSQLインジェクションに対して脆弱です。デモンストレーションの目的で、少し単純化してみましょう。
mysqli_query($conn, "SELECT trans FROM dictionary WHERE Word = '$search'");
security
の値を指定すると、結果のクエリは次のようになります。
_SELECT trans FROM dictionary WHERE Word = 'security';
_
これは無実で正常です。ただし、次の場合、攻撃者は実行中のMySQLのバージョンを取得できます。
_' @@version -- -
_
これにより、クエリの結果は次のようになります。
_SELECT trans FROM dictionary WHERE Word = '' @@version -- - ';
_
最終的に、アクセス許可と構成に応じて、攻撃者はデータベースサーバー内のあるデータベースから別のデータベースにジャンプしたり、ファイルシステムからファイルを読み取ったり、コードを実行したりする可能性があります。攻撃者がLinuxベースのOSからファイルを読み取る方法の例を次に示します。
' LOAD_FILE('/etc/passwd') -- -'
これにより、次のクエリが発生します。
SELECT trans FROM dictionary WHERE Word = '' LOAD_FILE('/etc/passwd') -- -'
この時点で覚えておくべきことがいくつかあります。
とにかく、問題の機能のニーズに応じて、ユーザー入力のパラメーター化またはホワイトリストに登録することで、SQLインジェクションの脆弱性を修正することを強くお勧めします。
SQLインジェクションは言語やフレームワークに依存しないため、議論からPHPを削除することから始めました。これは、データベース接続を許可するすべての言語に影響します。言語に関係なく、ユーザー入力は疑いを持って処理し、処理する必要があります。適切に。
現在のステートメントに制限されている場合、悪用は 現在のステートメントタイプの機能 にも制限されます。
一般に、 SELECT
ステートメント では次のことが可能です。
LOAD_FILE
関数 を使用してファイルを読み取るINTO …
構文 を使用してファイルを書き込むもちろん、WebサーバーがSQLクエリを処理する方法、MySQLユーザーのアクセス許可、およびステートメント内のインジェクションポイントによって、悪用がさらに制限される可能性があります。
ただし、あなたの場合は、Webサーバーのドキュメントルートディレクトリの場所を見つけて、そこにPHPシェルを書き込もうとすることができます。これにより、任意のPHPコードを実行できるようになり、Webサーバー上でコマンドを実行できるようになります。