![相当于 PHP $_POST 的 Shell 脚本](https://linux22.com/image/58968/%E7%9B%B8%E5%BD%93%E4%BA%8E%20PHP%20%24_POST%20%E7%9A%84%20Shell%20%E8%84%9A%E6%9C%AC.png)
例如和学习目的,我有一个网页,使用POST
方法来提交文本字段。我有一个运行脚本(bash)的服务器,我想显示“Query_string”是什么。我也不完全熟悉 PHP,但我认为$_POST
将用于打印提交的文本。我使用的脚本是bash。我可以用什么来打印提交的文本?
答案1
正如第一条评论所指出的,CGI 规范表示 POST 数据将位于标准输入上,并使用表单指定的 enctype 进行编码。然而,所有方法都应该被支持:multipart/form-data
、application/x-www-form-urlencoded
和 HTML5'stext/plain
这是一个非常快速的测试脚本,您可以使用:
#!/bin/sh
echo Content-type: text/plain
echo
echo Environment
printenv
echo POST contents
cat
CONTENT_TYPE 变量将设置为数据使用的方法。
如果是application/x-www-form-urlencoded
,那么您将看到经典的 key=value&key=value 语法,并且您必须记住对其进行 URL 转义。
如果是multipart/form-data
,那么它就是 MIME,您应该注意,之前已经有针对 MIME 解析器的漏洞利用。
如果是新的 HTML5 text/plain
,则只需按原样从 stdin 获取整个输入即可。此方法用于文件上传,而不是表单提交;您可以安全地将 stdin 文件描述符提供给另一个进程,而无需解码 URL 或 MIME。
我想回应其他人的警告。如果您没有针对 shellshock 进行修补,只需让攻击者运行 CGI 就足以利用您的系统(他们所要做的就是覆盖您所有常用的 shell 命令,并且他们一定会找到您使用的命令)。