0x01 考点关键词
Perl、任意文件读取
0x02 分析
打开看到提示说后端使用的是 Perl 语言 , 从 URL 可以得知是 CGI( 公共网关接口 ) 应用
Lola·2020-04-29·29 次阅读
Perl、任意文件读取
打开看到提示说后端使用的是 Perl 语言 , 从 URL 可以得知是 CGI( 公共网关接口 ) 应用
可以用 Perl 中的 ARGV 全局特殊文件句柄进行任意文件读取
读取文件还需要用到一个知识点 : Perl Open() 函数
扫一下目录:
害没学过Perl,参考一波这个文章:Learn Perl in about 2 hours 30 minutes
首先要了解 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
为例 , 因为大部分系统都有这个文件 , 且任何用户都可读成功读取到 /etc/passwd
。
Perl Open() 函数可用于打开管道 , 用户可以使用 " | " 作为分割符 , 因为 Perl 会寻找 " | "来表示 Open() 正在打开一个管道 , 我们可以劫持 Open() 调用 ,从而执行系统命令
参考资料:https://www.guildhab.top/?p=867
Comments | NOTHING