上传点目录穿越反弹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)
}
posted @ 2020-01-21 09:59  WINDECODE  阅读(1277)  评论(0)    收藏  举报