1. 进入环境,查看题目

使用dirsearch扫一下,如图:

没有什么问题,第二个Forms点击去后,发现有回显,于是思考sql注入?一顿操作,发现也没有什么有用的信息。。。麻了!
2. 问题分析
- 点击Files,发现可以上传文件
上传个txt试试,发现上传啥就回显啥。另外发现页面都是.pl,查了查,是脚本语言perl。大概能get到出题的突破口,利用perl漏洞或者回显注入,从而拿到后台的flag,无奈对perl不熟,无从下手,查看wp后跟着操作来。
抓包上传文件,看看传输的内容,如图:

a.txt内容为123,上传什么出现什么,大神们就能猜到代码了。。。我也是服气。
因为它会将上传的文件内容打印出来,所以猜测后台存在param()函数。param()函数会返回一个列表的文件但是只有第一个文件会被放入到下面的file变量中。如果我们传入一个ARGV的文件,那么Perl会将传入的参数作为文件名读出来。对正常的上传文件进行修改,可以达到读取任意文件的目的。我们不猜代码,一步步来:
复制下面一遍代码,将filename删去,内容修改为ARGV,读取file.pl看看有什么(就猜它在/var/www/cgi-bin/下!)同时修改POST地址后的参数,作为要读取的文件,如图:

我么可以看到回显源码:

果然验证了有param()函数的猜想。
- 利用bash读取一下主目录有啥文件
/cgi-bin/file.pl?/bin/bash%20-c%20ls${IFS}/|
%20是空格,原始命令为:/cgi-bin/file.pl?/bin/bash -c ls${IFS}/|,为什么这么构造?后面有解释,先看效果:

-
发现目录中有flag,同样套路读取flag
如图:
cyberpeace{caddee4d044004c61124d0029e8d496c} -
- 何为/bin/bash -c?
/bin/bash -c表示指定将命令转为一个完整命令执行,可以理解为执行linux命令
例:

- 何为${IFS}?
I F S 是 s h e l l 的 特 殊 环 境 变 量 , 是 L i n u x 下 的 内 部 区 域 分 隔 符 。 IFS是shell的特殊环境变量,是Linux下的内部区域分隔符。 IFS是shell的特殊环境变量,是Linux下的内部区域分隔符。IFS中存储的值可以使空格、制表符、换行符或者其他自定义符号,可以在linux中使用${IFS}代替空格
例:

- 为什么要加|?
|:管道符左边命令的输出就会作为管道符右边命令的输入,这里为什么要加我也没搞明白,如有知道的朋友评论告诉我,谢谢。
举例一个常见的用法吧:cat后输出的内容,作为|后面内容的输入,这里是交给grep执行

- 注:经测试,${IFS}和/bin/bash联用时,不代表空格
- 何为/bin/bash -c?
自行做测试后发现${IFS}被识别为根目录符号,但是不知道为什么会这么识别,另外管道符|,我认识是需要将内容作为ARGV的输入打包,用于显示出查找的内容个。
3. 总结
参考博文:
- https://www.freesion.com/article/7171487849/
- https://www.jianshu.com/p/2d34ef30361b
- https://blog.csdn.net/whuslei/article/details/7187639
- https://metacpan.org/pod/CGI
太难了,这题跟着wp操作下来的,PERL和shell知道太少了,仅做记录和总结吧
博主通过Dirsearch探测发现Perl脚本回显漏洞,利用upload文件功能,通过修改参数和使用`/bin/bash-c`执行命令,成功读取并展示flag。文章详细解析了Perl的param()函数和IFS环境变量的应用。
4607

被折叠的 条评论
为什么被折叠?



