私はいくつかの侵入テストで、PHPが1e9
のような値を1000000000
に変換しているのに、この数値の最大許容文字列長が3(データベースストレージ内とHTMLフォームのmaxlength
プロパティ)。
それにもかかわらず、1e9
(3)を入力すると、PHPは出力として1000000000
(10)を返します。これは、アプリケーションが期待する数よりも多く、適切に処理できます。 。したがって、これを防ぐためにユーザー入力の検証を改善することを検討します。
まず、この動作は危険ではないが望ましくないだけだと思いますが、これを想定することは正当なことですか?次に、これを実際の(重大度の低い)脆弱性と見なすことはできますか?
また、入力9e9
は、2147483647
(10)ではなく、最大32ビット値9000000000
(10)になります。これだけ(32ビットシステムまたは構成)はシステム情報の漏えいまたは危険と見なされますか?
厳密に言えば?いいえ、それ自体は脆弱性ではありません。しかし、それはさらに調査が必要な潜在的に問題があることを示唆しています。
これは、ペンテストに固有の問題の1つです。このような何かがあいまいであり、それが悪用可能かどうかはわかりません。これが脆弱性であるかどうかを突き止めるには、入力制限の機能を理解する必要があります。
たとえば、プログラムが銀行振込を1000ドル未満に制限するように設計されていて、入力フィールドが金額であり、それ以上のチェックがない場合、巨大な脆弱性を見つけただけです。
一方、フィールドが、保護者が学校の連絡先番号を入力するための電話番号データベースを作成する電話番号の最初の3桁のみであり、検証は、ユーザーが最初の3桁のみを入力することを確認するだけです。 、あなたはおそらく非常にオタクな親が自分の電話番号のエントリをデータベースにねじ込むことができるというまれなケースしか見つけていないでしょう。
PHPには 緩いタイピング があるためです。この例を見てください:
_$x = "1e6";
echo strlen($x); // 3
echo $x * 1; // 1 000 000
_
2行目では、_$x
_は文字列と見なされるため、明らかに3文字です。 3行目では、_$x
_は整数として、この場合は1 000 000として解釈されます。
これは間違いなくバグを引き起こす可能性があり、すべてのバグは潜在的なセキュリティの脆弱性です。しかし、それ自体で、アプリケーションがデフォルトで脆弱になることはありません。しかし、それが問題を引き起こすシナリオを想像してみましょう。
フォーラムにユーザーが自由に参加できる番号付きグループがあるとしますが、最初の10グループ(0〜9)は管理者用に予約されています。 _joingroup.php
_のコードは次のようになります。
_$group = $_POST['group'];
if(strlen($group) > 1 || $isadmin) {
join_group($group, $uid);
}
else {
// Fail.
}
_
実際に管理者でなくても、管理者グループに忍び込むことができます。 _0.3e1
_、文字列長は5ですが、評価結果は3です。これはばかげた例です。私が強調したいのは、数値データを検証するためにstrlen()
(または、入力を文字列として扱うもの)に依存している場合は、脆弱になる可能性があるということです。
_3.0
_または_ 3
_を投稿するだけでも、このチェックはバイパスされます。 PHPが文字列を暗黙的に数値に変換する方法の詳細については、 マニュアル を確認してください。
ユーザー入力を検証します。整数を取得する予定のときに実際に整数を取得することを確認します。
_if(!ctype_digit($group)) {
// Fail.
}
_
また、整数でなければならないものを常に文字列ではなく整数として扱うこともお勧めします。
_$group = (int) $_POST['group']
if($group > 9 || $isadmin) {
// ...
_
どうやらこれは最大整数値を明らかにすることができます。おそらく誰かがあなたがPHPを使用していることからこれを推測しているかもしれませんが、おそらくこれを行う他の多くの方法があるでしょう。最大値はプラットフォームに依存しているため、フィンガープリントに使用できます。しかし、 32ビットシステムでは32ビットが使用され、64ビットシステムでは64ビットが使用される可能性があるため、漏洩しているのはそれだけです。