Perl webscript 可疑的安全性

Perl webscript doubtful security

最近在一个项目中,我继承了一个生成页面 PDF 的简单 perl 脚本:

#!/usr/bin/perl
use CGI;

my $file="showdata.pdf";
my $filepath= "/tmp/$file";
system("wkhtmltopdf \"sample.com/showdata.php?".$ENV{"QUERY_STRING"}."\" $filepath");
print ("Content-Type:application/x-download\n");
print ("Content-Disposition: attachment; filename=$file\n\n");

open FILE, "< $filepath" or die "can't open : $!";
binmode FILE;
local $/ = 240;
while (<FILE>){
    print $_;
}

close FILE;
unlink ($filepath);

我担心直接替换变量 $ENV{"QUERY_STRING"}。但是,在粗略的测试中,我没有发现任何问题。我无法 create/delete 已知可写目录中的文件。我试了不好还是脚本有问题不应该?

是的,这是不安全的。如果 QUERY_STRING 是 "; rm -fr /; 怎么办?

那么您的 system 调用将是:

wkhtmltopdf "sample.com/showdata.php?"; rm -fr /; /tmp/showdata.pdf

直接访问 $ENV{"QUERY_STRING"} 是不安全的。在我的例子中,我的数字参数 'o' 必须强制为整数。有安全脚本版本:

#!/usr/bin/perl
use CGI;
my $query = new CGI;
my $o = int($query->param('o'));
my $file="showdata.pdf";
my $filepath= "/tmp/$file";
system("wkhtmltopdf \"sample.com/showdata.php?o=".$o."\" $filepath");
print ("Content-Type:application/x-download\n");
print ("Content-Disposition: attachment; filename=$file\n\n");

open FILE, "< $filepath" or die "can't open : $!";
binmode FILE;
local $/ = 240;
while (<FILE>){
    print $_;
}

close FILE;
unlink ($filepath);

如果您担心安全问题,运行 您的带有污点选项的 Perl 脚本 -T

例如,以下脚本将停止您的脚本并发出警告:Insecure $ENV{PATH} while running with -T switch at ./foo.pl line 4.

#!/usr/bin/perl -T

my $foo = $ENV{FOO};
system("ls -l $foo");

注意:如果您只需要警告,可以使用选项 -t 代替 -T