PHP
CTFでよく出題されるPHPの言語仕様・挙動をまとめる
緩やかな比較( == )は型の相互変換を行った後に比較する
true == "php"がtrueになるなど、色々おかしなことが起こる
switch文は緩やかな比較が行われる
match文では厳密比較
magic hash
"4" == "2e2"はtrueになる
相互変換をするとき、文字列を数値として解釈できる場合は数値に変換する
2e2=2^2
md5($a) == md5($b)となる$aと$bの組はあるか?
md5($a)とmd5($b)が0e1234...という形式になっていれば、md5($a) == md5($b)はtrueになる
0e1234...の形のハッシュはmagic hashと呼ばれている
これCTFの小ネタにしか使えないだろ
Stream Wrappers
PHPは色んなURLスキームをサポートしている
file_get_contentsなどはファイル読み込みだけでなくURLからの読み込みもサポートしている
data://
任意のデータを作りたいときに便利
ftp://
たまに使える
file_existsをftp://でハングさせる (TODO: CODEGATE CTF 2024のやつ)
phar://
php://
xorで文字列が生成できる
関数を参照するのに文字列が利用できる
可変関数という仕組み
("system")("cat /etc/passwd")が実行できる
xorの挙動と合わせると、フィルタのバイパスができたりする
これを使うと5種類の文字種(^.9)で任意のPHPコードが実行できる
$_GET/$_POST/$_REQUESTは文字列だけではなく配列や辞書もパラメータにすることができる
?a=1&a=2 → [1, 2]
?a[b]=1 → [ b -> 1 ]
$_REQUEST["REMOTE_ADDR"]はIPv6にもなりうる
m0lecon CTF 2023 teaser - linux examples
session周りの話
外部から来る変数の変数名の中にあるドットや空白はアンダーバーに変換される
?a.b=1でリクエストしても、$_GET["a_b"]になる
a[b.cはa_b.cになるバグがある (TODO: 今も動くのか要検証)
disable_function バイパス
open_basedirバイパス
資料