SSHで接続できないレンタルサーバー上で、とあるコマンドが使えるかどうかを調べたかった。

そのコマンドは、サーバー仕様には書いてないものでした。PHPからコマンドを実行できることを思い出したので、無理やり叩いて確かめてみました。

下記のコードを書いたPHPファイルをサーバーにアップロード (※誰でもアクセスできるところには絶対に置かないでください) してアクセスすると、入力欄と実行ボタンだけのページが表示されます。入力欄にコマンド入力してボタンを押すと、PHPの passthru() で実行した結果がページ下部に出力されます。

任意のコマンドを実行できるページを表示するPHP
<?php
	$output = '';
	if (isset($_POST['cmd']) && $_POST['cmd'] != '') {
		ob_start();
		passthru($_POST['cmd']);
		$output = ob_get_clean();
	}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8" />
	<title>ターミナルごっこ</title>
</head>
<body>
	<form action="" method="POST">
		cmd: <input style="width:30em;" type="text" name="cmd" /><input type="submit" value="exec" />
	</form>
	<pre>
<?php echo htmlspecialchars($output); ?>
	</pre>
</body>

例えば php --version を実行した結果は次のようになります。

php --version 結果
php --version 結果

PHPには外部プログラムを実行できる関数がいくつかあるけど、passthru()exec()system() とは違って、結果を変形しないでそのまま出してくれるらしいです。結果が戻り値じゃなくて標準出力に吐かれるので、ここでは出力バッファを使って回収してます。

でも、サーバー側の設定でコマンド実行系の関数を使えないようにされてたら、この方法はムリです。できたとしても、あんまり変なことしないように。