(文章目录)


前言

Perl 文件上传是一种使用Perl编程语言编写的文件上传脚本或程序,它可以将文件从本地计算机上传到 Web 服务器或远程服务器。 Perl 文件上传脚本通常由客户端和服务器端两个部分组成。客户端部分通常是一个HTML表单,用户可以使用它选择要上传的文件。服务器端部分是由Perl编写的脚本,它可以从客户端接收文件并将其保存到服务器上的指定位置。使用Perl文件上传脚本可以极大地简化文件上传的过程,提高效率和用户体验。

ARGV 是 Perl 中的一个内置变量,用于获取命令行参数。它可以接受从命令行传递过来的参数,并将它们传递给 Perl 脚本。然而,当不正确地使用 ARGV 变量时,可能会导致安全漏洞,例如任意文件读取和任意命令执行。

任意文件读取漏洞:

当 Perl 脚本中使用 ARGV 变量处理文件时,攻击者可以通过输入恶意构造的文件名来实现读取系统中任何文件的目的。例如:

perl script.pl ../../../etc/passwd

上面的命令将会读取读取系统的 /etc/passwd 文件。攻击者可以通过这种方式读取任何他有权限读取的文件。

任意命令执行漏洞:

当 Perl 脚本中使用 ARGV 变量处理命令行时,攻击者可以通过输入恶意构造的命令行参数来执行任意的系统命令。例如:

perl script.pl `ls -la`

上面的命令将会执行 ls -la 命令并返回结果。攻击者可以通过这种方式执行任何他有权限执行的命令。

如何避免 ARGV 安全漏洞:

为了避免 ARGV 安全漏洞,需要在使用 ARGV 变量之前,对命令行参数做必要的过滤和验证,确保只接受预期的参数。例如,可以使用 File::Basename 模块来获取文件名的基本名称,并且对于接下来使用的任何文件名必须进行检查、过滤和验证,确保只使用合法的文件名。

另外,还可以使用 Perl 的 taint mode(-T)来在脚本运行时自动检查所有从外部输入的数据,包括命令行参数和环境变量等。使用 taint mode 可以有效地防止应用程序受到攻击者的恶意输入,从而提高程序的安全性。

一、i-got-id-200

1.题目

在这里插入图片描述

2.答题

进入场景后有3个链接,点进去都是.pl文件,.pl文件都是用perl编写的网页文件。

在这里插入图片描述 尝试后发现,Files链接可以上传文件并把文件内容打印出来。猜想后台应该用了param()函数。

param()函数会返回一个列表的文件但是只有第一个文件会被放入到下面的接收变量中。如果我们传入一个ARGV的文件,那么Perl会将传入的参数作为文件名读出来。对正常的上传文件进行修改,可以达到读取任意文件的目的。

这里附上网上大佬们猜测的后台代码:

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

1、盲猜,flag在根目录下 在这里插入图片描述

得到flag:cyberpeace{a161fdc4a88432bf86a6fddaa1fe1e22}

2、正常流程解析

直接先读取file.pl文件,盲猜在/var/www/cgi-bin/file.pl试试

在这里插入图片描述 发现确实使用了param()函数,然后我们利用bash来进行读取当前目录下的文件。

payload为

?/bin/bash%20-c%20ls${IFS}/| 

%20为空格,可换成+号

看了大佬的解释为

通过管道的方式,执行任意命令,然后将其输出结果用管道传输到读入流中,这样就可以保证获取到flag文件的位置了。这里用到了${IFS}来作命令分割,原理是会将结果变成bash -c "ls/"的等价形式。

在这里插入图片描述

列出了当前目录下的内容,发现flag,直接读取。

3、直接执行

?ls%20-l%20/%20|
?/flag    #直接读取/flag文件内容
或者
?cat%20/flag%20|  #使用命令读取/flag文件内容

直接读取flag