Rand函数引发的安全问题 —— OSSN任意文件读取漏洞(CVE-2020-10560)
字数 1575 2025-08-25 22:58:34
OSSN任意文件读取漏洞分析(CVE-2020-10560)
漏洞概述
Open Source Social Network(OSSN)是一款用PHP编写的社交网络软件,允许用户创建社交网站。在5.3之前的版本中,存在一个任意文件读取漏洞(CVE-2020-10560),攻击者可以利用该漏洞读取服务器上的任意文件。
漏洞背景
- 软件名称:Open Source Social Network (OSSN)
- 影响版本:5.3之前的所有版本
- 漏洞类型:任意文件读取
- CVE编号:CVE-2020-10560
- 官方网址:https://www.opensource-socialnetwork.org/
漏洞原理
漏洞源于OSSN生成的Site_Key强度过低,可以被暴力破解。攻击者成功破解Site_Key后,可利用该密钥构造任意文件读取链接,通过components/OssnComments/ossn_com.php文件提供的文件预览接口读取服务器上的任意文件。
技术分析
漏洞触发点
-
评论功能中的图片上传:
- 用户可以在评论中上传图片和表情
- 上传后会生成临时预览图片,存储在
tmp目录 - 预览图片通过
comment/staticimage接口访问
-
文件读取流程:
http://[target]/comment/staticimage?image=[base64_encoded_string]image参数是文件路径的加密形式- 后台代码位于
components/OssnComments/ossn_com.php
-
代码分析:
- 获取
image参数并进行两次base64解码 - 使用
ossn_string_decrypt方法解密获取文件地址 - 通过
ossn_validate_filepath验证文件路径 - 使用
file_get_contents读取文件内容并输出
- 获取
关键安全问题
-
Site_Key生成机制不安全:
- Site_Key通过
rand()函数生成随机数 - 在Windows上
RAND_MAX仅为32767 - 在Linux上
RAND_MAX为2147483647 - 生成算法:
// 以"ossn"开头 // 生成随机数并拼接到"ossn"后 // 计算MD5值 // 取字符3-11作为site_key值
- Site_Key通过
-
身份验证缺失:
- 文件读取接口未进行身份验证
- 未登录用户也可访问
-
路径验证不充分:
- 虽然过滤了
../防止目录遍历 - 但仍可通过绝对路径读取文件(如
/etc/passwd)
- 虽然过滤了
漏洞利用
攻击步骤
-
获取初始加密字符串:
- 上传一张图片但不发布评论
- 获取预览链接中的
image参数值
-
暴力破解Site_Key:
- 枚举所有可能的随机数(0-2147483647)
- 计算对应的site_key值
- 尝试解密
image参数 - 检查解密结果是否包含
tmp/photos字符串
-
构造恶意请求:
- 使用破解的site_key加密目标文件路径
- 通过
comment/staticimage接口读取文件
利用工具
-
Site_Key计算工具:
https://github.com/LucidUnicorn/CVE-2020-10560-Key-Recovery -
加密解密工具:
https://github.com/kevthehermit/CVE-2020-10560
修复建议
-
升级到最新版本:OSSN 5.3及更高版本已修复此漏洞
-
代码层面修复:
- 使用加密安全的随机数生成器(如
random_int()或openssl_random_pseudo_bytes()) - 增加接口的身份验证
- 加强文件路径验证,禁止绝对路径访问
- 使用加密安全的随机数生成器(如
-
临时缓解措施:
- 限制
comment/staticimage接口的访问权限 - 监控异常的文件访问请求
- 限制
总结
该漏洞展示了弱随机数生成在安全系统中的危害,以及未授权访问接口的风险。开发人员应避免使用rand()等非加密安全的随机数生成器,并对所有文件操作接口实施严格的访问控制和输入验证。