PHP代码审计之WEB安全系列基础文章(五)之文件包含篇

【如需转载,请详细表明来源,请勿设置原创】

嗨,大家好,我是闪石星曜CyberSecurity创始人Power7089。

欢迎大家扫描下方二维码关注 “闪石星曜CyberSecurity” 公众号,这里专注分享渗透测试,Java代码审计,PHP代码审计等内容,都是非常干的干货哦。

公众号

今天为大家带来PHP代码审计基础系列文章第五篇之文件包含篇

这是【炼石计划@PHP代码审计】知识星球第二阶段的原创基础系列文章,拿出部分课程分享给零基础的朋友学习。本系列原创基础文章涵盖了PHP代码审计中常见的十余种WEB漏洞,是匹夫老师精心的创作,欢迎关注我的公众号跟着一起学习。

【炼石计划@PHP代码审计】是一个系统化从入门到提升学习PHP代码审计的成长型知识星球。这里不仅注重夯实基础,更加专注实战进阶。强烈推荐加入我们,一起来实战提升PHP代码审计。

公众号

PHP代码审计之文件包含

1.文件包含原理

当一个PHP文件需要调用另一个文件去完成某一个特定功能的时候就需要用到文件包含。文件包含相当于在一个PHP文件中,调用了另一个PHP文件,实现代码的共享。也就是说包含的文件可以使用被包含文件的变量、方法等。

2.文件包含的四种方式

require() 语句的性能与 include() 相类似,都是包含并运行指定的文件,而_once()则表示当在一个PHP文件中,一个文件被重复包含时,且被包含文件只会被包含一次不会被重复包含,避免函数重定义,变量重新赋值等问题。

include()

代码示例:

demo.php

1
2
3
4
5
6
<?php
highlight_file(__FILE__);

include 'test.php';
echo $a;
?>

test.php

1
2
3
4
5
6
7
8
9
<?php
highlight_file(__FILE__);

$a = 6;
$b = 38;
$sum = $a + $b ;
echo $sum.'<br/>';
?>

demo.php成功包含test.php

image-20220628164738014

require()

require()也是同样的效果。

image-20220628165205265

include_once()

代码示例:

demo.php

1
2
3
4
5
6
7
<?php
highlight_file(__FILE__);

include_once "test.php";
echo $a;
include_once "test.php";
?>

test.php

1
2
3
4
5
6
7
8
<?php
highlight_file(__FILE__);

$a = 6;
$b = 38;
$sum = $a + $b ;
echo $sum.'<br/>';
?>

demo.php中包含了两次test.php文件,但该文件只执行了一次。

image-20220628165535217

require_once()

require_once()也同样只会包含一次。

image-20220628165649149

3.四种文件包含的区别

3.1 include()与require()的区别

对 include() 语句来说,在执行文件时每次都要进行读取和评估;而对于 require() 来说,文件只处理一次(实际上,文件内容替换 require() 语句)。这就意味着如果可能执行多次的代码,则使用 require() 效率比较高。另外一方面,如果每次执行代码时是读取不同的文件,或者有通过一组文件迭代的循环,就使用 include() 语句。

include():在用到时加载;引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码

require():在一开始就加载; 引入文件的时候,如果碰到错误,会给出提示,并停止运行(相当于exit()了)下边的代码

3.2 include()与include_once()的区别

include() :在一个文件中多次包含同一个文件时,该文件会被多次包含并执行。

include_once():在一个文件中多次包含同一个文件时,该文件只会被包含一次。

4.文件包含漏洞

当文件中存在include()include_once()require()require_once()函数时,且该函数的参数可控,就会造成文件包含漏洞。

4.1 文件包含的利用条件

  • 文件包含函数中参数可控
  • 知道想要包含的文件位置或../、..\可用

include()为例,其他函数相同。

代码示例:

1
2
3
4
5
6
<?php
highlight_file(__FILE__);

$path = $_REQUEST['path'];
@include "$path";
?>

包含当前目录下的tupianma.jpg

image-20220628174827864

也可通过../或者..\(Windows中)包含任意文件

image-20220628175230419

4.2 %00截断

在PHP版本低于5.3.4magic_quotes_gpcOFF状态中可使用%00截断来绕过一些后缀限制。(在做此练习之前要将PHP版本调制5.3.4以下,如果在小皮面板V8.1中无法下载PHP5.2.18请参考upload靶场12-16关)

代码示例:

在正常情况下我们无法顺利包含我们想要包含的文件,只能通过**%00截断**,截断后面的内容。

1
2
3
4
5
6
<?php
highlight_file(__FILE__);

$path = $_REQUEST['path'];
@include $path.'/web/admin/xxxx';
?>

这里就可以直接通过%00来截断后面的内容/web/admin/xxxx

image-20220628185452388

5.文件包含代码审计总结

1
在实际情况中可能会遇到不同的过滤形式,我们在遇到实际情况时我们在对过滤绕过思虑进行讲解,本节大家只要了解PHP中文件包含这四个函数以及四个函数的区别这个在面试中也是常见的一个问题。

PHP代码审计之WEB安全系列基础文章(五)之文件包含篇
http://example.com/2022/10/10/PHP代码审计之WEB安全系列基础文章(五)之文件包含篇/
作者
Power7089
发布于
2022年10月10日
许可协议