[CSAWQual 2016]i_got_id
知识点
解题步骤
题目有3个链接。
还以为是模板注入,但确实能注。奈何确实走不通。
然后另外一个是文件上传。
网上有源码:
use strict;
use warnings;
use CGI;
my $cgi= CGI->new;
if ( $cgi->upload( 'file' ) ) {
my $file= $cgi->param( 'file' );
while ( <$file> ) { print "$_"; }
}
读取文件
Perl 使用一种叫做文件句柄类型的变量来操作文件 , 从文件读取或者写入数据都需要使用到文件句柄 .
文件句柄( file handle )是一个I/O连接的名称 , Perl 中提供了三种文件句柄 : STDIN , STDOUT , STDERR , 分别代表标准输入 , 标准输出 , 标准错误输出
这里就要使用到 Perl 中的尖括号运算符( <> )了 , 它有如下的用途
如果尖括号中间是文件句柄 , 尖括号运算符允许读取文件句柄
如果尖括号中间是搜索模式 , 尖括号运算符能返回与该模式相匹配的的文件列表 ,这被称为一个 glob , 比如 <*.bat>
如果尖括号内没有任何内容 , 那么它可以读取命令行上所有的文件内容 , 如果没有文件名 , 则可以读取标准输出
这里需要使用 读取文件句柄 这个功能
输出文件内容
前面读取到了文件句柄 , 那么如何输出文件的内容呢 ?
这里要用到 Perl 中的特殊变量 $
$ 是默认参数的意思,指的是在不指定的情况下,程序处理的上一个变量 .
比如打开一个文本文件 , 读取每一行 ,在没有指定参数的情况下 , $ 指向从文件中读取的每一行 .
因此 , 若想要读取某个文件的内容 , 可以写一个循环 , 逐行读取文件的内容
while ( <$file> ) { print "$"; }
首先要了解 Perl 中的 ARGV 全局特殊文件句柄
菜鸟教程上给出的解释是这样的
这个 @ARGV 是个全局 数组特殊变量 , 教程里是这样解释的
Perl 会将 perl 命令行参数列表放入到数组 @ARGV 中 , 而默认情况下 , 这些命令行参数是 Perl 的数据输入源 , 也就是 Perl 会以依次将他们当作文件进行读取
param()函数会返回一个列表的文件 , 但是根据后端代码 , 只有第一个文件会被放入到
这里就存在可利用的点!
所以先随便上传一个文件,抓包
然后修改内容,再用get传参,可以读取到文件
然后直接读flag
不懂为啥,复现不了wp里面的代码执行。还是太菜了。。。。