我想测试PHP与bash shell(版本4.2)的交互。我的bash shell没有进行shellshock修补(是的,我知道如何进行修补;我正在虚拟机上进行测试;我更关注PHP与shell的交互)。
我有一个简单的PHP程序,它通过查询字符串获取参数,通过
在输出中,我可以看到以下行:
这次,参数设置如下:
这次,我仍然没有在
那么我的问题是,为什么我通过
以下是完整输出:http://pastebin.com/raw.php?i=WcBXgYAj 如果我将
我有一个简单的PHP程序,它通过查询字符串获取参数,通过
putenv()
将其添加到环境中,然后使用system()
运行一个命令。该脚本如下:<?php
function getParam()
{
$arg = NULL;
if (isset($_GET["arg"]) && !empty($_GET["arg"]))
{
$arg = $_GET["arg"];
}
return $arg;
}
$arg = getParam();
putenv("ARG=$arg");
system("set");
?>
你可以看到,system()
函数使用 set
命令来打印 shell 变量。我最初尝试使用以下命令:
curl http://localhost/myphp.php?arg=123
在输出中,我可以看到以下行:
ARG=123
受到Shellshock漏洞的启发,我接下来改变了我的论点:
curl http://localhost/myphp.php?arg="()%20%7B%20echo%20hello;%20%7D;"
这个参数基本上是这样设置的:
arg=() { echo hello; };
当我运行脚本时,我在set的输出中没有看到ARG
。
但是我将curl请求更改如下:
curl http://localhost/myphp.php?arg="()%20%7B%20echo%20hello;%20%7D;%20echo%20PID:%20;%20echo%20%24%24%20;%20echo%20Set:%20;%20set%20"
这次,参数设置如下:
arg=() { echo hello; }; echo PID:; echo $$; echo Set:; set
这次,我仍然没有在
system()
的输出中看到ARG
,但由于参数原因,我看到了额外的输出,如下所示:PID:0
Set:
// Omitted some output
ARG ()
{
echo hello
}
那么我的问题是,为什么我通过
system()
在set
输出中看不到参数ARG
,而在参数中却能看到呢?
编辑:
重新表述问题以使其更清晰:在PHP代码中,我调用system(set)
(最后一行)与将set
作为查询字符串的一部分传递。通过system()
执行的Set不显示shell变量中的ARG
,而通过查询字符串执行的set
是显示的(尽管PID输出为0 - 因此必须考虑这一点来解释这个问题)。以下是完整输出:http://pastebin.com/raw.php?i=WcBXgYAj 如果我将
system(set)
更改为system(env)
,则会看到输出:http://pastebin.com/raw.php?i=q1r6Z3Zi
set
命令与显式调用set
命令的system
调用之间的区别。(我一直在试图弄清楚为什么0
会出现在第一行和PID:
同一行的情况。) - Etan Reisner