ホームページ >バックエンド開発 >PHPチュートリアル >Web ファイル操作の解析における一般的なセキュリティの脆弱性 (ディレクトリおよびファイル名の検出の脆弱性)_PHP チュートリアル

Web ファイル操作の解析における一般的なセキュリティの脆弱性 (ディレクトリおよびファイル名の検出の脆弱性)_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:02:311040ブラウズ

Web 開発を行うとき、抜け穴が頻繁に現れるいくつかのコア機能やロジックをランダムにチェックすることがよくあります。技術チームが成長するにつれて、チームメンバーのスキルはますます成熟していきます。 一般的な愚者型 SQL インジェクションの脆弱性と XSS の脆弱性。今後もその数はどんどん減っていきますが、時折現れる新たな隠れた脆弱性も見つかるでしょう。これらの脆弱性のほとんどは、開発者の機能または共通モジュール機能の設計が不十分なために発生し、問題が残されたままになります。以前は、いくつかの機能モジュールを完了することができましたが、現在では、安全かつ正しい方法でモジュールを完了することが要件となります。 次に、設計上の理由により脆弱性を引き起こす一般的な機能モジュールをいくつか紹介します。次に、まずファイル読み取り機能の脆弱性を見てみましょう。
まず次のコードを見てみましょう。これには、ユーザーが入力したさまざまなディレクトリにさまざまなファイルが含まれています

コードをコピーします コードは次のとおりです:

/// module name
$mod = isset( $_GET['m'])?trim($_GET['m']):'index';
///上位ディレクトリにジャンプしないようにディレクトリ名をフィルタリングします
$mod = str_replace(".."," .",$mod);
///ファイルを取得します
$file = "/home/www/blog/".$mod.".php";
// /Include the file
@include($file);

このコードは、多くの友人が作成したプログラムで遭遇した可能性があります。また、初心者にとっては、ウォークスルー中にこのコードに遭遇したときのことを思い出してください。私は、このコードの安全性を確保してもらえますか、と尋ねました。
回答: 1. 「..」ディレクトリが置き換えられるため、ユーザーによって渡されたモジュール名内のすべての .. ディレクトリが置き換えられます。
2. 結合されたファイル名を作成します。前部のディレクトリには制限があり、後部には拡張子が制限されます。
このコードは本当にディレクトリのセキュリティ検出を実現しますか?
$mod がこの値を渡した場合の結果がどのようになるかをテストしてみましょう。 image

$mod 入力 ?mod=…%2F…%2F…%2F…%2Fetc%2Fpasswd%00 を構築すると、結果は次のようになります:

image

実際には include("/etc/passwd") ファイルです。
どうやって私のパラメータ制限を回避しましたか?
まず第一に:
ユーザー入力を制限するためにパラメーター フィルター タイプを使用するのは良い方法ではありません。テストできる場合は、テストに失敗する限り、置き換えないでください。それ!これは私たちの原則の 1 つです。フィルタリングの失敗は無数にあります。実際のプロセスを見てみましょう。
1.「..」を「.」に置き換えて「…/…/…/」と入力します
2.結果は「../../../」になります
はい、友達が尋ねます、直接スペースに置き換えた方が良いでしょうか?確かにこれで代用可能です。ただし、将来的にすべてをスペースに置き換えることができるという意味ではありません。別の例を見てみましょう。例: 誰かが文字列内の JavaScript を置き換えました。コードは次のとおりです:

コードをコピーします コードは次のとおりです:

...
$msg = str_replace("javascript","",$msg);

のようです。 javascriptは表示されませんが、 jjavascriptavascript と入力して置き換えると、真ん中が空になった後に置き換えます。先頭の「j」と次の「j」は新しい JavaScript を形成します。

2 番目: その背後にある .php 制限を回避する方法を見てみましょう。ユーザーが入力したパラメータは次のとおりです: "etc/passwd

1. ホワイトリスト制限とは

コードをコピーします

コードは次のとおりです:


例:
$mod = isset($_GET['m'])?trim($_GET['m']):'index'; ///モジュール名を読み取った後、
mod 変数の値の範囲 ifこれは列挙型の場合:
if(!in_array($mod,array('user','index','add','edit'))) exit('err!!!');
完全修飾$ mod はこの配列にしか入れられないので、とても残酷です。 ! ! !

2. ホワイトリスト制限を実装する方法
先ほどの例を通して、列挙型の場合は値をリストに直接入力するだけであることがわかりました。ホワイトリストによる別の制限方法もあります。文字範囲を制限するためです

コードをコピーします コードは次のとおりです:

例:
$mod = isset($_GET['m'])?trim($_GET['m ']):'index '; ///モジュール名を読むと、一般的なサイトの場合、$mod は文字と数字とアンダースコアであることがわかります。
if(!preg_match(“/^w+$/”,$mod)) exit(‘err!!!’);
文字は [A-Za-z0-9_] これらのみです。十分残酷だ! ! !


概要: ホワイトリスト制限方法は実際には非常に簡単であることがわかりましたか? その場所で何が必要かがわかっている場合は、入力が必要なものを確認するだけです。さらに、未知の文字を置き換えるよりも、すでに知っている文字を検出する方がはるかに簡単です。 問題を解決する正しい方法により、ファイルがよりシンプルかつ安全になります。 !

http://www.bkjia.com/PHPjc/327917.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327917.html技術記事 Web 開発を行うとき、抜け穴が頻繁に現れるいくつかのコア機能やロジックをランダムにチェックすることがよくあります。技術チームが成長するにつれて、チームメンバーの技術的な日々...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。