文件包含漏洞

直接执行代码的函数:
Eval()、assert()、system()、exec()、shell_exec()、passthru()、

Escapeshellcmd()、pcntl_exec()等就不一一举例了。

1、eval()

eval() 函数把字符串按照 PHP 代码来计算,如常见的一句话后门程序:<?php
eval($_POST[cmd])?>

2、assert() 与eval类似,字符串被 assert() 当做 PHP 代码来执行;

PHP文件包含漏洞
开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用。正是这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

常见的导致文件包含的函数:

PHP:include()、include_once()、require()、require_once()等;
1.php文件包含可以直接执行包含文件的代码,包含的文件格式不受任何限制
在 php 中提供了四个文件包含函数:
(1) Require: 找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本;
(2) Include:找不到被包含的文件时只会产生一个(E_warinng),脚本将继续执行;
(3) Require_once:与 include 类似会产生警告,区别是如果文件代码已经被包含,则不会再
次被包含;

2、文件包含漏洞利用的前提条件:
(1)web 应用采用 include 等文件包含函数,并且需要包含的文件路径是通过用户传输参
数的方式引入;
(2)用户能够控制包含文件的参数,被包含的文件可被当前页面访问;

3、文件包含获取 webshell 的条件:
(1)攻击者需要知道文件存放的物理路径;
(2)对上传文件所在目录拥有可执行权限;
(3)存在文件包含漏洞;

4、典型特征
变量的值为一个页面:
?page=a.php
?home=b.html
?file=content…

5、常见的敏感路径:
1 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 配置文件

2 UNIX/Linux
/etc/passwd
/usr/local/app/apache2/conf/httpd.conf //apache2 默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //PHP 相关配置
/etc/httpd/conf/httpd.conf //apache
/etc/php5/apache2/php.ini //ubuntu 系统的默认路径

日志默认路径
(1) apache+Linux 日志默认路径
/etc/httpd/logs/access_log
或者
/var/log/httpd/access_log

(2) apache+win2003 日志默认路径
D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log

(3) IIS6.0+win2003 默认日志文件
C:\WINDOWS\system32\Logfiles

(4) IIS7.0+win2003 默认日志文件
%SystemDrive%\inetpub\logs\LogFiles

(5) nginx 日志文件
日志文件在用户安装目录 logs 目录下
以我的安装路径为例/usr/local/nginx,
那我的日志目录就是在/usr/local/nginx/logs里
web 中间件默认配置
(1) apache+linux 默认配置文件
/etc/httpd/conf/httpd.conf
或者
index.php?page=/etc/init.d/httpd
(2) IIS6.0+win2003 配置文件
C:/Windows/system32/inetsrv/metabase.xml
(3) IIS7.0+WIN 配置文件
C:\Windows\System32\inetsrv\config\applicationHost.config

5、文件 PHP 中的文件包含分为本地包含和远程包含:
(1)远程文件包含(RFI) 一般 PHP 默认关闭远程包含,开启远程文件包含功能需要在 php.ini 中修改:
Allow_url_include = on

(2)本地包含(LFI)

Index.php:
<?php
phpinfo();
?>
a. php:
<?php
include("index.php")
?>

无论 index.php 文件的扩展名改为:jpg、rar、txt、进行测试都可以被 php 解析(只要符合
php 代码规范)。若包含非 php 语法规范的源文件,将会暴露其源代码。

(4)本地包含配合文件上传
当一个网站能够文件上传,但是是基于白名单过滤的,如果此时有文件包含漏洞那么就可
以绕过过滤规则拿 shell。

<?fputs( fopen(“shell.php” ,”w” ) ,”<?php eval($_POST[123]); ?>” )?>

通过文件包含漏洞访问此页面,就会在所在目录下生成 shell.php。
(5)使用 PHP 封装协议
File:// 访问本地文件系统
http:// 访问 HTTPs 网址
ftp:// 访问 ftp URL
Php:// 访问输入输出流
Zlib:// 压缩流
Data:// 数据
Ssh2:// security shell2
Expect:// 处理交互式的流
Glob:// 查找匹配的文件路径

可用于:include()、require()、include_once()、require_once()、highlight_file()、show_source()、
readfile()、foopen_file()、file_get_content()
关于 php 的配置文件:

(1)allow_url_fopen: off/on 路径:/etc/php/7.0/apache2/php.ini
(2)allow_url_include: off/on 路径:/etc/php/7.0/apache2/php.ini

文件包含漏洞一般带有目录遍历漏洞
利用文件包含漏洞来连接自己上传到其他位置的马(通过上传要求并且带有目录可解析的马),从而菜刀连接来使用。如果不用目录穿越的话自己上传马的位置可能不会被允许访问,从而造成连接失败。

在使用远程包含时,不能包含.php文件,否则会执行不成功,但是可以执行.php文件中的echo输出语句。包括使用php://filter/read=convert.base64-encode/resource= 去读取源码时也不能。必须保证不是.php结尾。

                     包含apache日志文件

某个 PHP 文件存在本地包含漏洞导致无法上传文件,此时可以找到 apache 的安装路径,利用包含漏洞包含 apache 日志也可以获取 webshell。

一般情况下 apache 会存在两个日志文件,access.log(访问日志)和 error.log(错误日志)。

当访问一个不存在的资源时,Apache日志同样会记录,并写到accsee.log文件中,这时再去包含
Apache的日志文件,就可以利用包含漏洞。

但实际是不可行的,因为在访问URL后一句话木马在日志文件里变形了

127.0.0.1 – – [04/Jun/2013:15:04:22 +0800] “GET
/%3C?php%20phpinfo()?%3E HTTP/1.1” 403 291

PHP代码中的”<,>,空格”都被浏览器转码了,这样就无法利用Apache包含漏洞。
但可以通过Burp绕过编码

在window环境下,存在Apache\logs。一个是访问日志,一个是错误日志。通过在url处制造错误,从而将错误写入错误日志中并且进行包含错误日志操作 。达到getshell的效果。

《文件包含漏洞》

此时发现写入错误日志中的文件被转义了,这时应该使用burp抓包来对数据转义。

《文件包含漏洞》更改为

《文件包含漏洞》这时候在进入error.log查看
《文件包含漏洞》进行包含

《文件包含漏洞》在这里error.log不可以很长,否则无法包含。

    原文作者:Brain-x
    原文地址: https://blog.csdn.net/qq_39431542/article/details/88628225
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞