web-dev-qa-db-ja.com

不正にエスケープされた `mysql_query()またはdie(mysql_error())`を悪用してデータを引き出しますか?

mysql_query($sql) or die(mysql_error())を使用するレガシーコードに遭遇しました

好奇心が強く、電子メール入力に"が正しく配置されていることに気付きました...ユーザーとしてmysql_error()からの出力が表示されます。

SQL構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルで、1行目でnear '"[email protected]""'を使用するための正しい構文を確認してください。

mysql_query('SELECT * FROM users WHERE users_email_address = "'.$email.'") or die(mysql_error());

[email protected]" OR "" = ...でブラウザをクラッシュさせることができました。これにより、無限ループが発生したと想定しているためです。

質問の最初の部分は...私が見つけたこの"条件でどのように情報を引き出しますか?詳細については、SQLインジェクション以外に特別な名前がありますか?

質問の2番目の部分は次のとおりです。mysql_errorの出力は、侵入者にとっては有利に思えるかもしれませんが、提供できる情報の深さについては知りません。

1
ma77c

質問の最初の部分は...見つけたこの「条件」で情報をどのように引き出しますか?詳細について読むことができるSQLインジェクション以外の特別な名前がありますか?

いいえ、これはまさにSQLインジェクションです。クエリの結果が出力されている場合は、UNIONを使用して、開示することを意図していない他のテーブルからのデータを混在させることができます。クエリの結果が出力されない場合でも、 ブラインドSQLインジェクション を使用して、データベースの内容を一度に1文字ずつマップできます。ログインフォームで見つかった場合は、認証バイパスの可能性があります。

これはセキュリティの複雑な専門分野です。一部の人は、有効なSQLクエリの記述を、インジェクションカーブをスローすることなく、それ自体で十分に難しいと考えるかもしれません。適切なチートシート こちら 、およびWeb上で利用可能なさまざまな品質のあらゆる種類のチュートリアル。

質問の2番目の部分は次のとおりです。mysql_errorの出力は、侵入者にとっては有利に思えるかもしれませんが、提供できる情報の深さについては知りません。

まず、これはSQLインジェクションが可能であることを示す大きなフラグです。しかし、第2に、侵入者がSQLインジェクションを試行しているときに、詳細なエラーメッセージがあると、クエリを適切に実行するためにクエリを適合させることが容易になります。

2
gowenfawr