小编Pra*_*PVS的帖子

如何在 C 中的 libxml2 中禁用 XXE?

要求:当我将以下请求传递给我的应用程序时,

1)如何对这样的输入xml进行XML验证,这是有风险的

2) 如何在libxml2中禁用XXE,即不应该解析ENTITY字段

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY foo SYSTEM "file:///etc/issue">
]><TRANSACTION>
<FUNCTION_TYPE>LINE_ITEM</FUNCTION_TYPE>
<COMMAND>ADD</COMMAND>
<COUNTER>3</COUNTER>
<MAC>qof2EtycqT9YMcmOfKowpyXVbRpgM/7rncS3liK4JOs=</MAC>
<MAC_LABEL>P_206</MAC_LABEL>
<RUNNING_TAX_AMOUNT>0.00</RUNNING_TAX_AMOUNT>
<RUNNING_TRANS_AMOUNT>1.00</RUNNING_TRANS_AMOUNT>
<LINE_ITEMS>
<MERCHANDISE>
<LINE_ITEM_ID>1</LINE_ITEM_ID>
<DESCRIPTION>&foo;</DESCRIPTION>
<QUANTITY>1</QUANTITY>
<UNIT_PRICE>5.00</UNIT_PRICE>
<EXTENDED_PRICE>5.00</EXTENDED_PRICE>
</MERCHANDISE>
</LINE_ITEMS>
</TRANSACTION>
Run Code Online (Sandbox Code Playgroud)

据我所知,从 libxml2 版本 2.9 开始,XXE 默认情况下已被禁用。但我们目前使用的是2.7.7版本。

根据此链接XML_ENTITY_PROCESSING

Enum xmlParserOption 不应在 libxml2 中定义以下选项:

XML_PARSE_NOENT:展开实体并用替换文本替换它们 XML_PARSE_DTDLOAD:加载外部 DTD

到目前为止,我一直在使用xmlParseMemory函数来解析 XML 内存块并构建一棵树。该函数不使用任何参数来设置 xmlParserOption。

然后我更改为xmlReadMemory函数,它也执行与函数相同的操作xmlParseMemory,但采用不同的参数。

docPtr = xmlReadMemory(szXMLMsg, iLen, "noname.xml", NULL, XML_PARSE_RECOVER);
Run Code Online (Sandbox Code Playgroud)

我仍然观察到 ENTITY 字段正在被解析。有人可以帮助我吗?如果您需要更多其他信息,请告诉我。

感谢您的时间。

问候

普拉文

c libxml2 xml-parsing xxe

5
推荐指数
1
解决办法
3183
查看次数

标签 统计

c ×1

libxml2 ×1

xml-parsing ×1

xxe ×1