11package top .whgojp .modules .deserialize .xmldecoder .controller ;
22
33import io .swagger .annotations .Api ;
4- import io . swagger . annotations . ApiOperation ;
4+
55import lombok .extern .slf4j .Slf4j ;
66import org .springframework .stereotype .Controller ;
7- import org .springframework .ui .Model ;
8- import org .springframework .web .bind .annotation .CrossOrigin ;
9- import org .springframework .web .bind .annotation .GetMapping ;
10- import org .springframework .web .bind .annotation .RequestMapping ;
11- import org .springframework .web .bind .annotation .ResponseBody ;
7+ import org .springframework .web .bind .annotation .*;
128import top .whgojp .common .utils .R ;
139
14- import java . beans . XMLDecoder ;
15- import java . beans . XMLEncoder ;
16- import java .io .* ;
10+ import javax . xml . parsers . SAXParser ;
11+ import javax . xml . parsers . SAXParserFactory ;
12+ import java .io .ByteArrayInputStream ;
1713import java .nio .charset .StandardCharsets ;
18- import java .util .HashMap ;
14+ import java .util .ArrayList ;
15+ import java .util .List ;
16+ import org .xml .sax .InputSource ;
17+ import org .xml .sax .Attributes ;
18+ import org .xml .sax .SAXException ;
19+ import org .xml .sax .helpers .DefaultHandler ;
1920
2021/**
2122 * @description 反序列化 - XMLDecoder
@@ -34,9 +35,9 @@ public String xmlDecoder() {
3435 return "vul/deserialize/xmlDecoder" ;
3536 }
3637
37- @ RequestMapping ("/vulXmlDecoder " )
38+ @ RequestMapping ("/vul " )
3839 @ ResponseBody
39- public R vulXmlDecoder (String payload ) {
40+ public R vul (String payload ) {
4041 String [] strCmd = payload .split (" " );
4142 StringBuilder xml = new StringBuilder ()
4243 .append ("<?xml version=\" 1.0\" encoding=\" UTF-8\" ?>" )
@@ -51,11 +52,80 @@ public R vulXmlDecoder(String payload) {
5152 try {
5253 new java .beans .XMLDecoder (new ByteArrayInputStream (xml .toString ().getBytes (StandardCharsets .UTF_8 )))
5354 .readObject ().toString ();
54- return R .ok ("命令执行成功" );
55+ return R .ok ("[+] 命令执行成功" );
5556 } catch (Exception e ) {
56- return R .error ("命令执行失败: " + e .getMessage ());
57+ return R .error ("[-] 命令执行失败: " + e .getMessage ());
5758 }
5859 }
5960
6061
62+ @ RequestMapping ("/safe" )
63+ @ ResponseBody
64+ public R safe (@ RequestParam String payload ) {
65+ try {
66+ // 构建 XML 字符串
67+ StringBuilder xml = new StringBuilder ()
68+ .append ("<?xml version=\" 1.0\" encoding=\" UTF-8\" ?>" )
69+ .append ("<java version=\" 1.8.0_151\" class=\" java.beans.XMLDecoder\" >" )
70+ .append ("<object class=\" java.lang.ProcessBuilder\" >" )
71+ .append ("<array class=\" java.lang.String\" length=\" " ).append (payload .split (" " ).length ).append ("\" >" );
72+
73+ for (int i = 0 ; i < payload .split (" " ).length ; i ++) {
74+ xml .append ("<void index=\" " ).append (i ).append ("\" ><string>" )
75+ .append (payload .split (" " )[i ]).append ("</string></void>" );
76+ }
77+
78+ xml .append ("</array><void method=\" start\" /></object></java>" );
79+
80+ // 使用 SAX 解析器解析 XML
81+ SAXParserFactory factory = SAXParserFactory .newInstance ();
82+ SAXParser saxParser = factory .newSAXParser ();
83+ CommandHandler handler = new CommandHandler ();
84+
85+ // 将 ByteArrayInputStream 包装成 InputSource
86+ InputSource inputSource = new InputSource (new ByteArrayInputStream (xml .toString ().getBytes (StandardCharsets .UTF_8 )));
87+ saxParser .parse (inputSource , handler );
88+
89+ // 获取解析后的命令参数
90+ List <String > args = handler .getArgs ();
91+
92+ // 处理解析后的命令参数
93+ System .out .println ("Parsed command: " + String .join (" " , args ));
94+
95+ return R .ok ("[+]命令解析成功:" +String .join (" " , args ));
96+ } catch (Exception e ) {
97+ return R .error ("[-]命令解析失败: " + e .getMessage ());
98+ }
99+ }
100+
101+ // SAX 处理器
102+ static class CommandHandler extends DefaultHandler {
103+ private List <String > args = new ArrayList <>();
104+ private boolean inString = false ;
105+
106+ @ Override
107+ public void startElement (String uri , String localName , String qName , Attributes attributes ) throws SAXException {
108+ if ("string" .equals (qName )) {
109+ inString = true ;
110+ }
111+ }
112+
113+ @ Override
114+ public void characters (char [] ch , int start , int length ) throws SAXException {
115+ if (inString ) {
116+ args .add (new String (ch , start , length ));
117+ }
118+ }
119+
120+ @ Override
121+ public void endElement (String uri , String localName , String qName ) throws SAXException {
122+ if ("string" .equals (qName )) {
123+ inString = false ;
124+ }
125+ }
126+
127+ public List <String > getArgs () {
128+ return args ;
129+ }
130+ }
61131}
0 commit comments