21

最後の手段としてここに質問を投稿します。Web を閲覧し、何度も試行しましたが、成功しませんでした。

XXE 攻撃を再現することは、それらを防ぐために私がやろうとしていることですが、PHP が XML エンティティを処理する方法について理解できていないようです。記録のために、私は Ubuntu 12.04 で PHP 5.5.10 を使用していますが、5.4 と 5.3 でいくつかのテストを行いました。

次の例では、true または false を指定して libxml_disable_entity_loader() を呼び出しても効果がないか、何か間違ったことをしています。

$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c PUBLIC "bar" "/etc/passwd">
]>
<root>
    <test>Test</test>
    <sub>&c;</sub>
</root>
XML;

libxml_disable_entity_loader(true);
$dom = new DOMDocument();
$dom->loadXML($xml);

// Prints Test.
print $dom->textContent;

ただし、いくつかの引数を loadXML() に渡していくつかのオプションを許可することもできます。これは、エンティティが外部 URL の場合ではなく、ローカル ファイルの場合に機能します。

$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c PUBLIC "bar" "/etc/passwd">
]>
<root>
    <test>Test</test>
    <sub>&c;</sub>
</root>
XML;

$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD);

// Prints Test.
print $dom->textContent;

次の例のように、エンティティを別のものに変更すると、エンティティは解決されますが、パラメーターまたは関数を使用してエンティティを無効にすることはできませんでした...何が起こっているのですか?!

$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c "Blah blah">
]>
<root>
    <test>Test</test>
    <sub>&c;</sub>
</root>
XML;

$dom = new DOMDocument();
$dom->loadXML($xml);

// Prints Test.
print $dom->textContent;

私が見つけた唯一の方法は、DOMDocument オブジェクトのプロパティを上書きすることでした。

  • resolveExternals を 1 に設定
  • 1 に設定された代用エンティティ

次に、それらが解決されるかどうか。

要約すると、明らかに理解していないことを本当に理解したいと思います。これらのパラメーターと関数が効果がないように見えるのはなぜですか? libxml2 は PHP よりも優先されますか?

どうもありがとう!

参考文献:

4

1 に答える 1