尝试制作一个简单的Perl脚本,该脚本查看GET参数以确定要使用的php版本,然后传递请求。以下是整个脚本:
#!/usr/bin/perl
use FCGI;
$cnt = 0;
local ($buffer, @pairs, $pair, $name, $value);
while(FCGI::accept >= 0){
$php = "php";
$ENV{PHP_FCGI_CHILDREN}=3;
$ENV{PHP_FCGI_MAX_REQUESTS}=5000;
$buffer = $ENV{'QUERY_STRING'};
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
if($name == "php") {
$php = "php".$value;
}
}
print "Content-Type: text/html'r'n'r'n";
print `$php $ENV{PATH_TRANSLATED}`;
}
这个想法是PHP版本可以通过GET参数进行切换。。。当我使用phpversion()
进行测试时,该部分似乎工作良好。
因此,这似乎是"工作",但一个带有简单<?php phpinfo(); ?>
的测试文件输出的是纯字符串,而不是格式化的HTML。它给出了确切的输出,就好像phpinfo()是从命令行运行的一样,因为这正是发生的事情
所以我的问题有两部分是
- 这真的是个问题吗
- 如何将请求"传递"给PHP,而不是调用命令行
您在那里构建了一个不错的命令注入漏洞。
QUERY_STRING='0=5;echo "fail_at_Web_security_forever";rm -rf /'
字符串比较是eq
,而不是==
。您必须验证用户输入、白名单可接受输入并拒绝所有其他输入。缺少标准的CGI参数解析库对于这样的糟糕代码来说是典型的:使用CGI.pm或类似的代码。
要转发/代理请求,请通过HTTP:使用LWP::UserAgent或类似方法调用PHP。