题目
三个文件,都是perl写的,Files存在上传文件,它会将上传的文件内容打印出来
没接触过perl,看了别人的wp,就简单说一下,以后学了perl再来回味
因为它会将上传的文件内容打印出来,所以猜测后台存在param()函数
param()函数会返回一个列表的文件但是只有第一个文件会被放入到下面的file变量中。如果我们传入一个ARGV的文件,那么Perl会将传入的参数作为文件名读出来。对正常的上传文件进行修改,可以达到读取任意文件的目的
大佬们猜的后台代码
use strict;
use warnings;
use CGI;
my $cgi= CGI->new;
if ( $cgi->upload( 'file' ) ) {
my $file= $cgi->param( 'file' );
while ( <$file> ) { print "$_"; }
}
接下来就是payload了
1、先bp抓包,然后将上传的文件名和内容复制一份粘贴,如下:
2、将filename删去,内容修改为ARGV,读取file.pl看看有什么(就猜它在/var/www/cgi-bin/下!)
3、根据返回的信息,可以肯定这里存在parm函数,然后我们利用bash来读取文件,先看看/目录下有哪些文件
4、读取flag文件
补充
1、何为/bin/bash -c
?
/bin/bash -c表示指定将命令转为一个完整命令执行,可以理解为执行linux命令
例:
2、何为${IFS}
?
$IFS
是shell的特殊环境变量,是Linux下的内部区域分隔符。$IFS
中存储的值可以使空格、制表符、换行符或者其他自定义符号,可以在linux中使用${IFS}
代替空格
例:
3、为什么要加|?
|:管道符左边命令的输出就会作为管道符右边命令的输入,这里为什么要加我也没搞明白,如有知道的朋友评论告诉我,谢谢。
举例一个常见的用法吧:
cat后输出的内容,作为|后面内容的输入,这里是交给grep执行
注:经测试,${IFS}和/bin/bash联用时,不代表空格,为啥,有大佬知道的可以告诉下,我之后也去查查资料,如果知道了,会更新。
IFS更详细的可以参考:https://www.jianshu.com/p/2d34ef30361b