第32回 PHPセキュリティ月間
今回もMOPS関連の話題です。MOPSではPHP関連のセキュリティ製品やセキュリティ知識の論文を募集し,
- MOPS Submission 07: Our Dynamic PHP - Obvious and not so obvious PHP code injection and evaluation
- http://
www. php-security. org/ 2010/ 05/ 20/ mops-submission-07-our-dynamic-php/ index. html
なぜPHPコード実行が起きるのか?
PHPコード実行が起きる原因は不適切なプログラムが原因であることがほとんどです。不適切なプログラムが作成されてしまう原因のほとんどはプログラマの知識不足です。
今回の記事は,
PHPにおけるコード実行
PHPは動的な言語であるため,
明白なケース ─ eval関数
最も明白なケースはeval関数のパラメータへのコード挿入です。
<?php
eval("echo $foobar;");
?>
このコードの場合,
''; system('ls')
であれば,
echo ''; system('ls');
が実行されます。
<?php
eval('echo $foobar;');
?>
この場合,
<?php
echo $foobar;
?>
を実行した場合と変わりありません。
eval関数を実行した場合に気を付けなければならないことは,
明白なケース ─ スクリプトのインクルード
PHPはinlcude/
外部スクリプトの読み込みの問題は2つの種類に分類できます。
- ローカルファイルの読み込み
(LFI) - リモードファイルの読み込み
(RFI)
この種類の攻撃を防ぐ最良の対策は
Gerkis氏はファイルの読み込みに定数を利用することはよいアプローチだとしています。
<?php
define('APP_PATH', '/var/www/htdocs/');
require_once(APP_PATH . 'lib.php');
?>
そして,
<?php
$to_include = $_GET['file'];
require_once($to_include . '.html');
?>
これは典型的なファイルインクルード脆弱性です。文書の中ではDATA URIを利用した攻撃が紹介されています。上記のような脆弱なコードに対して
http://www.example.com/index.php?file=data:text/plain,<?php phpinfo();?>%00
等とするとPHPのコードが実行できてしまいます。DATA URIを利用した攻撃は脆弱なHTTPリダイレクトを利用したJavaScriptインジェクションの例が有名です。
Location: data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3JpcHQ+
- ※1
「PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3JpcHQ+」 は 「<script>alert(document. cookie)<script>」 をBASE64エンコードしたテキスト
などとしてJavaScriptインジェクションが可能でした。この攻撃に脆弱なWebアプリケーションがあまりに多いため,
これと同様の攻撃がPHPのinclude文に対して行えます。include文に対するDATA URIを利用した攻撃は非常に危険です。従来,