PHP は一般的なオープンソースのスクリプト言語であり、その構文は C、Java、Perl などの優れた言語の構文を混合しています。さらに、開発者が使用できる多数の関数ライブラリも提供します。ただし、PHP は不適切に使用すると、アプリケーションに非常に大きなセキュリティ リスクをもたらす可能性があります。
この記事では、PHP アプリケーションでよく発生するいくつかの問題、特に「== (比較演算子) を使用して文字列比較を実行する場合に、セキュリティ上の問題が発生する可能性がある」について詳しく分析します。このトピックについては最近多くの記事で議論されていますが、私はこの問題を利用してターゲットに侵入し、攻撃する方法を「ブラック ボックス テスト」の観点から議論することにしました。まず、この問題の根本原因を分析して、その動作メカニズムをより深く理解し、このセキュリティ問題を可能な限り回避できるようにします。
問題の説明実際、この状況は、「==」などの比較演算子を使用して操作するときに発生します。上記例の問題は、PHPが提供する「型変換」と呼ばれる機能であるため、脆弱性とはみなされません。基本的に、特定の比較演算子 (==、!=、 など) を使用して操作する場合、PHP はまず比較に関与するデータ型を決定しようとします。ただし、このような型変換メカニズムにより、計算結果が予期した結果と大きく異なる可能性があり、非常に深刻なセキュリティ問題が発生する可能性もあります。セキュリティ研究の専門家は、この問題に関する完全な開示レポートで、「この型変換メカニズムは権限昇格につながり、プログラムのパスワード検証プロセスが安全でなくなる可能性さえある」と書いています。
ご覧のとおり、「==」を使用してこれらの数値文字列を比較する場合、安全性を考慮して、比較に関係するのは文字列内の数値の実際のサイズです。この観点から、これは次のようになります。とても興味深い質問です。この場合、科学的記数法を使用して数値を表し、それを文字列に入れると、PHP は自動的にそれを数値型として扱います。このような出力タイプが得られる理由は、PHP が処理にハッシュ アルゴリズム (通常は 16 進値で表される) を使用するためです。たとえば、数値が 0 の場合、PHP は疎比較中にその型を自動的に変換しますが、その値は常に 0 になります。特定のハッシュ アルゴリズムでは、パスワードが置き換え可能になる場合があります。たとえば、パスワード ハッシュを科学的表記法を使用して数値に変換すると、他のパスワード ハッシュと一致する可能性があります。このようにして、まったく異なるパスワードでもシステムの検証に合格する可能性があります。しかし、興味深いのは、科学的表記法で表現された特定の数値を比較すると、その結果に驚くかもしれないということです:
import random import hashlib import re import string import sys prof = re.compile("^0+ed*$") # you can also consider: re.compile("^d*e0+$") prefix = string.lower(sys.argv[1])+'!'+string.upper(sys.argv[1])+"%s" num=0 while True: num+=1 b = hashlib.sha256(prefix % num).hexdigest() if (b[0]=='0' and prof.match(b)): print(prefix+str(num),b)このために、私は特別に Python スクリプトを作成しました。このスクリプトのパフォーマンスを最適化するための努力はまったく行われていませんが、PyPy コンパイラーの助けにより、このよく書かれたスクリプトは、AMD FX8350 の使用可能なすべての CPU コアで安定して実行されます。さらに、hashlib ライブラリのハッシュ関数も使用し、Python GIL のプロセス同期の問題を回避するために、パスワード データを処理するための独立したプロセスも生成しました。それだけでなく、上記のコードに示すように、非常に洗練された手法を使用して、パスワードごとに異なるプレフィックスを生成しました。
以下に示すように、パスワードの計算結果は非常に似ています。
比較のために 2 つのパスワードをランダムに選択できます。 比較のデモンストレーション結果は次のとおりです。
次のようなパスワードを取得できない場合。上に示した結果を計算してみると、幸運だと感じるはずです。ユーザー名とパスワードを一緒にバンドルし、「ソルト」値を含むハッシュ アルゴリズムを使用して計算してみてください。これを実現するには、コードの一部を変更するだけで済みます。変更されたスクリプトを入手するには、「ここ」をクリックしてください。