网站首页 > 技术文章 正文
1
漏洞描述
PHP 的imap_open函数中的漏洞可能允许经过身份验证的远程攻击者在目标系统上执行任意命令。该漏洞的存在是因为受影响的软件的imap_open函数在将邮箱名称传递给rsh或ssh命令之前不正确地过滤邮箱名称。如果启用了rsh和ssh功能并且rsh命令是ssh命令的符号链接,则攻击者可以通过向目标系统发送包含-oProxyCommand参数的恶意IMAP服务器名称来利用此漏洞。
02
漏洞危害
?
攻击者可利用该漏洞在目标系统上执行任意shell命令。
03
相关概念
- imap_open 函数
PHP函数库中并不包含 imap_open() 函数,只有在 PHP 上安装 imap 扩展后才会激活imap_open() 函数。该函数的结构如下:
resource imap_open ( string $mailbox , string $username , string $password )
函数中的mailbox是执行命令参数的一部分,所以我们可以通过更改邮箱名来进行命令注入执行。
- IMAP服务器类型及SSH连接
现在有两种基于Unix的IMAP服务器被人们广泛使用,一种为华盛顿大学开发的 imapd ,另一种为Cyrus开发的IMAP服务器。
①Cyrus开发的IMAP服务器会将用户邮件存储到内置数据库中,只有通过IMAP协议才能访问Cyrus。因此,当使用Cyrus时,已安装IMAP的Unix系统上的用户账户与IMAP账户之间并没有任何关联。
②华盛顿大学开发的 imapd 会将邮箱存储到文件中,而这些文件由Unix系统中邮件用户所有,如 /var/spool/mail ,因此 imapd 对应的用户账户以及访问权限与Unix服务器直接相关。如果邮件存放在我们具备访问权限的 spool 文件中,我们可以通过SSH方式登录系统,验证我们对这些文件的访问权限。
当能够使用SSH时,整个过程并不需要建立 IMAP 连接。 也就是说,imap_open 函数首先会建立SSH连接,如果认证通过,则会在没有 IMAP 连接的情况下继续执行,这就是所谓的 IMAP 预认证模式。且在设置 SSH 连接时, mailbox 参数的值会以参数形式传递给SSH命令。
- -oProxyCommand 参数
SSH 命令中用到了许多命令,其中我们可以使用 -o 参数来设置连接期间可用的各种选项。在建立SSH连接之前,我们可以设置 ProxyCommand 参数,如下所示:
ssh -oProxyCommand="echo hello|tee /tmp/executed" localhost
当我们执行这条命令时,可以发现即便我们没有建立与 localhost 的SSH连接,也会创建 tmp.txt 文件。
点击添加图片描述(最多60个字)
04
漏洞复现
漏洞复现页面是一个测试邮件服务器能否成功连接的页面,我们需要在此页面填写邮件服务器地址、用户名和密码。
点击添加图片描述(最多60个字)
访问并用burpsuite工具进行抓包:
点击添加图片描述(最多60个字)
修改hostname的内容,如下图所示,发送如下数据包即可成功执行命令`echo '1234567890'>/tmp/test0001`:
点击添加图片描述(最多60个字)
执行docker-compose exec web bash进入容器,可见/tmp/test0001已成功创造:
点击添加图片描述(最多60个字)
05
修复方法
1. 检查传递给 imap_open 的用户输入参数中是否存在任何特殊字符(如斜杠),过滤有效的和净化有害的输入。
2. 在 mailbox 参数中使用某些标志,其中 /norsh 标志可以用来禁用IMAP预身份认证模式。
- 上一篇: linux C语言之文件操作
- 下一篇: Python读取与写入Excel模块:openpyxl
猜你喜欢
- 2024-11-22 正点原子I.MX6U嵌入式Linux C应用编程:第二章《文件I/O基础》
- 2024-11-22 如何将Python函数输出内容同时打印到屏幕和文件
- 2024-11-22 3个重点,20个函数分析,浅析FFmpeg转码过程
- 2024-11-22 Linux驱动基础篇:hello驱动
- 2024-11-22 Python自带的库(open函数)读写txt、csv、json、XML、Excel文件
- 2024-11-22 UG NX OPEN二次开发实例:UF,C语言编程,创建圆柱体,API文档翻译
- 2024-11-22 openGauss SEQUENCE函数
- 2024-11-22 Python文件操作的步骤
- 2024-11-22 Python读取与写入Excel模块:openpyxl
- 2024-11-22 linux C语言之文件操作
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 506℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 486℃MySQL service启动脚本浅析(r12笔记第59天)
- 466℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 464℃启用MySQL查询缓存(mysql8.0查询缓存)
- 444℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 423℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 419℃MySQL server PID file could not be found!失败
- 最近发表
-
- netty系列之:搭建HTTP上传文件服务器
- 让deepseek教我将deepseek接入word
- 前端大文件分片上传断点续传(前端大文件分片上传断点续传怎么操作)
- POST 为什么会发送两次请求?(post+为什么会发送两次请求?怎么回答)
- Jmeter之HTTP请求与响应(jmeter运行http请求没反应)
- WAF-Bypass之SQL注入绕过思路总结
- 用户疯狂点击上传按钮,如何确保只有一个上传任务在执行?
- 二 计算机网络 前端学习 物理层 链路层 网络层 传输层 应用层 HTTP
- HTTP请求的完全过程(http请求的基本过程)
- dart系列之:浏览器中的舞者,用dart发送HTTP请求
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)