| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 
 | package main
 import (
 "context"
 "fmt"
 "github.com/chromedp/chromedp"
 "github.com/gin-gonic/gin"
 "github.com/gorilla/sessions"
 "log"
 "net/http"
 "sync"
 "time"
 )
 
 var (
 store = sessions.NewCookieStore([]byte("fake_key"))
 users = map[string]string{
 "shallot": "fake_password",
 "admin":   "fake_password"}
 comments []string
 flag     = "FLAG{this_is_a_fake_flag}"
 lock     sync.Mutex
 )
 
 func loginHandler(c *gin.Context) {
 username := c.PostForm("username")
 password := c.PostForm("password")
 if storedPassword, ok := users[username]; ok && storedPassword == password {
 session, _ := store.Get(c.Request, "session")
 session.Values["username"] = username
 session.Options = &sessions.Options{
 Path:     "/",
 MaxAge:   3600,
 HttpOnly: false,
 Secure:   false,
 }
 session.Save(c.Request, c.Writer)
 c.String(http.StatusOK, "success")
 return
 }
 log.Printf("Login failed for user: %s\n", username)
 c.String(http.StatusUnauthorized, "error")
 }
 func logoutHandler(c *gin.Context) {
 session, _ := store.Get(c.Request, "session")
 delete(session.Values, "username")
 session.Save(c.Request, c.Writer)
 c.Redirect(http.StatusFound, "/login")
 }
 func indexHandler(c *gin.Context) {
 session, _ := store.Get(c.Request, "session")
 username, ok := session.Values["username"].(string)
 if !ok {
 log.Println("User not logged in, redirecting to login")
 c.Redirect(http.StatusFound, "/login")
 return
 }
 if c.Request.Method == http.MethodPost {
 comment := c.PostForm("comment")
 log.Printf("New comment submitted: %s\n", comment)
 comments = append(comments, comment)
 }
 htmlContent := fmt.Sprintf(`<html>
 <body>
 <h1>留言板</h1>
 <p>欢迎,%s,试着写点有意思的东西吧,admin才不会来看你!自恋的笨蛋!</p>
 <form method="post">
 <textarea name="comment" required></textarea><br>
 <input type="submit" value="提交评论">
 </form>
 <h3>留言:</h3>
 <ul>`, username)
 for _, comment := range comments {
 htmlContent += "<li>" + comment + "</li>"
 }
 htmlContent += `</ul>
 <p><a href="/logout">退出</a></p>
 </body>
 </html>`
 c.Data(http.StatusOK, "text/html; charset=utf-8", []byte(htmlContent))
 }
 func adminHandler(c *gin.Context) {
 htmlContent := `<html><body>
 <p>好吧好吧你都这么求我了~admin只好勉为其难的来看看你写了什么~才不是人家想看呢!</p>
 </body></html>`
 c.Data(http.StatusOK, "text/html; charset=utf-8", []byte(htmlContent))
 //无头浏览器模拟登录admin,并以admin身份访问/路由
 go func() {
 lock.Lock()
 defer lock.Unlock()
 ctx, cancel := chromedp.NewContext(context.Background())
 defer cancel()
 ctx, _ = context.WithTimeout(ctx, 20*time.Second)
 if err := chromedp.Run(ctx, myTasks()); err != nil {
 log.Println("Chromedp error:", err)
 return
 }
 }()
 }
 
 // 无头浏览器操作
 func myTasks() chromedp.Tasks {
 return chromedp.Tasks{
 chromedp.Navigate("/login"),
 chromedp.WaitVisible(`input[name="username"]`),
 chromedp.SendKeys(`input[name="username"]`, "admin"),
 chromedp.SendKeys(`input[name="password"]`, "fake_password"),
 chromedp.Click(`input[type="submit"]`),
 chromedp.Navigate("/"),
 chromedp.Sleep(5 * time.Second),
 }
 }
 
 func flagHandler(c *gin.Context) {
 log.Println("Handling flag request")
 session, err := store.Get(c.Request, "session")
 if err != nil {
 c.String(http.StatusInternalServerError, "无法获取会话")
 return
 }
 username, ok := session.Values["username"].(string)
 if !ok || username != "admin" {
 c.String(http.StatusForbidden, "只有admin才可以访问哦")
 return
 }
 log.Println("Admin accessed the flag")
 c.String(http.StatusOK, flag)
 }
 func main() {
 r := gin.Default()
 r.GET("/login", loginHandler)
 r.POST("/login", loginHandler)
 r.GET("/logout", logoutHandler)
 r.GET("/", indexHandler)
 r.GET("/admin", adminHandler)
 r.GET("/flag", flagHandler)
 log.Println("Server started at :8888")
 log.Fatal(r.Run(":8888"))
 }
 
 
 |