このページにはプロモーションが含まれています
問題情報
- タイトル:caas
- カテゴリ:Web
- 難易度:Medium
- 使用ツール:ブラウザ
問題文

問題文の和訳
牛語(cowsay)をサービスとして提供します
ヒント:なし
DeepL.com(無料版)で翻訳しました。
アプローチ(解法の流れ)
1. 動作を確認する
リンクからアクセスしました。

ブラウザから上記のURLにアクセスしてみると、

牛のアスキーアートが現れました。
jsファイルをダウンロードして内容を確認します。
const express = require('express');
const app = express();
const { exec } = require('child_process');
app.use(express.static('public'));
app.get('/cowsay/:message', (req, res) => {
exec(`/usr/games/cowsay ${req.params.message}`, {timeout: 5000}, (error, stdout) => {
if (error) return res.status(500).end();
res.type('txt').send(stdout).end();
});
});
app.listen(3000, () => {
console.log('listening');
});Express を使って、Webサーバ(ポート3000)を起動するpublic フォルダ内のファイルを 静的ファイル として配信する/cowsay/:message にアクセスすると
URLの :message 部分を取り出し
Linuxコマンド cowsay にその文字列を渡して実行する
cowsayの出力結果を テキストとしてそのまま返す
URLで渡した文字列を使って cowsay コマンドを実行し、その結果を表示するWebアプリのようです。
2. 試したこと
URLを変えてみる。/cowsay/aaa

URLを変えてみる。/cowsay/~

ホームディレクトリが表示できた!
コマンドインジェクションを試せるかもしれない。
URLを変えてみる。/cowsay/aaa;ls

ファイル一覧にフラグファイルらしきものが見えた。
ただし、ファイル名がflag.txtではなくfalg.txtであることに注意する。
3. FLAGをゲット!
URLを変えてみる。/cowsay/aaa;cat falg.txt

フラグが見えた!
学んだこと
ユーザー入力をそのまま exec() に渡すと、コマンドインジェクションが発生する
~ が /home/node に展開されたことから、**シェルが介在している(チルダ展開)**と分かった
; を使うことで、元のコマンドとは別のコマンドを連続して実行できる
コマンドインジェクションでは、ls でファイル構成を確認し、cat でフラグを読むという基本的な探索手順が有効
フラグ名が flag.txt とは限らず、ファイル名の typo(falg.txt)にも注意が必要
一見シンプルなサービスでも、外部コマンド実行がある場合は重大な脆弱性につながることを学んだ
はなまるお読みいただきありがとうございました!









コメント