web-dev-qa-db-ja.com

パスにファイル名が追加されたときにPHP readfile関数を利用する

PHP function readfileの悪用について質問したいと思います。そのため、サイトをハッキングしたことで報酬を得ており、_readme.php_からPHP _read.php_という名前のファイル)。これには次のコードが含まれます。

_<?php
$path = $_GET['p'];
readfile("pages/$path/index.html");
?>
_

したがって、_readme.php_ファイルが自動的に追加されるため、_/index.html_ファイルを読み取ることができません。この場合、PHPファイルを読み取る方法はありますか?

3
Lucas

PHPが解釈されると、バージョン<=からPHP 5.3.4は、一般に呼び出される攻撃に対して脆弱ですnullバイトインジェクション)。

PHPで文字列を宣言するには、Cで_$var = "hey"_と同等の_char tab[4]="hey"_を使用します。 3バイトの文字のみを格納したいのに、4バイトの文字配列を宣言したことに注意してください。これは、コンパイラがnullバイト文字を自動的に挿入するためです。最終的な文字列は_hey\0_になります

tabは、文字列の最初の文字を指すポインターです。コンピューターは、最初の文字から_\0_で表されるnullバイト文字(16進数で0)まで読み取ります。

_%00_は、PHPでのnullバイト文字の表現です。

readfile("pages/$path/index.html");のような文字列で関数を呼び出す場合、文字列は変数に格納されます。これを_$tmp=pages/pathFromVariable/index.html_と呼びましょう。実際には_pages/pathFromVariable/index.html\0_としてメモリに格納されます。

ここで、入力の最後にnullバイトを挿入すると、文字列の最後を消去できます。たとえば、_$tmp=pages/pathFromVariable%00/index.html_の場合、_pages/pathFromVariable\0/index.html\0_として保存され、ファイル__pages/pathFromVariable_が読み取られます。うんざり!

6
Xavier59