• 文件包含漏洞


    目录

    文件包含漏洞

    原理

    常见文件包含函数

    PHP伪协议

    file://

    php://filter

    php://input

    解压缩协议

    zip://协议

    zlib://协议

    data://协议

    总结

    案例1:php://input

    PS:dos下的基本命令

    案例2:php://input

    案例3 :php://filter

    案例4:zip://

     案例5:文件包含apache日志---Windows

    PS


    文件包含漏洞

    原理

           通过PHP函数某些特性函数利用URL动态引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,被包含的文件可以是各种文件格式,当文件中包含恶意代码,就会形成远程命令执行或文件上传漏洞。

    常见文件包含函数

    (1)include():包含并运行指定文件。只生成警告,脚本会继续执行

    (2)require():包含并运行指定文件。在出错时产生错误,脚本中止运行

    (3)include_once():在脚本执行期间包含并运行制定文件。与include区别:检查是否被包含过,如果是则不会再次包含。

    (4)require_once():在脚本执行期间包含并运行制定文件。与require区别:检查是否被包含过,如果是则不会再次包含。

    PHP伪协议

    file://

    使用前提:协议在双off的情况下也可以正常使用;

    allow_url_fopen :off/on    (规定是否允许从远程服务器或者网站检索数据 )

    allow_url_include:off/on   (规定是否允许include/require远程文件 )

    1、准备一个带有文件包含漏洞的php文件和一个带有一句话木马的txt文件

    2、 访问有文件包含漏洞的文件

     文件包含成功。

    php://filter

    读取源代码并进行base64编码输出,使用前提:在双off的情况下也可以正常使用;

    allow_url_fopen : off/on

    allow_url_include: off/on

    1、查看php文件的源码

     

    php://input

    可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行。

    allow_url_fopen : off/on

    allow_url_include: on

    1、使用burpsuite抓包后重放

     为什么图中抓取的是GET包,我们传递的又是post参数呢?

    • get接收的参数是php://input
    • post接收的参数才是我们传输的值

    解压缩协议

    zip://协议

    使用方法: zip://[压缩文件绝对路径]#[压缩文件内的子文件名]

    1、准备一个压缩包

    2、测试

     没有成功执行的原因?     #号没有编码

    zlib://协议

    使用方法:compress.zlib://[压缩文件绝对路径]

    data://协议

    allow_url_fopen :on

    allow_url_include:on

     1、在URL栏后面直接加上一句话木马

    2、可以使用base64编码绕过

     

    总结

    协议allow_url_fopenallow_url_include用法
    file://off/onoff/on?file=file://路径/文件名.txt
    php://filteroff/onoff/on?file=php://filter/read=convert.base64-encode/resource=文件
    php://inputoff/onon?file=php://input 一句话木马
    zip://off/onoff/on?file=zip://压缩包路径%23压缩包子文件
    compress.bzip2://off/onoff/on?file=compress.bzip2://压缩包路径
    compress.zlib://off/onoff/on?file=compress.zlib://压缩包路径
    data://onon

    ?file=data://text/plain,一句话木马

    ?file=data://text/plain,base64,被base64编码后的一句话木马

     

    案例1:php://input

    1. "utf8">
    2. error_reporting(0);
    3. $file = $_GET["file"];
    4. if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
    5. exit('hacker!');
    6. }
    7. if($file){
    8. if ($file!="http://www.baidu.com") echo "tips:flag在当前目录的某个文件中";
    9. include($file);
    10. }else{
    11. }
    12. ?>

    1、使用php://input传递post流,burpsuite抓包后写入一句话木马

    2、使用命令查看文件目录:dir,找到flag.txt

    3、 查看flag.txt文件的内容:type

    4、检查flag.txt内容,查询正确

     

     

    PS:dos下的基本命令

    命令命令解释
    dir

    显示一个目录下的文件和子目录列表以及文件的其他详细资料,包括文件大小,创建日期和时间等。

    dir [drive:驱动器名称][path目录路径] [/p] [/w] [/o] [/s]
    [/p] 表示分页显示目录内容。要查看下一屏幕,可按任意键。
    [/w] 表示以宽列表格式显示当前目录中的文件名
    [/o] 表示以分类顺序显示文件
    [/s] 表示显示当前目录及其子目录中所有文件的列表。

    copy将一个或多个文件复制到另一个位置。
    copy [要复制的文件名] [复制到的路径或文件夹]
    move用于将文件或目录从一个位置移到另一个位置。复制和移动的区别在于move命令将文件从源位置删除。
    move [要移动的文件名] [文件移到的路径或文件夹]
    md/mkdir

    新建目录

    md [path表示即将创建的目录的路径] [directoryname表示所有创建的目录名称,此参数必须要有]

    cd

    改变当前目录

    cd [某个盘d:   c:   等]
    cd [\] 进入到根目录
    cd [..]进入到上一级目录

    ren

    重命名文件或文件夹

    ren [oldfilename旧名字] [newfilename新名字]

    del

    用于删除目录中的文件。要删除其它驱动器或目录中的文件,则必须指定路径。

    del [filename表示要删除的文件名]

    rd/rmdir

    用于删除文件夹

    rd [directoryname表示要删除的文件夹名称]

    cls清除屏幕
    type显示文件内容
    type 文件名.扩展名
    echo创建文件并填写内容
    echo 内容>文件名.格式后缀

    案例2:php://input

    1. show_source(__FILE__);
    2. include('flag.php');
    3. $a= $_GET["a"];
    4. if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
    5. echo "success\n";
    6. echo $flag;
    7. }

    1、随便上传一个a的值进行测试

     2、使用抓包传值

    案例3 :php://filter

    1. "utf8">
    2. error_reporting(0);
    3. $file = $_GET["file"];
    4. if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
    5. exit('hacker!');
    6. }
    7. if($file){
    8. include($file);
    9. }else{
    10. echo '< a href="?file=flag.php">tips';
    11. }
    12. ?>

    对PHP伪协议有过滤,我们用php://filter获取base64编码后的内容

     

    案例4:zip://

    1. "utf8">
    2. error_reporting(0);
    3. $file = $_GET["file"];
    4. if (!$file) echo 'upload?';
    5. if(stristr($file,"input")||stristr($file, "filter")||stristr($file,"data")/*||stristr($file,"phar")*/){
    6. echo "hack?";
    7. exit();
    8. }else{
    9. include($file);
    10. }
    11. ?>

    1、进入upload文件

    2、使用zip上传压缩包文件获得当前路径

    3、取出绝对路径执行一句话木马,找到flag.txt文件

     4、重新上传文件,修改txt文件内容,获取flag.txt文件内容

     

     案例5:文件包含apache日志---Windows

    文件包含漏洞可以包含apache的日志文件=必须知道文件路径+文件包含漏洞

    日志以天数分割,查询速度快、利于分类和保存

    1、找到日志文件路径(如果日志文件太大了,可能会包含失败)

     2、随便上传一个一句话木马,会被写入日志中

    3、查看日志文件,一句话木马是否写入

     4、可以看出写入日志的一句话木马被编码了,我们可以使用burp suite抓包后修改一句话木马

    5、 访问日志绝对路径,查看是否成功包含

    PS

    • 不要包含让用户可控的数据
    • 最好修改日志文件默认路径
    • 日志文件名后面加上时间戳
  • 相关阅读:
    一篇彻底带你理解微服务
    金字塔算法生成地图瓦片常见问题
    第四节(1):EXCEL中判断一个WORD文件是否被打开
    Web服务(12)——Tomcat管理
    【直播回顾】昇思MindSpore易用性SIG2022上半年回顾总结
    java+ssm基于微信小程序的游泳馆管理系统 uniapp 小程序
    【强化学习】07——规划与学习(Dyna-Q)
    【Vue3 知识第七讲】reactive、shallowReactive、toRef、toRefs 等系列方法应用与对比
    java计算机毕业设计教师职称评定系统源码+mysql数据库+系统+lw文档+部署
    vue常用6种数据加密方式的使用
  • 原文地址:https://blog.csdn.net/qq_52016943/article/details/126378915