~/ / problem1 · web
Web · Problem 01会員名簿の裏口
状況
社内イントラの「社員名簿検索」画面を調査している。氏名を入れると部署とメールが 出てくる素朴な検索機能だが、裏側のクエリの組み立てが怪しい。データベースには 検索対象の employees テーブルのほかに、 管理者しか触れないはずの隠しテーブルが存在するらしい。 そこに保管されている機密(flag)を引きずり出せ。
社員名簿検索(攻撃対象)
名前で社員を検索します。入力はそのまま SQL に渡され、実行された SQL がレスポンスに表示されます。
取っ掛かり(ヒント)
- まず正常系を観察する。レスポンスに
executed_sqlがそのまま返ってくるので、 自分の入力が SQL 文字列のどこに埋め込まれるかを確認する。 - シングルクォート
'を1つ送るとどうなる? 構文エラー(SQL error)が返るなら、文字列リテラルから抜け出せている証拠。 - 表示カラムは4つ(id / name / department / email)。
UNION SELECTで別テーブルを継ぎ足すなら、カラム数と並びを合わせる必要がある。 - 隠しテーブルの名前とカラム名は自分で推測する。ありがちな命名(secret / flags / secret_flags など)を試そう。末尾は
--でコメントアウトすると余分な引用符を無視できる。
Claude Code に任せるなら:「/api/problem1 の検索は SQL 文字列連結で脆弱。 UNION ベースの SQLi で隠しテーブルの flag を抜き出す payload を組み立てて、 curl で実行して」
API 仕様
GET /api/problem1?q=<検索する氏名>
レスポンス(JSON): executed_sql / error / count / results例: curl 'http://localhost:3000/api/problem1?q=Tanaka%20Hiroshi'