PHP
CTFでよく出題されるPHPの言語仕様・挙動をまとめる
Type Juggling / 型変換 https://www.php.net/manual/ja/language.types.type-juggling.php
緩やかな比較( == )は型の相互変換を行った後に比較する
true == "php"がtrueになるなど、色々おかしなことが起こる
比較の手順 https://www.php.net/manual/ja/language.operators.comparison.php
比較表 https://www.php.net/manual/ja/types.comparisons.php
switch文は緩やかな比較が行われる
CakeCTF 2022 - CakeGEAR https://satoooon1024.hatenablog.com/entry/2022/09/05/Cake_CTF_2022_Writeup#CakeGEAR-welcome-98-solves
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になる
例えばPassword147186970!と240610708 https://peccu.hatenablog.com/entry/2015/05/23/000000
0e1234...の形のハッシュはmagic hashと呼ばれている
まとめられている https://github.com/spaze/hashes
これCTFの小ネタにしか使えないだろ
Stream Wrappers
PHPは色んなURLスキームをサポートしている
Wrapper一覧 https://www.php.net/manual/en/wrappers.php
file_get_contentsなどはファイル読み込みだけでなくURLからの読み込みもサポートしている
php filterが使える関数はhttps://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html の下部にまとめられている
data://
任意のデータを作りたいときに便利
ftp://
たまに使える
file_existsをftp://でハングさせる (TODO: CODEGATE CTF 2024のやつ)
phar://
Insecure Deserializationを参照
php://
PHP Filterを参照
xorで文字列が生成できる
"393482"^"@@@@]_"で"system"が生成できたりする https://github.com/vichhika/CTF-Writeup/blob/main/GrabCON%20CTF%202021/Web/Basic%20Calc/README.md
関数を参照するのに文字列が利用できる
可変関数という仕組み
https://www.php.net/manual/ja/functions.variable-functions.php
("system")("cat /etc/passwd")が実行できる
xorの挙動と合わせると、フィルタのバイパスができたりする
これを使うと5種類の文字種(^.9)で任意のPHPコードが実行できる
UIUCTF 2021 - phpfuck_fixed https://nanimokangaeteinai.hateblo.jp/entry/2021/08/02/103244#Jail-449-phpfuck_fixed-9-solves
$_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: 今も動くのか要検証)
SekaiCTF 2022 - Sekai Game Start https://satoooon1024.hatenablog.com/entry/2022/10/04/SekaiCTF_2022_Writeup#Sekai-Game-Start-63-solves
https://www.php.net/manual/ja/language.variables.external.php
disable_function バイパス
open_basedirバイパス
http://blog.shpik.kr/php,/bypass,/open_basedir/2019/04/05/PHP_Open_basedir_Bypass.html
資料
CTFのWebセキュリティにおけるPHPまとめ https://blog.hamayanhamayan.com/entry/2021/12/18/132236