Web渗透09_文件包含漏洞

1 文件包含漏洞描述

开发人员编写代码时独立性好是一个很重要的要求,这边一个数据库类,那边一个模型类。几百行的整体代码,在整合时两行行代码就可以包含进来使用。文件包含有助于独立的代码之间的配合!有时引入外部一个插件,也要用到文件包含。以较少的代码量去开发整个应用。不仅方便,代码量少,还美观易阅读。

文件包含常用到include import。这些写在文件头部的包含代码,在预编译时会完整的拷贝到当前文件中来。 下面这段c++代码几乎是绝大多数计算机专业学习程序设计的第一段代码,输出 Hello World!。看似只有7行代码,如果大家真的有看过预编译完成后的代码,就会发现,这段代码中#include<iostream>这一行变成了整整 6000 多行代码。

#include<iostream>
using namespace std;
int main(int argc, char** argv)
{
	cout << "Hello world!\n";
	return 1;
}

1.1 漏洞产生原因

一些开发人员为了方便将文件包含的路径设置为变量,进行动态调用,来应对一些复杂的情况。这种并非写死的调用,若被发现编写漏洞,那么客户端甚至都可以控制包含的文件,造成文件包含漏洞。

1. Web存在动态文件包含
2. 包含路径客户端可控

若存在这个漏洞,一切防御措施都是无效的,一句话木马或者大马过不了安全狗,但是这个漏洞却可以让这些木马过安全狗。

文件包含是所有脚本语言都有的功能,但是在php的应用中漏洞相对出现的可能性较大。 asp jsp中少一点。下面详述以下PHP文件包含漏洞。

1.2 C编译原理

每个编写 C语言 的应用都有一个 gcc 编译器。这个是在 VC VS Dev 里可以找到的。

.c-> 预处理器(cpp) -> .i -> 编译器(ccl) -> .s -> 汇编器(as) .o -> 链接器(ld) -> .exe

image

image

2 PHP文件包含

2.1 函数

函数 区别
include 包含文件,包含失败产生警告继续运行
include_once 文件仅被包含一次,包含失败产生警告继续运行
require 包含文件,包含失败产生错误结束运行
require_once 文件仅被包含一次,包含失败产生错误结束运行

2.2 相关配置

allow_url_fopen = On (允许打开URL文件,预设启用)

本选项激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象例如文件。默认的封装协议提供用 ftp 和 http 协议来访问远程文件,一些扩展库例如 zlib 可能会注册更多的封装协议。

index.php?path=./info.php # 以本地相对或绝对路径包含

allow_url_include = Off (禁止引用URL文件,新版增加功能,预设关闭)

本选项激活了 URL 形式的 fopen 封装协议使得可以凭借include, include_once, require, require_once.访问 URL 对象例如文件。

index.php?path=https://www.baidu.com/robos.txt # http ftp方式的地址包含

两者中 后者影响力更大

2.3 包含特点

  1. 无视文件类型,以文件源编码的格式打开 (包含图片打开是图片的编码)
  2. 无条件执行文件中存在的PHP代码

图片木马的又一种执行方式。

2.4 空字符绕过限制

CVE-2006-7243 在PHP版本小于5.3.4且关闭了魔术引号的配置 magic_quotes_gpc=off 。利用空字符 也就是00截断绕过对包含文件后缀名的限制。

PHP编程中会遇到一些模板视图的包含,下面这个简单的程序对所包含文件后缀名有一个限制。

<?php
if(isset($_GET['path'])){
	include $_GET['path'] . ".html";
}else{
	echo $_GET['path'];
}
?>

http://1.2.3.4/index.php?path=info.php%00即可截断后面的.html。造成PHP文件代码执行。

3 PHP文件包含利用

3.1 包含敏感文件

?path=c:\windows\system32\drivers\etc\hosts

3.2 直接包含本机图片木马

?path=/upload/image/Muma.jpg包含一句话木马。用菜刀对该页面进行连接。

4 PHP封装协议

4.1 file://

可以利用PHP的file://协议访问服务器本地文件系统。
?path=file://c:\windows\system32\drivers\etc\hosts

4.2 php://

可以利用PHP的php://协议传输服务器本地任意PHP文件内容。

?path=file://filter/read=convert.base64-encode/resource=info.php这段代码将info.php的内容以base64的编码进行输出,解码即可查看源码内容。

<?php phpinfo();?>

5 其他的一些方法

  1. 利用日志文件,通过burp抓包修改,通过get请求,于日志文件中写入一句话木马。再包含日志文件即可执行。
    image

  2. 代码审计,通过Seay代码自动审计系统可以发现很多漏洞,其中就能发现包括文件包含漏洞。结合一些其他漏洞,把木马文件包含进去就行。
    image

posted @ 2021-08-16 15:00  Dba_sys  阅读(120)  评论(0编辑  收藏  举报