在阅读了著名的(也是唯一的)article 之后关于试图解释为什么 asmxs
不应该允许获取请求
所以我们不应该使用:[ScriptMethod(UseHttpGet = true)]
,我还有一个问题:
为什么?
Web 服务,顾名思义,他不关心它是 GET 还是 POST:
即使一个人做了一个 CSRF:比如嵌入他的恶意网站:
<script type="text/javascript" src="http://contoso.com/StockService/Stock.asmx/GetQuotes?symbol=msft" />
那又怎样?
通过 asmx POV - 这只是一个正常的请求。
有人可以帮我找出示例中的问题吗?
编辑
新浏览器解决了许多问题。 这个link显示了一些应该在新浏览器中测试的其他方法。
最佳答案
JSON 劫持在 this article 中有简要说明。 .
假设您有一个网络服务,可以将信用卡号列表返回给当前经过身份验证的用户:
[{"id":"1001","ccnum":"4111111111111111","balance":"2345.15"},
{"id":"1002","ccnum":"5555555555554444","balance":"10345.00"},
{"id":"1003","ccnum":"5105105105105100","balance":"6250.50"}]
攻击的执行方式如下:
让经过身份验证的用户访问恶意页面。
恶意页面会尝试从用户登录的应用程序访问敏感数据。这可以通过在 HTML 页面中嵌入脚本标签来完成,因为同源策略不适用于脚本标签。
<script src="http://<json site>/json_server.php"></script>
.浏览器将向json_server.php
发出 GET 请求并且用户的任何身份验证 cookie 将随请求一起发送。此时,虽然恶意网站已执行脚本,但它无法访问任何敏感数据。可以通过使用对象原型(prototype) setter 来实现对数据的访问。在下面的代码中,当尝试设置
"ccnum"
时,对象原型(prototype)属性被绑定(bind)到定义的函数。属性(property)。Object.prototype.__defineSetter__('ccnum',function(obj) { secrets = secrets.concat(" ", obj); });
至此,恶意站点已成功劫持由 ccnum
返回的敏感财务数据 ( json_server.php
) .
还有其他形式的 JSON 劫持技术不依赖浏览器对 __defineSetter__
的支持。功能。这只是进行攻击的一种方式,但还有许多其他方式,如 this article 中所述。例如 Array constructor clobbering
, UTF-7
, ES5 functionality
.
因此,返回 JSON 的 GET 请求在 ASP.NET 中默认被禁用。
关于javascript - WebService [Get] 请求的安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12727187/