上传点目录穿越反弹shell方式
这是一个正常的上传点,我们试着去抓包,修改something

将反弹shell的命令修改到内容区,之后文件名修改为跨目录到计划任务目录里面去。

然后我们成功反弹过来一个shell。

之后我们开始监听
那么造成这个漏洞的形成原因是什么呢,主要是没有对文件名进行严格的判断所以才会造成目录穿越的漏洞,而这个web框架是本人自己写的,使用go语言。
源码我公开一下,通过以下的代码审计,我们可以看出文件名确实没有经过进行任何过滤,所以造成了文件目录穿越的问题。
package main import ( ."fmt" "html/template" "io" "net/http" "os" ) func index(w http.ResponseWriter, r *http.Request) { const upload = `<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>后台管理</title> <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" > </head> <body> <form method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit"> </form> <a href="/img/{{.URL}}">{{.URL}}</a> </body> </html>` t := template.Must(template.New("upload").Parse(upload)) file, handle, err := r.FormFile("file") if err == nil { Println(handle.Filename) type recipient struct { URL string } var recipients = recipient{handle.Filename} f, _ := os.OpenFile("img/"+handle.Filename, os.O_WRONLY|os.O_CREATE, 0666) ###################### 漏洞触发点 io.Copy(f, file) defer f.Close() t.Execute(w, recipients) } else { t.Execute(w, nil) } } func main() { http.HandleFunc("/index.php", index) http.HandleFunc("/", index) http.Handle("/img/", http.StripPrefix("/img", http.FileServer(http.Dir("./img")))) http.ListenAndServe("0.0.0.0:9000", nil)
}

浙公网安备 33010602011771号