windows短文件名安全问题 绕过附件收费

作者: admin 分类: Discuz 发布时间: 2019-12-12 16:27

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/年月/日/
附件上传时间帖子中可以直接看到,精确到分 只要爆破秒数就可以下载任意附件

142517_d9d12d41_1504418.png

http://example.com/data/attachment/forum/201908/01/084532~1.rar
可任意下载收费附件

评论 (8)

说明: 1154599_xmoer

坑晨 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

说明: 1154599_xmoer

坑晨 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一样的。

说明: 1154599_xmoer

坑晨 4月前

@索马里的海贼 你混淆了概念,短文件名是由于历史原因遗留的系统特性,这个的确没错。但这不是问题,因为如果只有本地能访问就没有安全隐患。问题还是出在服务器程序配置不对,或者没有及时更新补丁,导致外网也能通过 ~1 这样的链接访问文件,产生了BUG

你要求 discuz 官方修改附件命名保存规则,我觉得是很不现实的。一方面这不是程序本身的问题,另一方面由于 discuz 系统有庞大的历史包袱,为了向前兼容然后搞两套命名规则,不是更加臃肿了么。

索马里的海贼 4月前

@坑晨 iis无关 跟补丁无关 说实话我没有windows+iis的环境 所以我先不说iis(正在下载server2008 r2)我测试了apachenginx。都是默认配置。
请用自己喜欢的任意windows系统安装apache nginx 然后web根目录放一个1234567.zip 看看能不能通过http://127.0.0.1/123456~1.zip来访问文件。
另外 你可以看下get_target_filename这个函数的引用 实际上热更都不会有任何问题,旧上传文件仍然可以用,新的上传文件也只是名字变了 不影响下载。

说明: 1154599_xmoer

坑晨 4月前

@索马里的海贼 虚拟机安装 Windows Server 2008 R2,打上全部补丁,测试结果是 IIS 不能访问类似地址。而 Apache Nginx 不是开箱即用的,你什么都不配置那还不如 IIS 呢。好了,这个问题可以终结了!

说明: 134400_3dming

DiscuzX 4月前 成员

存在短文件名泄露漏洞的话,文件名没有用date('His'),也能通过一位一位的猜测文件名,来破解前六位字母

猜解目录下是否存在一个a开头的文件或文件夹,访问:

 

http://www.target.com/a*~1****/a.aspx

 

如果存在,将返回404 如此反复,不断向下猜解完所有的6个字符。

猜解完之后,得到的序列应该类似:

 

http://www.target.com/abcdef*~1****/a.aspx

也就是只要存在这漏洞,理论上写个程序就能自动猜解了,毕竟文件名一般就用字母和数字,一位一位的猜很快。然后rarzip这种附件一般被重命名成.attachIIS应该默认不能直接打开这类文件。改文件名可能还没有模板里删除上传时间来的有效。
不过程序里调整文件名的生成也是有必要的

https://blog.csdn.net/baidu_38795342/article/details/79483865

说明: 1773794_laozhoubuluo

老周部落 4月前

这种漏洞要完整修复,只能让文件名以#开头(或者放到Web目录外),完了所有下载请求通过PHP中转。
数据库备份可以考虑这样修复(文件小,频次低),但是如果附件越权下载也这么修,原有操作逻辑动的太大了,在大流量站点还浪费服务器性能。不过可以考虑后台想招判断一下是否存在漏洞,完了后台放个警告,要求用户自己改配置。

 

IIS短文件名泄露漏洞修复



如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

标签云