Σ(゚∀゚ノ)ノ✓参见龙王

XCTF–i-got-id-200

0x01 考点关键词

Perl、任意文件读取

0x02 分析

打开看到提示说后端使用的是 Perl 语言 , 从 URL 可以得知是 CGI( 公共网关接口 ) 应用

可以用 Perl 中的 ARGV 全局特殊文件句柄进行任意文件读取

读取文件还需要用到一个知识点 : Perl Open() 函数

扫一下目录:

0x03 学习过程

害没学过Perl,参考一波这个文章:Learn Perl in about 2 hours 30 minutes

ARGV

首先要了解 Perl 中的 ARGV 全局特殊文件句柄

菜鸟教程上给出的解释是这样的

这个 @ARGV 是个全局 数组特殊变量 , 教程里是这样解释的

Perl 会将 perl 命令行参数列表放入到数组 @ARGV 中 , 而默认情况下 , 这些命令行参数是 Perl 的数据输入源 , 也就是 Perl 会以依次将他们当作文件进行读取

param()函数会返回一个列表的文件 , 但是根据后端代码 , 只有第一个文件会被放入到 <file> 变量中

这里就存在可利用的点!

如果在原来的数据包中新增一个文件上传项 , 并且删除其 filename 参数 , 看一看 $file 变量的值( 也就是文件名 )会是怎么样的?

后端会将第一个上传项的内容作为 $file 参数的值 , 因此我们可以 $file 变量的值

如果 $file 变量的值是 ARGV 文件句柄 , 读取后的结果是怎样的呢? @ARGV 数组的内容又是怎样的呢?

正如之前所说的 , ARGV 文件句柄会将 @ARGV 数组的每一项作为文件名并读取它们的内容。

那么如何控制 @ARGV 数组的内容呢 ? 请看下面两张图

可以看到 , 在 URL 后添加的路径会被放入到 @ARGV 数组中 , 配合之前引入的 ARGV 文件句柄 , 我们就可以读取任意文件 !

成功读取到 /etc/passwd

关于 Perl open() 函数

Perl Open() 函数可用于打开管道 , 用户可以使用 " | " 作为分割符 , 因为 Perl 会寻找 " | "来表示 Open() 正在打开一个管道 , 我们可以劫持 Open() 调用 ,从而执行系统命令

参考资料:https://www.guildhab.top/?p=867

退出移动版