与Shell交互时的PHP行为
我正在尝试使用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"); ?> 您可以看到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 这一次,我仍然没有在system()的输出中看到ARG,但我确实看到了额外的输出,因为参数为: PID:0 Set: // Omitted some output ARG () { echo hello } 所以我的问题是,为什么我不通过system()在set输出中看到参数ARG,而是通过参数在set输出中看到它? 编辑: 修改问题使其更清晰:在PHP代码中,我调用system(set)(最后一行)VS我将set作为查询字符串的一部分传递.通过system()执行的set不会在shell变量中显示ARG的存在显示从查询字符串执行的VS集合(尽管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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |