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