文件包含漏洞介绍
1.1. 文件包含漏洞解释
文件包含漏洞就是使用函数去包含任意文件的时候,当包含的文件来源过滤不严谨的时候,当存在包含恶意文件后,就可以通过这个恶意的文件来达到相应的目的。
1.2. 文件包含漏洞原理
其实原理就是由于在代码开发的过程中,有时候会遇到相同的代码,不想重复输入,就将代码单独写在一个文件里面,当遇到的时候就直接调用该文件进行运行,而这种方式就会导致客户端可以调用其他的恶意文件,通过恶意文件造成文件包含漏洞。
但是前提也是当文件包含的代码文件被当作一个变量来使用,并且能够被用户传入参数,如果没有对该变量做相应的安全防护,就可能会引发出文件包含漏洞。
1.3文件包含漏洞特点
无视文件扩展名
在PHP中当使用上面的一些函数的时候,这个文件就会被当作PHP代码进行执行,PHP内核并不会在意包含的文件是什么类型的,也就是说当发过来的是.png的文件也会被当作PHP执行
无条件解析PHP代码
文件包含漏洞在读取源码的时候,若遇到符合PHP语法规范的代码,将会无条件执行。
文件包含漏洞发现
其实在文件包含在URL中能够明显的看出来,但是不代表含有这些特征就一定有文件包含漏洞。只不过有这些特征可以进行判断是存在文件包含的,但是能不能利用是另一方面。
比如:
http://www.xxx.com/index.php/?name=x.php
http://www.xxx.com/index.php/?file=index2
本地文件包含(LFI)
本地文件包含,通过意思就能够理解,就是在条件允许的情况下,所谓的条件允许也就是安全防护没做到位,通过这个条件对文件路径加载文件,就形成了本地文件包含。
注意点
如果文件是php、html,文件内容不会显示在页面,而是执行
——————————————————————————————————————————————————
如果被包含文件需要传递参数:必须使用`&`
#xxx.php?content=demo1.php&y=10
——————————————————————————————————————————————————
#本地包含漏洞中,则是先执行本地文件中的代码,然后再将结果传递给应用程序
示例
#测试代码
<?php
$file=$_GET['filename'];
include($file);
?>
_________________________________________________________________________________________
#利用
# 使用绝对路径进行读取 (在linux中同样适用)
#示例
127.0.0.1/include.php?filename=C:\Windows\system.ini
# 使用相对路径进行读取(在linux中同样适用)
#示例
127.0.0.1/include.php?filename=../../windows/system.ini
远程文件包含(RFI)
远程文件包含漏洞导致的原因和本地文件包含漏洞造成的原因是一样的,只不过远程文件包含漏洞是利用外部的服务器中的文件进行执行,就形成了远程文件包含漏洞。
但是前提是需要在php.ini中的配置选项中allow_url_fopen和allow_url_include为ON
注意点
#被访问的文件,一定是可以通过url获取。
#远程包含如果需要传递参数,必须使用`?`
#如果遇到多个参数:参数与参数之间使用%26
##远程包含漏洞中,攻击者先传递远程文件内容,然后再执行其中的代码
示例
#测试代码
<?php
$path=$_GET['path'];
include($path . '/phpinfo.php');
?>
_________________________________________________________________________________________
#利用
# 使用绝对路径进行读取 (在linux中同样适用)
#示例
127.0.0.1/include.php?filename=C:\Windows\system.ini
# 使用相对路径进行读取(在linux中同样适用)
#示例
127.0.0.1/include.php?filename=../../windows/system.ini
文件包含利用方式
注意:先要判断服务器类型
配合文件上传漏洞利用
有时候我们找不到文件上传漏洞,无法上传webshell,可以先上传一个图片格式的webshell到服务器,再利用本地文件包含漏洞进行解析
绝对路径读取
绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径,绝对路径读取就是通过明确的路径进行读取文件,比如windows或者linxu中的一些日志文件存在的路径,或者一些配置文件存放的路径。
windows敏感文件绝对路径
c:\boot.ini #查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml #IIS配置文件
c:\windows\repair\sam #存储Windows的密码
c:\programFiles\mysql\my.ini #mysql配置文件,里面可能有密码
c:\programFiles\mysql\data\mysql\user.MYD #mysql root密码
c:\windows\php.ini #php配置文件
linux敏感文件绝对路径
/etc/passwd #用户密码
/usr/local/app/apache2/conf/httpd.conf #apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf #虚拟网站设置
/usr/local/app/php5/lib/php.ini #php相关设置
/etc/httpd/conf/httpd.conf #apache配置文件
/etc/my.cnf #mysql配置文件
/etc/sysconfig/iptables #查看防火墙策略
相对路径读取
相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。相对路径读取就是当我们不知道某个文件具体路径的时候,使用相对路径以当前位置作为参看向后退,逐次访问
方法
相对利用读取方式就需要使用"../"来进行读取,一次"../"向后退一次。
例如:当我们在C:\tool\PHPTutorial\www的时候,那么我们使用"../"的时候我们就退到C:\tool\PHPTutorial,若使用两次"../"的时候就会退到C:\tool,两次"../"也就是"../../"就可以了。
包含日志利用
日志会记录客户端请求及服务器响应的信息,访问http://www.xx.com/<?php phpinfo(); ?>时,<?php phpinfo(); ?>也会被记录在日志里,也可以插入到User-Agent,但是请求的信息有可能被url编码之后记录日志,这里可以通过burp来发送请求包来防止被编码,通过相对路径找到日志文件,利用包含漏洞执行。
各类日志存在位置
Apache
apache存在两个文件日志文件,access.log是记录登录等信息的日志文件,而error.log是错误文件。
Windows系统:
apache安装目录/logs/access.log或者error.log
linux系统:
/var/log/apache/access.log或者error.log
/var/log/apache2/access.log或者error.log
/etc/httpd/logs/access_log或者error.log
Nginx
nginx存在两个文件日志文件,access.log是记录登录等信息的日志文件,而error.log是错误文件。
Windows系统:
nginx安装目录/logs/access.log或者error.log
2)linux系统:
/var/log/nginx/access.log或者error.log
IIS
iis6.0版本
C:\windows\system32\LogFiles
iis7.5版本
%SystemDrive%\inetpub\logs\LogFiles
包含临时文件利用
php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用C:\windows\temp目录。在临时文件被删除前,可以利用时间竞争的方式包含该临时文件。
由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的是随机函数有缺陷,而windows下只有65535种不同的文件名,所以这个方法是可行的。
另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,直接包含即可。
这个方法可以参考LFI With PHPInfo Assistance(https://insomniasec.com/downloads/publications/LFI%20With%20PHPInfo%20Assistance.pdf)
包含SESSION文件
远程文件读取
前提条件:目标服务器的allow_url_fopen选项是on。只有当这个选项是on的时候就能够使用远程文件包含一句话木马。
就是使用远程文件包含的方式构建参数使受害主机访问恶意主机的恶意文件
伪协议利用
PHP内置了很多URL风格的封装协议,可用于类似fopen()、copy()、file_exists()和filesize()的文件系统函数
file:// #访问本地文件系统
http:// #访问HTTPs网址
ftp:// #访问ftp URL
php:// #访问输入输出流
zlib:// #压缩流
data:// #数据
ssh2:// #security shell2
expect:// #处理交互式的流
glob:// #查找匹配的文件路径
伪协议利用条件
file利用方式
file:// 用于访问本地文件系统,file其实和绝对路径读取差不多
http利用方式
http这里的利用方式,除了能够跳转,还能进行远程包含进行漏洞执行,就是按照http协议访问恶意网站的恶意文件进行包含漏洞攻击
data利用方式
从php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是php代码,就会执行任意代码。
利用条件:
- allow_url_fopen :on
- allow_url_include:on
POC
data://text/plain,<?php phpinfo();?>
//如果此处对特殊字符进行了过滤,我们还可以通过base64编码后再输入:
data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
php利用方式
php:// 访问各个输入/输出流(I/O streams)
php://filter用于读取源码。
php://input用于执行php代码。
php://filter
读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。也可以进行相对路径的读取
利用条件:
- allow_url_fopen :off/on
- allow_url_include:off/on
POC
用法:php://filter/read=convert.base64-encode/resource=要读取的文件
URL:http://192.168.10.150/1.php/?name=php://filter/read=convert.base64-encode/resource=2.php
解密:<?php phpinfo();?>
php://input
可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
利用条件:
- allow_url_fopen :off/on
- allow_url_include:on
通过此方法,可以进行敏感文件的读取和webshell的上传
php://input主要是用来执行php代码的,不过php://input需要以POST提交,这里我们先在URL中添加php://input然后抓包把GET修改为POST,最后在数据包的最后输入想要执行的代码就可以实现代码执行。
ZIP利用方式
zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。
- zip://中只能传入绝对路径。
- 要用#分割压缩包和压缩包里的内容,并且#要用url编码成%23(即下述POC中#要用%23替换)
- 只需要是zip的压缩包即可,后缀名可以任意更改。
- 相同的类型还有zlib://和bzip2://
利用条件:
- allow_url_fopen :off/on
- allow_url_include:off/on
POC
zip://[压缩包绝对路径]#[压缩包内文件]?file=zip://D:\1.zip%23phpinfo.txt
文件包含绕过手法
查看改文章的绕过手法即可,或者其他请自便
https://blog.csdn.net/MachineGunJoe/article/details/131143959
文件包含漏洞防御
查看改文章的防御即可,或者其他请自便
https://blog.csdn.net/MachineGunJoe/article/details/131143959
https://blog.csdn.net/m0_46467017/article/details/126380415