脆弱性は、任意の種類の相対パスを で送信できること$lang
です。ユーザーがファイルをアップロードしてサーバー上の実際のパスを把握できる場合、これは特に危険です。
例:
- ハッカーは、サイトのファイル アップロード機能を使用して をアップロードする可能性があります
evil.php
。/var/www/uploads/evil.php
ハッカーは、ファイルが に保存されていること、アプリケーションが で実行されていることを知っている/発見した/推測している可能性があります/var/www/html
。
- 通常、
/var/www/uploads
HTTP 経由でアクセスできない場合、誰もこのファイルを実行できません。
- しかし、それを開い
http://example.com/index.php?lang=../../uploads/evil
て推測することは可能であり、それは!languages/../../uploads/evil.php
に解決されるものを含みます。/var/www/uploads/evil.php
もちろん、通常はパスワードで保護されたディレクトリ (phpMyAdmin など) 内のファイルなど、アクセスして呼び出すことで何かを悪用するために使用できるファイルが他にある場合、これはファイルのアップロードなしでも機能します。
そして、「それはかなり多くの仮定であり、「可能性と可能性」が含まれている場合、これを成功させるには非常に幸運である必要がある」と考えている場合は、気をつけてください。たとえば、サーバーを乗っ取ったり、データベースを削除したりできますが、最も危険なのは、エクスプロイトを機能させるために複数のパズルのピースが必要なものです。サーバーが実際にハッキングされると、当然のことながら、より経験豊富なため、より危険な (おそらくステルス) ハッカーが玄関先にいることになります。誰かがセキュリティ ホールを見つけようと決心した場合 (その人があなたのサイトまたはあなたを攻撃するという実際の目標を持っているため、
複数の解決策があります。
u_mulder で提案されているように、ある場合はar
、en
それがどちらかであるかどうかを確認してください。
より多くの言語がある場合は、許可された値のリストを含む配列を作成し、送信された言語がその配列に含まれているかどうかを確認できます。次に例を示します。
$languages = ['de', 'en', 'ar', 'jp', 'fr'];
if(in_array($_GET['lang'], $languages)) {
$selectedLanguage = $_GET['lang'];
} else {
$selectedLanguage = 'en'; // default
// Note that you could also show an error "invalid language" instead
}
フォルダーに存在するファイルのみを許可することでこれを制御したい場合は、言語に文字のみが含まれていることを検証することもできます (または、ドットやスラッシュなどが含まれていないことを確認する限り、必要なものは何でも)。 :
if(preg_match("/^[a-z]*$/", $_GET['lang'])) { ... }
このアプローチでは、指定されたファイルが存在するかどうかも必ず確認する必要があることに注意してください。そうしないと、無効な言語を指定して言語のないサイトを作成する可能性があります (特に、include
存在しないファイルに対してエラーをスローしないため、require
)。