可以使用外部代理工具篡改/修改请求范围变量吗?
Posted
技术标签:
【中文标题】可以使用外部代理工具篡改/修改请求范围变量吗?【英文标题】:Can the Request scope variables be tampered/modified using external proxy tools? 【发布时间】:2018-07-26 15:20:45 【问题描述】:我们已经知道可以使用外部代理工具修改 URL 和 FORM 范围变量。
例如,如果有人提出这样的请求 - http:\\website\index.cfm?a=1&b=2
这样可以将值添加到.cfm
页面的 URL 范围内。
同样有任何方法可以在 ColdFusion 中添加/更改请求范围的值,而无需在代码中明确设置。
我问这个是因为我们在 CFM 页面中有这样的代码。
<cfset request.uploadFileDir = application.fileDir & "\upload" />
<cffile action="upload" accept="application/pdf" destination="#REQUEST.uploadFileDir#" filefield="brochure" nameconflict="makeunique"/>
安全团队表示上述代码存在漏洞,因为 JAVA 中的 REQUEST
范围可以被外部代理工具篡改/更改。而且由于 ColdFusion 是基于 JAVA 构建的,ColdFusion 的REQUEST
也可以被外部代理工具篡改。这是一个正确的假设吗? JAVA 和 ColdFusion REQUEST
作用域一样吗?
最后是主要问题 - 是否有任何方式对示例中上述页面的外部请求,修改 REQUEST
范围或更准确地说是 REQUEST.uploadFileDir
变量?
【问题讨论】:
他们说 javarequest
的哪一部分可以被篡改?使用 jsp/servlets,我得到的印象是 request
范围有两个部分:get/setParameter() 和 get/SetAttribute()。 “参数”更像是 URL 范围,就像你说的,可以修改。而“属性”是本地服务器变量,无法修改 AFAIK。 ***.com/a/5243798/8895292
我的观点是请求范围变量只能在编程代码中定义和赋值。这意味着它们不能直接更改。但是,如果您从表单或 url 范围分配值,则可以间接更改它们。在你的情况下,看看REQUEST.uploadFileDir
是如何接收它的价值的。
使用范围注入的攻击者可能会从 url 或表单中传入变量。 Pete Freitag 有一篇关于如何在此处完成以及如何减轻威胁的简短文章:petefreitag.com/item/834.cfm
"而"属性"是本地服务器变量" ...所以CF的请求范围更类似于"属性",并且只能在服务器上修改。因此,只要 application.fileDir
不使用客户端提供的值(如硬编码字符串等),它就是安全的。
@Ageax 我猜他们说的是“参数”。在 ColdFusion 中,您可以使用“URL”(获取查询字符串)和“FORM”(获取 POST 数据)范围来检索它们。根据您提供的链接,ColdFusion 中的“REQUEST”范围似乎更像 JAVA 中的“ATTRIBUTE”,并且无法修改。感谢您提供初步参考。
【参考方案1】:
(从 cmets 推广,以便更容易找到参考。)
他们说 java 请求的哪一部分可以被篡改?使用 jsp/servlets,there seem to be 2 parts of the Request
scope:
参数 - request.get/setParameter()
Java 的请求“参数”更像是 ColdFusion 的 URL
和 FORM
范围,就像你说的,这些可以由客户端或外部工具修改。这可能就是他们在谈论客户端篡改时所想的。
属性 - request.get/setAttribute()
“属性”是本地服务器变量,不能在服务器外修改。 CF 的“请求”范围更类似于此。它只能在服务器上修改,AFAIK。(显然,它仍然可以是manipulated indirectly as Dan said)。
如果您好奇,请在您的 DEV 服务器 using a .jsp and .cfm script 上运行一些测试,看看 java 的“请求”范围与 ColdFusion 的不同。
TL;DR;
我认为他们错了。 ColdFusion 的“请求”范围与 Java 的不同。
【讨论】:
感谢您澄清与 JAVA 相关的两个问题。我正在投票,因为它回答了我的两个问题。但由于丹回答了主要问题,我将其标记为答案。真希望我可以选择将你们都标记为答案,因为两者都部分解决了问题。 很高兴它有帮助。【参考方案2】:在 OP 的祝福下从 cmets 转移。
我的观点是请求范围变量只能在编程代码中定义和赋值。这意味着它们不能直接更改。但是,如果您从表单或 url 范围分配值,则可以间接更改它们。在你的情况下,看看REQUEST.uploadFileDir
是如何获得它的价值的。
更多信息。
请求范围可用于页面请求中使用的任何编程文件,例如实际页面、包含的文件和自定义标记,这是一个可以更改的示例。
request.foo = url.foo;
这是一个不能的例子。
if (this is a development ColdFusion enviornment)
request.dsn = "development database";
else
request.dsn = "production database";
每件事都有时间和地点。我的大部分工作都没有使用请求范围。一个应用程序就可以。
【讨论】:
以上是关于可以使用外部代理工具篡改/修改请求范围变量吗?的主要内容,如果未能解决你的问题,请参考以下文章