記事のディレクトリ
3日目-スノーフレーク
このトピックはスノーフレークと呼ばれ、コードは次のとおりです。
脆弱性分析:
このコードには2つのセキュリティホールがあります。1つ目は、脆弱性を含むファイルです。上図の8行目でclass_exists()関数を使用して、ユーザーから渡されたコントローラーが存在するかどうかを判断します。デフォルトでは、プログラムに__autoload関数がある場合、class_exists()関数が使用されます。このプログラムの__autoload関数が自動的に呼び出され、この質問の脆弱性を含むファイルがこの場所に表示されます。攻撃者はパストラバーサルを使用して任意のファイルを含めることができます。もちろん、パストラバーサルシンボルを使用する前提はPHP5から5.3(バージョン5.3を含む)の間です。たとえば、クラス名は次のとおりです。…/…/…/…/ etc / passwd検索ではpasswdファイルの内容がチェックされます。PHPマニュアルのclass_exists()関数の定義を見てみましょう。
class_exists | (PHP 4、PHP 5、PHP 7) |
---|---|
特徴 | クラスが定義されているかどうかを確認します |
定義 | bool class_exists(string $ class_name [、bool $ autoload = true]) |
$ class_nameはクラスの名前です | 照合時に大文字と小文字は区別されません。デフォルトでは、$ autoloadはtrueです。$ autoloadがtrueの場合、このプログラムの__autoload関数は自動的にロードされます。$ autoloadがfalseの場合、__ autoload関数は呼び出されません。 |
着信クラスにはフィルタリングがないため、組み込みクラスを渡すことができます。
ここでは、PHPの組み込みクラスを直接使用し、最初にGlobIteratorクラスを使用してフラグファイルの名前を検索し、> PHPマニュアルでGlobIteratorクラスのコンストラクターの定義を確認します。
public GlobIterator :: __construct(string $ pattern [、int $ flags = FilesystemIterator :: KEY_AS_PATHNAME | FilesystemIterator :: CURRENT_AS_FILEINFO])
最初のパラメーターは検索するファイルの名前、2番目のパラメーターはキー名としてファイルのどの情報を選択するかです。ここではFilesystemIterator :: CURRENT_AS_FILEINFOを使用することを選択します。対応する定数値は0で、これらを見つけることができます。ここでの定数値なので、最終的な検索ファイルのペイロードは次のようになります。
http://localhost/CTF/index.php?name = GlobIterator&param =。/ *。php&param2 = 0
フラグのファイル名はf1agi3hEre.phpであることがわかります。次に、組み込みのSimpleXMLElementを使用してf1agi3hEre.phpファイルのコンテンツを読み取ります。ここでは、ファイルが存在する場合、PHPストリームを一緒に使用する必要があります。 :<>& '"これらの5つのシンボルはXMLファイル解析エラーを引き起こすため、ここではPHPファイルストリームを使用して、base64エンコード後に読み取られるファイルのコンテンツを出力します。具体的なペイロードは次のとおりです。
http://localhost/CTF/index.php?name = SimpleXMLElement&param = <?xml version = "1.0"?>]>%26xxe;&param2 = 2