情報セキュリティ技術同人誌TomoriNao
第1章 PHP Object Injection
PHPのObjectを注入することで、unserialize()が実行される際に実行される__destruct()やマジックメソッドの__wakeup()が実行されるので、そこで任意のPHPコードを実行できる。
広くはInsecure Deserializationというジャンルの脆弱性に分類される。
2017年のOWASP Top10に入るほどメジャーなジャンル
Pythonのunpickle()によるあんシリアライズやJavaのreadResolve()やreadExternal()、readUnhashed()を使って外部由来の値をアンシリアライズする脆弱性がある
攻撃が成立する条件
アプリケーションが__wakeup()や__destruct()のようなマジックメソッドがあるクラスを持っていること。
攻撃に使えるクラスがunserialize()が呼ばれるところで定義されている or オートローディングされている。
攻撃者がサーバサイドのコードを持っている or 使われているライブラリを把握している。
対策
json_decodeおよびjson_encodeを使用すること。
それらが使えない場合はhash_hmac()を使ってObjectが改ざんされていないか検証する。
書籍ではCTFぽくPHPファイルと同じ階層にflag.txtを置いて、flag.txtの内容を表示されるスタイル。
シリアライズされたPHPのオブジェクトを渡すことで実行できる。
code:php
class warm {
public $dir = ".";
}
シリアライズすると
O:4:"warm":1:{s:3:"dir";s:1:".";}
Oはオブジェクトを表し続く数字はここではオブジェクト名の文字列数を表す。
続く1はプロパティの数が1であることを表し、{}内はs:3:はプロパティ名が文字列数が3のdirで、初期値が文字列数が1の.ということになる。
感想
SQL Injectionや OS Command Injectionなどは有名だがPHP Injectionは知らなかった。(PHPに限らずできるので難易度は高いけど範囲の広そうな脆弱性に思える)
問題で取り上げられていたサイトが良さそうだったのでいくつか見て試してみたい。ざっとみた感じではSQLでwordpressにバックドアを作るとかkerberos認証の原理とその攻撃方法ぽいのがあった