可以使用外部代理工具篡改/修改请求范围变量吗?

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 变量?

【问题讨论】:

他们说 java request 的哪一部分可以被篡改?使用 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 的 URLFORM 范围,就像你说的,这些可以由客户端或外部工具修改。这可能就是他们在谈论客户端篡改时所想的。

属性 - 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";

每件事都有时间和地点。我的大部分工作都没有使用请求范围。一个应用程序就可以。

【讨论】:

以上是关于可以使用外部代理工具篡改/修改请求范围变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

常用代理工具

Tomcat 中的 WEB 应用如何使用代理向外部发起请求

fiddler工作原理和代理设置

从 VOLTTRON 外部对代理的 VOLTTRON RPC 调用

pycharm是常用的抓包工具吗

查尔斯代理修改响应