ASP和ASP.NET Web应用程序在表单中使用名为VIEWSTATE的值.据我所知,这用于在客户端之间在Web服务器请求之间保持某种状态.
我从未使用ASP或ASP.NET,需要一些帮助来解决两个问题(以及一些子问题):
1)是否可以以编程方式欺骗/构建表单的VIEWSTATE?澄清:程序可以查看表单,并从该构造中查看base64编码的VIEWSTATE值的内容吗?
1 a)或者它总是可以被遗忘?
1 b)特定表单的旧VIEWSTATE是否可以在以后调用同一表单时重用,或者只要运气好吗?
2)我从http://msdn.microsoft.com/en-us/library/ms972976.aspx#viewstate_topic12开始收集可以打开安全性,以便VIEWSTATE免于欺骗.程序是否有可能以这种方式检测到VIEWSTATE是否受到保护?
2 a)EVENTVALIDATION值的出现与安全的VIEWSTATE之间是否存在一对一的映射?
关于1)和2),如果是的话,我可以暗示如何做到这一点吗? 2)我想我可以对该值进行64位解码并搜索一个总是在未加密的VIEWSTATE中找到的字符串. “第一:”?别的什么?
背景
我已经制作了一个small tool用于检测和利用所谓的CSRF漏洞.我使用它来快速证明我发送给受影响的网站所有者的此类漏洞的概念.我常常在VIEWSTATE遇到这些表格,而这些表格我不知道它们是否安全.
编辑1:稍微澄清问题1.
编辑2:以斜体添加文本.
解决方法
Is it possible to programmatically spoof/construct a VIEWSTATE for a form?
当然.它只是一个Base64编码值.现在,从ASP.NET 2.0开始,有一个选项可以通过机器密钥加密视图状态,但这是一个选择加入功能.通常,您不希望首先在视图状态中放置任何私有内容.
Or can it always just be left out?
ASP.NET的一些管道需要ViewState,如果您仍想使用ASP.NET服务器控件,则完全关闭它是相当困难的.
Can an old VIEWSTATE for a particular form be reused in a later invocation of the same form,or would it just be luck if that worked?
这被称为replay attack
对的,这是可能的.这是blog post展示它.
Is there a one-to-one mapping between the occurrence of EVENTVALIDATION values and secure VIEWSTATEs?
并不是的.事件验证主要用于确保客户端事件与服务器上可能发生的“可能”事件匹配.它主要保护并确保像__EVENTTARGET这样的隐藏输入没有被篡改.