ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于BMZCTF hitcon_2017_ssrfme的解法

2021-01-12 10:00:25  阅读:290  来源: 互联网

标签:文件 ssrfme 执行 BMZCTF get filename 命令 flag hitcon


在BMZCTF中,有一道题是hitcon_2017_ssrfme,在尝试做了该题后,又翻看了现有的write-up,发现现有的write-up语焉不详,对于不原理和微操讲解不细,因此写了这篇文章,主要是在前人的基础上对此题进行进一步描述,主要针对刚接触此领域的小白用户,希望能够对他们理解这道题提供帮助。
首先,打开本题,可以看到下列代码:

 <?php 
    $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]); 
    @mkdir($sandbox); 
    @chdir($sandbox); 

    $data = shell_exec("GET " . escapeshellarg($_GET["url"])); 
    $info = pathinfo($_GET["filename"]); 
    $dir  = str_replace(".", "", basename($info["dirname"])); 
    @mkdir($dir); 
    @chdir($dir); 
    @file_put_contents(basename($info["basename"]), $data); 
    highlight_file(__FILE__); ?>

简要分析上述代码,基本功能是这样的:
首先,为每一个用户建立沙箱,路径是在本地路径的基础上/sandbox/【字符串“orange”和ip地址】的md5码。
然后进入该沙箱进行工作。
然后执行get命令,(在这里,get是perl的一个命令,可以对远程的文件进行拉取)get命令的参数(用户通过url变量的方式进行get传入)可以被控制,但是后台使用了escapeshellarg对用户输入进行过滤。(不能使用传统的||链接符的方式进行命令执行)
然后根据用户get方式传入的filename变量,将上述命令执行的结果,放入到filename中,并且,对filename进行了限制,不允许通过…/的方式改变传入文件的位置。如果filename有地址,则会把当前目录改变到filename绝对路径下。
最后,把data中的内容(执行get 命令的结果)传入到filename中。

这道题突破点都在第五行,即执行的GET命令上,必须对perl中GET命令缺陷有了解,才能找到对应的思路。
这道题有两种解法,第一种需要一个公网服务器,在服务器上创建一个本地payload,然后控制url参数访问本地的payload,之后就能够反弹得到shell了;下面我主要来讲解一下第二种,即利用GET中的open函数漏洞。
open函数在GET命令被调用时执行,也就是第五行执行GET命令时,perl语言会调用open命令,漏洞就存在于open命令对于文件的处理上,关于这个漏洞,外国人有文章,是这样写的:
Perl saw that your “file” ended with a “pipe” (vertical
bar) character. So it interpreted the “file” as a command to be executed, and interpreted the command’s output as the “file”'s contents. The command is “who” (which prints information on currently logged-in users). If you execute that command, you will see that the output is exactly what the Perl program gave you.
翻译过来意思是:
perl函数看到要打开的文件名中如果以管道符(键盘上那个竖杠)结尾,就会中断原有打开文件操作,并且把这个文件名当作一个命令来执行,并且将命令的执行结果作为这个文件的内容写入。这个命令的执行权限是当前的登录者。如果你执行这个命令,你会看到perl程序运行的结果。

因此,我们可以构造这样的payload:
首先:
url=【任意】&filename=cat /flag|
如下所示:
第一步:构造payload文件
之所以要进行这一步,是因为构造一个文件名为cat /flag|的文件,open函数只有在找到指定文件文件名的情况下才会把该特殊形式的文件当作命令在执行。
完成这一步,访问cat /flag|文件,会发现该文件存在(具体内容是什么不重要),如下所示:
在这里插入图片描述
其次,
url=file:cat /flag|&filename=/123.txt
如下所示:
第二步
之所以要进行这一步,是因为url要作为open的一个参数,打开上述构造好的文件,前面已经讲过,当文件名以管道符结尾时,该文件名所指的命令会被中断执行,及cat /flag会被执行,并且根据这道题的特性,该命令执行的结果会被写入到filename所指定的文件中,因此,访问filename所指定的文件,就可以看到结果了。如下所示:
结果

最后,为了照顾小白,在这里讲解一下sandbox和flag位置的问题,大神们可以直接略过:
sandbox的问题很好解决,直接百度搜索【IP地址】,就可以查看自己所连入的第一个公网IP,其次用orange和IP地址组合后,生成md5码即可,这里就不再详述了。
至于为什么知道flag位置是/flag,其实这是BMZCTF的“惯例”,如果要对此较真,也可以在一开始执行ls /命令,进而找到/flag的位置。

标签:文件,ssrfme,执行,BMZCTF,get,filename,命令,flag,hitcon
来源: https://blog.csdn.net/weixin_40228200/article/details/112481089

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有