490
社区成员
![](https://csdnimg.cn/release/cmsfe/public/img/topic.427195d5.png)
![](https://csdnimg.cn/release/cmsfe/public/img/me.40a70ab0.png)
![](https://csdnimg.cn/release/cmsfe/public/img/task.87b52881.png)
![](https://csdnimg.cn/release/cmsfe/public/img/share-circle.3e0b7822.png)
文件包含简单来说就是引用文件。有些代码段经常能够被用到,为了避免重复敲写这一代码段,
则就将这一代码段单独放入到一个文件中,需要用时就调用出来。例如在PHP中就是利用
include进行引用(而include能够将任意种类文件(jpg、png等)中带有的代码进行解析,
为后门代码解析提供了环境)
1、本地文件包含
2、远程文件包含
1、黑盒主要就是看参数传递的数据是否是有文件后缀
2、三种攻击方式
1)配合文件上传进行攻击。例如图片带有脚本后门代码,但是没有解析环境,可包含这个图
片,图片中的代码被解析触发
2)配合日志文件或会话文件进行攻击
3)运用相关语言可允许的协议进行攻击
php伪协议:php伪协议:[PHP伪协议总结 - 个人文章 - SegmentFault 思否](https://segmentfault.com/a/1190000018991087)
3、案例以及复现
ctfshow所有文件包含题(本笔记仅记录部分题)
1)web78
使用php://input协议
使用data://协议
2)web80 (配合日志文件)
从代码可看出被过滤的关键字。并且使用远程包含也不可行,允许远程包含的关键函数被关闭
采用另一种方法:配合日志文件
经抓包,发现中间件为nginx,浏览器可查到nginx 的默认日志位置为/var/log/nginx
输入,路径正确
修改数据包UA为脚本代码,得到flag文件
得到flag
3)web87 (put://filter协议)
看代码可发现过滤的了许多关键字符,日志文件也不可使用了,但可发现urldecode解码,则可采用url编码绕过
还有一个post提交$content,这个content的内容会被放入到$file文件中,则我们可以想到put://filter/write
将‘php://filter/write=convert.base64-decode/resource=1.php’进行url编码两次,因为浏览器会自动进行一次url解码
因为会将content中的内容进行base64解码,所以我们需要事先将<?php @eval($_POST[a]);?>后门代码进行一次base64编码,
其因为content被放入到file文件中时,前面被连接了一部分,并且对这一部分进行解码时,只会解码phpdie,但base64是以
4个字节为单位进行一次解码看,phpdie只有六个字节,所以需要在前面加入两个字节,则加入了aa
(也可以使用凯撒13 php://filter/write=string.rot13/resource=2.php content=<?cuc riny($_CBFG[1]);?>)
(也可以使用iconv php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php contents=?<hp
pvela$(P_SO[T]1;)>? web117中可以使用到)
这三种都是php://filter的过滤器中的一部分,剩余过滤器见文章php://filter的各种过滤器_php://filter过滤器种类-CSDN博客
直接访问1.php并post提交可得到flag
三、文件包含漏洞-白盒
看包含代码:
include($action);可使用协议玩法
include('files/'.$action.'.php');像这种带有‘前缀’、‘后缀’或者两者都有的,协议玩法肯定是用不了了
一篇很详细的文件包含漏洞文章:文件包含漏洞全面详解-CSDN博客