您当前的位置: 首页 > 

Z3eyOnd

暂无认证

  • 3浏览

    0关注

    117博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

2021SCTF

Z3eyOnd 发布时间:2022-03-31 14:48:19 ,浏览量:3

前言

复现环境:NSSCTF

总结

第一个就是学到了RCEME中绕过disabled_function和无参数rce的方法

第二个就是找反序列化链子

upload1和upload2都是找yii的反序列化链子,$可控()可以来触发__invoke__call,后者需要是数组模式,所以后者这种数组模式也可以用来调用某个对象的某个方法。

然后学会了一些session的方法,我们通过上传文件,然后保存在session文件,然后上传我们的文件,覆盖之前的session文件,再次方法,从而可以把我们的结果带出来

ezosu也是找链子,通过伪造传入的POST值,造成反序列化逃逸,然后加入我们链子,GET方式带出来。

后面两个题,就稍微看了下思路

Loginme 考点

GO的模板注入

wp

middleware.go

package middleware

import (
	"github.com/gin-gonic/gin"
)

func LocalRequired() gin.HandlerFunc {
	return func(c *gin.Context) {
		if c.GetHeader("x-forwarded-for") != "" || c.GetHeader("x-client-ip") != "" {
			c.AbortWithStatus(403)
			return
		}
		ip := c.ClientIP()
		if ip == "127.0.0.1" {
			c.Next()
		} else {
			c.AbortWithStatus(401)
		}
	}
}

过滤了x-forwarded-forx-client-for

而又需要localhost,所以我们利用X-Real-IP来绕过。

route.go

package route

import (
	_ "embed"
	"fmt"
	"html/template"
	"loginme/structs"
	"loginme/templates"
	"strconv"

	"github.com/gin-gonic/gin"
)

func Index(c *gin.Context) {
	c.HTML(200, "index.tmpl", gin.H{
		"title": "Try Loginme",
	})
}

func Login(c *gin.Context) {
	idString, flag := c.GetQuery("id")
	if !flag {
		idString = "1"
	}
	id, err := strconv.Atoi(idString)
	if err != nil {
		id = 1
	}
	TargetUser := structs.Admin
	for _, user := range structs.Users {
		if user.Id == id {
			TargetUser = user
		}
	}

	age := TargetUser.Age
	if age == "" {
		age, flag = c.GetQuery("age")
		if !flag {
			age = "forever 18 (Tell me the age)"
		}
	}

	if err != nil {
		c.AbortWithError(500, err)
	}

	html := fmt.Sprintf(templates.AdminIndexTemplateHtml, age)
	if err != nil {
		c.AbortWithError(500, err)
	}

	tmpl, err := template.New("admin_index").Parse(html)
	if err != nil {
		c.AbortWithError(500, err)
	}

	tmpl.Execute(c.Writer, TargetUser)
}

struct.go

package structs

type UserInfo struct {
	Id       int
	Username string
	Age      string
	Password string
}

var Users = []UserInfo{
	{
		Id:       1,
		Username: "Grandpa Lu",
		Age:      "22",
		Password: "hack you!",
	},
	{
		Id:       2,
		Username: "Longlone",
		Age:      "??",
		Password: "i don't know",
	},
	{
		Id:       3,
		Username: "Teacher Ma",
		Age:      "20",
		Password: "guess",
	},
}

var Admin = UserInfo{
	Id:       0,
	Username: "Admin",
	Age:      "",
	Password: "flag{}",
}

struct.go可得flag在Password里面,所以id=0

然后直接通过控制age参数,模板注入获得Password

image-20220325173933349

RCEME 考点
  1. 无参数RCE
  2. 绕过disabled_functions
wp 无参数rce
            
关注
打赏
1651657201
查看更多评论
0.1574s