一次Dify平台渗透测试实录
difyAI渗透测试深度解析:数据库与Web安全漏洞全记录 近期,difyAI在GitHub上备受关注,我在实际工作中遇到该项目,因此记录下渗透测试过程中的实际发现与技术思考。 数据库权限入口分析 dify的账号密码在初始化时由用户设置,因此暂不考虑弱口令问题。然而,dify启动过程会默认启用Pos
difyAI渗透测试深度解析:数据库与Web安全漏洞全记录
近期,difyAI在GitHub上备受关注,我在实际工作中遇到该项目,因此记录下渗透测试过程中的实际发现与技术思考。
数据库权限入口分析
dify的账号密码在初始化时由用户设置,因此暂不考虑弱口令问题。然而,dify启动过程会默认启用PostgreSQL和Redis服务,且默认密码为difyai123456。下面的配置截图展示了这一信息。
核心在于:获取默认密码后,可直接连接这些服务。psql权限支持执行系统命令,这已是常见利用手段。但由于运行环境为Docker容器,权限受限,实际可利用的操作空间有限。
获取Web后台权限
获取数据库权限仅是起点,最终目标是dify Web应用的数据与后台权限。因此需回归到Web端寻找突破口。
分析dify源码可知,既然已拥有数据库权限,可通过数据库直接新增账号进入后台。下方展示了密码生成规则与源代码:
import secrets
import base64
import hashlib
import binascii
import uuid
# 生成16字节的盐值
def generate_salt():
return secrets.token_bytes(16)
# 对密码进行哈希处理,返回加密后的密文
def hash_password(password_str, salt_byte):
dk = hashlib.pbkdf2_hmac("sha256", password_str.encode("utf-8"), salt_byte, 10000)
return binascii.hexlify(dk)
# 对结果进行base64编码
def encode_base64(data):
return base64.b64encode(data).decode()
# 密码加密和存储的主过程
def encrypt_password(new_password):
# 生成盐值
salt = generate_salt()
# 密码哈希加密
password_hashed = hash_password(new_password, salt)
# 编码密码和盐值为base64格式
base64_password_hashed = encode_base64(password_hashed)
base64_salt = encode_base64(salt)
return base64_password_hashed, base64_salt
# 模拟账户类
class Account:
def __init__(self, password, salt):
self.password = password
self.password_salt = salt
# 测试用例,设置密码
new_password = "Dasiwoba1" # 这里替换为你的密码
# 获取加密后的密码和盐值
encrypted_password, encrypted_salt = encrypt_password(new_password)
# 创建账户对象,并存储加密信息
account = Account(encrypted_password, encrypted_salt)
# 输出加密结果
print(uuid.uuid4())
print("Encrypted Password (Base64):", account.password)
print("Salt (Base64):", account.password_salt)
账号创建完成后,即可用于登录后台。在accounts表中,邮箱字段可自定义填写。
实际操作中有两个关键注意点:
- 生成的密码必须严格遵循上述代码中的加密规则,否则验证无法通过。
- 新注册用户缺少workplace关联,导致无法正常登录。根据代码逻辑,需使用同样方法插入一条关联数据,由于涉及表连接关系,需要同时写入三个表。
完成上述操作后,即可成功进入后台。

任意文件读取漏洞利用
进入后台后,我未逐行审阅全部代码。在GitHub上简单搜索,也未发现明显严重漏洞。然而,在检查数据库中的upload_files表时,注意到其中的key字段存储的是绝对路径。

分析代码与功能点耗费了一些时间,原因在于UUID字段不够直观。直接给出结论:上传文件时,系统先将文件保存至本地,随后读取本地内容,最后再次存入数据库。由于已拥有数据库权限,可以通过修改upload_files表中的文件路径字段来读取任意文件,从而实现任意文件读取漏洞。
以下为演示步骤:进入知识库模块,新建知识库,此时上传文件会被保存到数据库。
接着,在数据库的upload_file表中,将文件路径字段修改为目标文件路径。
点击上一步后继续操作,或直接重放数据包,均可触发文件读取。效果如下所示,成功实现了任意文件读取。
关于获取Shell的思考:目前遇到的环境多为Docker容器,信息极其有限,且仅发现文件读取漏洞这一入口,尚未找到其他利用途径。由于时间有限未能完整审计所有代码,不确定是否存在其他可被利用的点。本文权当抛砖引玉,希望能为安全研究人员提供参考。
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:一次Dify平台渗透测试实录要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
相关热点先做个小测试。读下面这段话:“他感到胸口发紧,冷汗顺着脊背滑落,周围的灯光似乎暗了下来。空气中弥漫着一种说不清的气息,像雨后的泥土,又像某种古老的记忆。”再读这段话:“张三很害怕。他不知道为什么,但他就是觉得不对劲。他想起了小时候外婆讲的那个故事。”直觉告诉你,哪段是AI写的?大概率是第一段。因为你
LangChain提供基础抽象与管道式表达式语言,以构建模型-解析器链为核心,实现结构化输出。社区生态集成多种模型、向量库及提示词模板,降低开发门槛。拓展工具LangServe、LangSmith、LangGraph支持部署与调试,但需按需选用。
Coze智能体“文件盒子”是知识库系统,支持上传PDF、Word、图片等文件,自动分段并智能检索,使AI助手精准提取答案,适用于学习、工作、客服等场景,操作简单无需编程。
智能体作为决策指挥官,链式框架提供模块化开发,检索增强生成从海量数据提取关键信息。三者协同构建动态人工智能系统,实现实时智能决策、知识保鲜与高度可扩展架构,重塑开发新范式。
- 日榜
- 周榜
- 月榜
热点快看
