安全矩阵

 找回密码
 立即注册
搜索
查看: 2281|回复: 0

CTF实战练习:web-Loginme

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2022-2-23 10:06:13 | 显示全部楼层 |阅读模式
原文链接:CTF实战练习:web-Loginme

按照惯例,肯定是要看看分最少的题。

这道题被我看中了,我打算研究一下这个题。
附件是一份源码,而且是go语言的源码,先看一看。
题中源码给了middleware.go,此时我们应该理解一下go语言的中间件是起到什么作用的:
有时候在执行实际Handler里面的逻辑的时候想要预处理或者后处理一些行为(比如写入log、统计执行时间等等);有时候我们想要在调用一个Handler之前或之后调用另一个Handler。这时我们就需要用到中间件这个中间处理函数,把我们实际使用的Handler放在中间件里面,以实现额外的功能。
所以我们先来看看middleware.go定义了什么:
  1. package middleware
  2. import (
  3.     "github.com/gin-gonic/gin"
  4. )
  5. func LocalRequired() gin.HandlerFunc {
  6.     return func(c *gin.Context) {
  7.         if c.GetHeader("x-forwarded-for") != "" || c.GetHeader("x-client-ip") != "" {
  8.             c.AbortWithStatus(403)
  9.             return
  10.         }
  11.         ip := c.ClientIP()
  12.         if ip == "127.0.0.1" {
  13.             c.Next()
  14.         } else {
  15.             c.AbortWithStatus(401)
  16.         }
  17.     }
  18. }
复制代码

这里导入了一个包github.com/gin-gonic/gin,我们来看一下该包的描述:
  1. Gin is a web framework written in Go (Golang). It features a martini-like API with performance that is up to 40 times faster thanks to httprouter. If you need performance and good productivity, you will love Gin.
  2. -------------------------------------------------------------------------------
  3. Gin 是一个用 Go (Golang) 编写的 Web 框架。它具有类似martini-like的 API,由于 httprouter,性能提高了 40 倍。如果您需要性能和良好的生产力,您会喜欢 Gin。

复制代码

到这里其实就有那么一点能感觉到这个题的做法了。接着往下看:
  1. func LocalRequired() gin.HandlerFunc {
  2.     return func(c *gin.Context) {
  3.         if c.GetHeader("x-forwarded-for") != "" || c.GetHeader("x-client-ip") != "" {
  4.             c.AbortWithStatus(403)
  5.             return
  6.         }
  7.         ip := c.ClientIP()
  8.         if ip == "127.0.0.1" {
  9.             c.Next()
  10.         } else {
  11.             c.AbortWithStatus(401)
  12.         }
  13.     }
  14. }
复制代码

这里就是简单的获取数据头的函数。其中:
  1. if c.GetHeader("x-forwarded-for") != "" || c.GetHeader("x-client-ip") != "" {
  2.             c.AbortWithStatus(403)
  3.             return
  4. }
复制代码

这里定义到如果存在x-forwarded-for或者x-client-ip就会返回403,但是还需要ip == "127.0.0.1"。百度一下就知道x-real-ip这个头,中间件看完了,接着往下看route.go。
这里就能看到端倪了:

go语言模板渲染支持传入一个结构体的实例来渲染它的字段,就有可能造成信息泄露。
而在route.go中恰巧传入了一个结构体,我们接着看structs.go。

到这里已经真相大白了。
1、首先构造ip伪造;
2、在age变量中存在ssti信息泄露出flag;



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-24 07:46 , Processed in 0.014127 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表