1

文字列が適切にエスケープされていないコードのどこかを見つけました。私はそれが悪用可能かどうかを確認しようとしています (心配しないでください。最終的にはエスケープするか、準備済みステートメントを使用することになります。これは単なる学習経験のためです)。

これはmysqli->query()関数を使用しています。

クエリは PHP で次のように生成されます。

$Query = "CALL some_proc(".$_SomeID.",'".$_UnescapedString."')";

クエリを取得したときに$_UnescapedString入力することにより:test'); DROP TABLE SomeTable; --

CALL some_proc(1, 'test'); DROP TABLE SomeTable; -- ')

このクエリは正常に実行されましたが、2 番目のクエリは実行されていないようです。2 番目のクエリに無効な SQL を入れてこれをテストしたところ、エラーは発生しませんでした。これは、mysqli が 1 つのクエリしか実行できないほどスマートであることを意味していると思いますか?

私の質問は、どうにかして SQL をストアド プロシージャ自体に挿入できますか? 手順は次のとおりです。

BEGIN
   SELECT COUNT(*) AS SomeCount
   FROM DataTable
   WHERE DataTable.SomeID = _SomeID
   AND DataTable.SomeValue LIKE CONCAT('%',_UnescapedString,'%');
END

クエリが通常どおり実行されるかどうかを確認するなど、さまざまな SQL を試しましtest','%')--たが、ストアド プロシージャの呼び出しのみが変更されます。

CALL some_proc(1, 'test', '%')--');

とにかくDROP TABLEコマンドを取得する方法はあります_UnescapedStringか?

4

1 に答える 1

1

免責事項、私はmySQLではなくSQL Serverを使用していますが、ストアドプロシージャのパラメーターに関する動作は同じであると仮定し、それ_UnescapedStringが入力パラメーターであると仮定すると、パラメーターを入れるDROP TABLEと次のようになります。

SELECT COUNT(*) AS SomeValue
FROM DataTable
WHERE DataTable.SomeID = _SomeID
AND DataTable.SomeValue LIKE '%DROP TABLE%');

クエリに関して:

CALL some_proc(1, 'test'); DROP TABLE SomeTable; -- ')

DROP TABLE実行しているユーザー アカウントに DDL ステートメントを実行するための十分な権限がないために、コマンドが実行されなかった可能性がありますか?

Web サーバーからデータベースにアクセスするために使用されるユーザー アカウントのアクセス許可を制限することは、SQL インジェクション攻撃が引き起こす可能性のある損害を制限する方法です。しかし、それは彼らを止めません。

于 2013-05-09T10:43:05.270 に答える