Hgame题解(第一星期)
Web
ezHTTP
打开靶机首先看到题目提示:请从vidar.club
访问这个页面
根据http协议,需要创建一个Referer字段,其值设置为vidar.club(意思是从该网页跳转到靶机网页的),使用Hackbar工具添加即可。
之后网页又提示:请通过Mozilla/5.0 (Vidar; VidarOS x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0
访问此页面
一眼就能看出这是UA头应该有的样子,于是将这个UA头替换成自己浏览器的UA值。
最后一步也是最耗时的一步,题目提示:请从本地访问这个页面
那不就是XFF吗?直接添加该字段提交,但是没用,说明网站没有通过XFF字段判断是否从本地访问的,这一点也可以通过查看网站返回的响应包头看得出来(Hint:Not XFF)。
但是我就只知道一个XFF,没办法只能从Google上搜索,搜索后发现除了XFF字段还有很多字段都可以标识从本地访问,相关链接
经过测试发现X-Real-IP字段有效,添加该字段,题目有提示:Ok, the flag has been given to you
但是网页上直接看不到,猜测可能是藏在网页源码或者响应头里了(毕竟Hint就在那里出现过)
事实上,通过查看响应头发现可疑字段(因为之前查看响应头都没有这个字段)
询问GPT后得知这是一个JSON Web Token (JWT),虽然我也不知道具体是什么,但是根据它的描述这里面是可以包含信息的,它说:Header 和 Payload 通常是经过 Base64 编码的 JSON 字符串。,那么通过Base64解码其Payload部分得到了重要值:
{“F14g”:“hgame{HTTP_!s_1mP0rT4nt}”}
虽然没有明说是flag,但是看起来就像flag,尝试提交通过,发现正确,虽然到这里来讲题目做完了,但是在做题过程中还学到了关于使用BP的新知识。
当我尝试寻找能够替换XFF的字段时最先使用的是BurpSuite工具,但是一直没有做出来,卡在需要本地访问那个页面,但是同样的字段使用Hackbar提交就能拿到flag,我以为是BP的问题,后来经过询问学长和自己的比对尝试发现BP对于构造请求头有行数要求:
当左边的行数小与13行时(此时是12行),那么发送请求包将失败,并且BP会将Send按钮从红色变成白色,点击不了,当行数大于等于13行时才能正常发送正常返回正确网页(即便多余行数是空白行)。
另外如果在X-Real-IP:127.0.0.1
行前加上空白行那么效果等同于没有添加这个字段,返回的还是从本地访问页面
2048*16
打开靶机是一个2048网页小游戏:
最开始我的思路是查看网页源码,flag可能会藏在源码里,由于对Web代码的陌生,导致我在这一步花费了很长时间也没有找到关键信息,后来又是在学长的提示下将目标锁定在了网页里唯一的一个js文件,初步猜测是一个实现游戏功能的脚本文件,但是直观上看得不到任何信息,因为这个文件经过混淆加密了的,好在网页下方有提供该游戏原版网页,访问这个网页发现和靶机网页一模一样。
在原版网页中我找到了没有混淆过的游戏源码,被保存在index.js文件中:
通过比对该文件和靶机网页js代码,找到实现判断输赢的关键代码,在原版网页中判断输赢的代码是通过定义this.won = !1,
实现的,将其修改成1即可在游戏一开始就判断赢然后输出flag,找到这行代码在靶机js代码中的具体位置
通过两个文件代码的一一比对以及关键字,找到了this.won = !1
的对应位置this[x(460)] = 1,
(这里我修改过的,所以是1而不是!1,为了解答题目就需要设置成1)
接下来就是让修改过的js代码生效,首先就是在自己桌面上创建和网站上一摸一样的目录结构(top/47.102.130.35:31865/assets/),在assests下再创建index-_wkhdPNY.js,将修改过的完整js代码一起复制进去,由于windows上不允许创建文件夹名包含:,因此需要用%3A来替换:,效果一样。
然后在替换页面导入该目录,启用调试,刷新页面,等待页面刷新即可出现flag。
这道题首先学会了分析js源代码和混淆代码,将关键字进行替换,然后是知道了如何将修改的js代码替换到网页上进行实现。