source/class/discuz/discuz_upload.php 136行
function get_target_filename($type, $extid = 0, $forcename = '') { if($type == 'group' || ($type == 'common' && $forcename != '')) { $filename = $type.'_'.intval($extid).($forcename != '' ? "_$forcename" : ''); } else { $filename = date('His').strtolower(random(16)); } return $filename; }
上传附件时保存的文件名前6位为当前"时分秒" 目录为/data/attachment/forum/年月/日/
附件上传时间帖子中可以直接看到,精确到分 只要爆破秒数就可以下载任意附件
http://example.com/data/attachment/forum/201908/01/084532~1.rar
可任意下载收费附件
评论 (8)
坑晨 4月前
不对吧,discuz 的附件存储格式为:
data/attachment/forum/201908/01/000000XXXXXXXXXXXXXXXX.rar
前面的确如楼主所言,是可以根据上传时间猜测出来的。
但是后面还有16位定长的“数字/英文”混合字符串啊,没有那么容易可以被枚举出来。
所以这个问题属于:IIS 短文件名泄露漏洞,而不是 discuz 本身有问题。
解决方法:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem(注册表)
修改 NtfsDisable8dot3NameCreation 的值为 1(重启生效)
命令行输入 fsutil 8dot3name set 1
坑晨 4月前
更加简单粗暴的方法,直接在 Web.config 文件中添加以下代码:
同理 Nginx 和 Apache 也可以在配置文件中进行类似操作,过滤敏感字符。
<configuration>
<system.webServer>
<security>
<requestFiltering>
<denyUrlSequences>
<add sequence="**" />
<add sequence="~1" />
</denyUrlSequences>
</requestFiltering>
</security>
</system.webServer>
</configuration>
索马里的海贼 4月前
@坑晨 的确是windows的问题,但是在默认环境下可以产生安全问题的代码我感觉也是一个问题吧?除非discuz说明windows安装需要关闭短文件名访问,不然又有多少人知道装discuz需要去修改这么一个配置呢。dz的使用者不是全都是运维开发出生,很多根本不懂代码不懂配置,按照安装文件的说明一路安装完了 却发现存在问题,这本身就说明一切了吧。
解决方法也很简单 文件名随机字符串开头就行了。
还有参考我另一个issue的回复 跟iis没关系 apache nginx一样的。
坑晨 4月前
@索马里的海贼 你混淆了概念,短文件名是由于历史原因遗留的系统特性,这个的确没错。但这不是问题,因为如果只有本地能访问就没有安全隐患。问题还是出在服务器程序配置不对,或者没有及时更新补丁,导致外网也能通过 ~1 这样的链接访问文件,产生了BUG。
你要求 discuz 官方修改附件命名保存规则,我觉得是很不现实的。一方面这不是程序本身的问题,另一方面由于 discuz 系统有庞大的历史包袱,为了向前兼容然后搞两套命名规则,不是更加臃肿了么。
索马里的海贼 4月前
@坑晨 跟iis无关 跟补丁无关 说实话我没有windows+iis的环境 所以我先不说iis(正在下载server2008 r2)我测试了apache和nginx。都是默认配置。
请用自己喜欢的任意windows系统安装apache nginx 然后web根目录放一个1234567.zip 看看能不能通过http://127.0.0.1/123456~1.zip来访问文件。
另外 你可以看下get_target_filename这个函数的引用 实际上热更都不会有任何问题,旧上传文件仍然可以用,新的上传文件也只是名字变了 不影响下载。
坑晨 4月前
@索马里的海贼 虚拟机安装 Windows Server 2008 R2,打上全部补丁,测试结果是 IIS 不能访问类似地址。而 Apache 和 Nginx 不是开箱即用的,你什么都不配置那还不如 IIS 呢。好了,这个问题可以终结了!
DiscuzX 4月前 成员
存在短文件名泄露漏洞的话,文件名没有用date('His'),也能通过一位一位的猜测文件名,来破解前六位字母
猜解目录下是否存在一个a开头的文件或文件夹,访问:
http://www.target.com/a*~1****/a.aspx
如果存在,将返回404。 如此反复,不断向下猜解完所有的6个字符。
猜解完之后,得到的序列应该类似:
http://www.target.com/abcdef*~1****/a.aspx
也就是只要存在这漏洞,理论上写个程序就能自动猜解了,毕竟文件名一般就用字母和数字,一位一位的猜很快。然后rar、zip这种附件一般被重命名成.attach,IIS应该默认不能直接打开这类文件。改文件名可能还没有模板里删除上传时间来的有效。
不过程序里调整文件名的生成也是有必要的
https://blog.csdn.net/baidu_38795342/article/details/79483865
老周部落 4月前
这种漏洞要完整修复,只能让文件名以#开头(或者放到Web目录外),完了所有下载请求通过PHP中转。
数据库备份可以考虑这样修复(文件小,频次低),但是如果附件越权下载也这么修,原有操作逻辑动的太大了,在大流量站点还浪费服务器性能。不过可以考虑后台想招判断一下是否存在漏洞,完了后台放个警告,要求用户自己改配置。
文章评论