0

特定のタスクを実行することで支援を求められた (醜い) プロジェクトがあります。問題は、サイト内の他のファイルを制御することはできず、サーバー構成を制御することはできません。使用するデータの一部は、次のようなクエリから取得されます。

'SELECT * FROM table where value like "'.$unsafe.'"';

$unsafeは、$_POST または $_GET からのエスケープされていない値です。サーバーを確認したところ、PHP5.1.6 で、magic_quotes_gpc がオンになっているため、データは自動エスケープされています。このクエリは壊れやすいですか? コロンの間で $unsafe であることは、それを壊すことはできないという印象を与えますが、何かが欠けているのかもしれません。私はmagic_quotes_gpcが安全でないために非推奨であることを知っているので、私はそれについて心配しています.

編集: *magic_quotes_gpc* のセキュリティへの影響を認識しており、自分のプロジェクトでは決して使用しません。インジェクションを避けるために常にパラメーター化されたクエリを使用しますが、今回は友人/クライアント プロジェクトに非常に具体的なコードを追加するように求められたため、既に行われていることを変更することはできません。インジェクションを作成するために使用できる特定の値があるかどうかを知りたいので、それを変更する必要がある理由を友人に説明できます。

4

2 に答える 2

1

編集に関して:「注射を作成するために使用できる特定の値があるかどうかを知りたいので、友人がなぜそれを変更する必要があるのか​​を説明できます」と質問されました。

のマニュアルページにmysqli_real_escape_string()よると、エスケープする文字は次のとおりです。

NUL (ASCII 0), \n, \r, \, ', ", and Control-Z.

古いmysql_real_escape_string()関数も同じ文字をエスケープします。

これにより、MySQLでインジェクション攻撃を行うためにどの文字を使用できるかについての出発点が得られます。魔法の引用符は、引用符とスラッシュ文字のみをエスケープします。これにより、悪用される可能性のあるいくつかのギャップのある穴が明らかに残ります。

簡単な世界では、上記の情報は、残りのエスケープされていない文字に対して文字列置換を実行することによってエスケープを修正するのに十分です。

ただし、両方のreal_escape機能を機能させるには、アクティブなデータベース接続も必要であり、これにより、文字セットというさらに複雑な問題が発生します。

データベースの文字セットがPHPとは異なる場合、特にUTF-8やUTF-16などの可変長文字セットを使用している場合は、さらに攻撃が行われる可能性があります。

PHPとDBが使用している文字セットを知っている(または推測できる)攻撃者は、PHPがエスケープする必要があるとは見なさないが、MySQLのハッキングに成功する文字を含む巧妙なインジェクション攻撃文字列を送信できます。これがreal_escape、エスケープの方法を知るために関数がDBにアクセスする必要がある理由です。

その他のリソース:

それがあなたにいくつかの指針を与えることを願っています。

于 2012-11-16T10:11:39.383 に答える
1

DB が mysql の場合、代わりにmysqli_real_escape_string()を使用します。PHPのバージョンが非常に古い場合は、mysql_real_escape_string を使用できます (現時点では推奨されません)。

変数がコロンの間にある場合でも、変数を挿入できます。変数の値内のコロンを閉じてから、後で必要なものを挿入するだけです。

于 2012-11-15T11:41:52.300 に答える