0

我已经为我的客户创建了一个文件上传,我正在努力使事情尽可能安全。我正在使用以下代码来处理文件上传。想法是重命名文件并将其写入 Web 根目录之外的文件夹。

问题是,在“写入”过程中,ColdFusion 是否有可能在将文件写入文件夹并使用以下代码重命名之前允许执行恶意文件?

这是我组件的顶部...

<cfset destdir = "/folder/upload/">

这是处理文件的代码的一部分......

<cfset var local = structNew()>
<cfset local.response = structNew()>
<cfset local.response['catcher'] = ''>
<cfset local.filename = listGetAt(#arguments.file#, 1, ".")>
<cfset local.fileext = ListLast(#arguments.file#, ".")>
<cfset local.nfile = #CreateUUID()# & "." & #local.fileext#>

<cftry>
  <cffile action="write" file="#destdir##local.nfile#" output="#arguments.content#">
  <cfset local.response['newfilename'] = local.nfile>
  <cfcatch type="any">
  <cfset local.response['catcher'] = "Write Exception " & #cfcatch.Detail# & " | " & #cfcatch.Message#>
  <cfset local.response['success'] = true>
  <cfreturn local.response>
  </cfcatch>
</cftry>

我应该提到文件上传过程是由 CFC 和 Valums 的 AjaxUpload 插件处理的......

4

3 回答 3

4

您的示例代码看起来像是在做与普通文件上传不同的事情。您没有 cffile action="upload",看起来您已经检索到文件的内容。您应该将它们限制为local.fileext您认为安全的文件类型,并且Arguments.content应该检查它以确保它不是恶意的。一旦您将文件写入 webroot,就可以通过 url 对其进行探测,因此您必须在写入之前验证一切都是安全的。

使用正常的表单发布文件上传过程应该是这样的:

  1. 用于cffile action="upload"将文件上传写入 webroot 之外的临时文件夹
  2. 验证文件的完整性以确保它不是恶意的(如果文件不正确则删除)
  3. 将经过验证的文件移动到其最终位置cffile action="move"
于 2012-04-19T21:17:57.933 回答
1

要回答您提出的问题-您的“写入”操作是单个操作。您没有移动和重命名原始文件(至少在上面的代码中没有)。相反,您正在创建一个文件句柄,输出一个缓冲区并关闭句柄。在释放句柄之前无法执行代码。如果您正在移动、重命名或复制文件本身,那么您可能会担心会出现间隙 - 足以允许执行。您还应该知道,如果您打算在单个请求线程中写入然后执行文件,则文件 I/O 可能会产生问题(尝试访问文件时可能会出错,因为 Java 可能会在收到通知时稍微领先于操作系统如果你看到我在说什么,手柄释放)。

这是一篇关于 cffile hacking 的帖子,它可能会揭示您问题的边缘。

http://www.coldfusionmuse.com/index.cfm/2009/9/18/script.insertion.attack.vector

注意 - 这是我的理解......非常可靠,但这个名单上有一些非常聪明的人,包括那些已经做出回应的人。不想在这里偷走任何人的风头。

于 2012-04-20T17:59:05.900 回答
0

在上传时重命名文件并将其放置在 Web 根目录之外是一个好主意,但仍有一些基本要点可以提高 Coldfusion 中文件上传的安全性。

对于初学者,带有动作上传的cffile 有一个属性“accept”,您可以在其中指定文件上传允许的mime 类型(逗号分隔列表)。
cffile 还有一个“mode”属性(仅适用于 linux)来设置文件的权限
来源: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content= Tags_f_02.html

我不认为上传的恶意文件可以在上传时自动执行,但采取预防措施是一个好习惯。

于 2012-04-20T07:53:24.560 回答