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

WBOY
リリース: 2016-07-20 11:16:59
オリジナル
826 人が閲覧しました

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

まず、ユーザーを使用して異なるディレクトリを入力し、異なるファイルを含める次のコード部分を見てみましょう

リーリー

このコードは、多くの友人が作成したプログラムで遭遇したことがあるかもしれませんが、初心者にとっては、そのような問題が発生しやすいことを覚えておいてください、私がウォークスルー中にこのコードに遭遇したとき、私は、のセキュリティの観点から何ができるかを尋ねました。このコードは?

回答: 1. 「..」ディレクトリが置き換えられるため、ユーザーによって渡されたモジュール名内のすべての .. ディレクトリが置き換えられます。

拼 2. ステッチのファイル名を構築すると、前のディレクトリに制限があり、拡張名にも制限があり、ファイルも含めてディレクトリに制限されます

  • このコードは本当にディレクトリのセキュリティ検出を実行しますか?

$mod がこの値を渡した場合の結果がどのようになるかをテストしてみましょう。

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

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

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

実際には include("/etc/passwd") ファイルです。

  • どうやって私のパラメータ制限を回避しましたか?

まず第一に: ユーザー入力を制限するためにパラメータ フィルタリング タイプを使用するのは良い方法ではありません: テストできる場合は、置き換えないでください テストに失敗する限り、直接渡してください!これは私たちの原則の 1 つです。フィルタリングの失敗は無数にあります。実際のプロセスを見てみましょう。

1.「…/…/…/」を「..」に置き換えて入力します

2. 結果は「../../../」となり、こうなります

友達の中には、スペースに置き換えた方が良いのではないかと尋ねる人もいます。確かにこれで代用可能です。ただし、将来的にすべてをスペースに置き換えることができるという意味ではありません。別の例を見てみましょう。例: 誰かが文字列内の JavaScript を置き換えました。コードは次のとおりです:

……

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

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

2 番目: その背後にある .php の制限を回避する方法を見てみましょう。ユーザーが入力したパラメータは「etc/passwd」です。この文字は非常に特殊です。変数を出力すると、ファイル名は「...etc/passwd.php」になります。 。ただし、ファイルの読み書き操作メソッドにセクションを挿入した場合、後で自動的に切り詰められます。オペレーティング システムは etc/passwd ファイルのみを読み取ります。 「」は、すべてのファイル システムの読み取りおよび書き込みファイル変数に表示されます。も同様に扱われます。この C 言語は、文字列としての完全なマークアップに関連しています。

上記の分析を通じて、ファイルタイプの操作を行う場合、注意しないと大きな抜け穴が発生することが誰でもわかりました。そして、この脆弱性は一連のセキュリティ問題を引き起こす可能性があります。

  • ファイル操作を実行するには?

ここで、ファイルの読み書き操作をするときに、パスに変数があった場合はどうすればよいのか、と考える人もいるかもしれません。 「交換できるの?」という人もいるかもしれません。 「はい」ですが、この交換方法は厳密ではないため、多くの問題が発生します。さらに、初めてライターをする人にとって、それを避けるのは困難です。 正しいことを行い、正しい方法を選択すれば、問題の発生を防ぐことができます。 ここで私は次のことを提案します:

変数にホワイトリスト制限を作成します。

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

    例:

    $mod = isset($_GET['m'])?trim($_GET['m']):'index'; ///モジュール名を読み取った後

    mod 変数の値の範囲 (列挙型の場合):

    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_] のみです。 冷酷すぎる! ! !

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

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