ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

什么是 ASP.NET ViewState?一文讲透视图状态、签名与加密机制

什么是 ASP.NET ViewState?一文讲透视图状态、签名与加密机制 什么是 ASP.NET ViewState一文讲透视图状态、签名与加密机制【免费下载链接】viewgenViewgen is a ViewState tool capable of generating both signed and encrypted payloads with leaked validation keys项目地址: https://gitcode.com/gh_mirrors/vi/viewgen在接触 ASP.NET 安全测试时你一定会遇到ASP.NET ViewState视图状态这个神秘又关键的概念。它既是 WebForms 保持页面状态的核心机制也是著名的攻击面——当签名与加密密钥泄露时攻击者甚至能直接伪造 ViewState 实现远程代码执行。本文将从零讲透ViewState 视图状态的存储原理、签名与加密机制并介绍用 viewgen 工具验证密钥、生成合法 payload 的完整思路。什么是 ASP.NET ViewState视图状态HTTP 协议本身是无状态的服务器不会记住你上一次请求做了什么。而 ASP.NET WebForms 为了弥补这一点设计了一个隐藏字段__VIEWSTATE把页面上控件的状态文本框内容、下拉框选项、分页数据等序列化后存放在这个字段里随表单一起回传给服务器。简单来说ViewState 的工作流程是这样的服务器渲染页面时把控件状态序列化成二进制数据经过 Base64 编码后写入隐藏字段__VIEWSTATE浏览器提交表单时这个字段随 POST 请求一起发送服务器反序列化 ViewState恢复控件状态再渲染下一轮页面。你可以打开任意一个 WebForms 网页按下 F12 查看源码大概率能找到一行类似input typehidden name__VIEWSTATE value/wEPDwUK...的字段这就是视图状态本身。ViewState 里藏着什么ViewState 中保存的内容一般是页面上控件的属性状态例如下拉框选中的值文本框输入的内容分页控件的当前页以及页面上自定义存储的数据 注意ViewState 不是用来传数据的 API它本质是页面状态快照。但它会被客户端原样回传因此天然存在被篡改和伪造的风险。ViewState 为什么要签名与加密如果 ViewState 只是简单的 Base64 编码那么任何攻击者都能解码、修改、再编码回去——比如篡改控件的权限状态、价格字段等。为了防篡改微软引入了ViewState 签名与加密机制签名Signature使用machineKey中的validationKey验证密钥对 ViewState 数据计算 HMAC 摘要并附加在末尾。服务器验证时重新计算摘要若不一致则拒绝请求从而保证数据完整性。加密Encryption使用decryptionKey解密密钥通过 AES/DES/3DES 算法加密整个 ViewState保证数据机密性防止直接读取内容。这两套机制都配置在站点的web.config文件的machineKey节点中machineKey validationKeyC50B3C89CB21F4F1... decryptionKey8A9BE8FD67AF6979... validationSHA1 decryptionAES viewStateEncryptionModeAlways /其中配置项作用常见取值validationKey签名用验证密钥随机十六进制字符串validation签名算法SHA1 / MD5 / SHA256 / AES / 3DESdecryptionKey加密用解密密钥随机十六进制字符串decryption加密算法AES / DES / 3DESviewStateEncryptionMode加密模式Auto / Always / NeverViewState 签名机制详解HMAC 验签未加密的 ViewState payload 结构大致是[序列化数据] [HMAC 签名]签名计算时除了 payload 本身还会把modifier来自隐藏字段__VIEWSTATEGENERATOR的值有时还加上ViewStateUserKey拼进 HMAC 的输入。这就是为什么伪造 ViewState 时必须提供正确的 modifier否则签名永远校验失败。校验逻辑大致如下取出 ViewState 末尾的签名长度取决于哈希算法如 SHA1 为 20 字节用 validationKey 和 modifier 对前面的数据重新计算 HMAC对比两者是否一致一致才接受该 ViewState。 关键认知签名算法的强度完全取决于validationKey 是否保密。密钥一旦泄露攻击者就可以计算出任何数据的合法签名签名机制形同虚设。ViewState 加密机制详解AES/3DES当viewStateEncryptionModeAlways或使用了 AES/3DES 签名模式时ViewState 会先加密再签名。加密后的结构大致为[IV] [密文] [HMAC 签名]IV初始化向量随每个 payload 随机生成密文由 AES/DES/3DES 在 CBC 模式下加密得到最后对整个IV 密文计算签名防止密文被篡改。解密时需要同时知道decryptionKey和validationKey。这也解释了为什么泄露一份web.config往往等于一键解锁整站——密钥、算法、加密模式全部就位。ViewState 安全风险密钥泄露与 RCEViewState 真正的危险在于当密钥泄露时攻击者可以伪造 ViewState触发 .NET 反序列化漏洞实现远程代码执行RCE。原因是 ViewState 使用的是ObjectStateFormatter进行序列化。如果攻击者能构造一个恶意的序列化对象例如利用 ysoserial.net 生成的 gadget并成功通过签名校验服务器反序列化时就会执行其中的命令。典型攻击链条如下通过任意文件读取、备份文件、报错信息等途径泄露web.config拿到 validationKey / decryptionKey抓取页面的__VIEWSTATE和__VIEWSTATEGENERATOR值用工具如 viewgen基于泄露的密钥生成合法的恶意 ViewState把恶意 ViewState 作为 POST 参数提交触发反序列化执行命令。用 viewgen 工具检测与生成 ViewStateviewgen正是一款用于ViewState 攻击与检测的 Python 工具核心功能是在获得泄露的验证密钥或web.config文件时生成合法签名与加密的 ViewState payload同时也支持解码、验签、猜测算法模式。其主程序见 viewgen官方使用说明见 README.md。安装方法viewgen 依赖 Python 3一行命令即可安装依赖依赖列表见 requirements.txtpip3 install --user --upgrade -r requirements.txt也可以运行 install.sh 自动安装并复制到系统路径或使用 Dockerfile 构建镜像docker build -t viewgen .克隆仓库的命令为git clone https://gitcode.com/gh_mirrors/vi/viewgen核心用法一从 web.config 自动加载密钥viewgen 支持直接解析web.config自动提取 validationKey、decryptionKey、算法和加密模式省去手动拼参数的麻烦viewgen --webconfig web.config --modifier CA0B0334 zUylqfbpWnWHwPqet3cH5P...核心用法二解码与验签拿到一个 ViewState payload 后可以验证它是否加密、签名是否正确viewgen --decode --check --webconfig web.config --modifier CA0B0334 PAYLOAD核心用法三自动猜测签名与加密算法如果只有 payload 没有配置可以用--guess让工具根据长度推断签名算法和加密模式加密还是未加密、SHA1 还是 MD5viewgen --guess /wEPDwUKMTYyODkyNTEzMw9kFg...核心用法四生成 RCE 恶意 payload当拿到 web.config 后可直接让 viewgen 生成可执行命令的恶意 ViewState基于 ysoserial.net 的 ObjectStateFormatter gadgetviewgen --webconfig web.config -m CA0B0334 -c ping yourdomain.tld生成后把输出作为__VIEWSTATE提交到对应页面端点即可触发反序列化执行。整个流程在 README 的 Achieving Remote Code Execution 一节中有完整演示。如何防御 ViewState 相关攻击无论做安全测试还是加固生产环境以下几点都值得收藏密钥绝对保密validationKey和decryptionKey不要写死在代码或备份文件中不要使用默认值定期轮换密钥为machineKey建立更换周期缩短泄露后的可利用窗口使用强算法优先选择 SHA256 以上签名、AES-256 加密避免 MD5 等弱算法开启 ViewStateUserKey绑定用户会话标识如 Session ID让攻击者无法跨用户复用伪造的 ViewState限制反序列化风险升级到支持 ViewState MAC 强制校验的 .NET 版本关注官方安全补丁清理敏感文件禁止web.config等文件被直接下载或出现在错误堆栈、备份压缩包中。总结一句话回顾全文ASP.NET ViewState视图状态是 WebForms 维持页面状态的核心机制通过签名与加密保证数据完整性而一旦 validationKey 等密钥泄露攻击者就能借 viewgen 这类工具伪造合法 payload最终触发反序列化实现远程代码执行。理解签名与加密机制是评估 ViewState 安全性的第一步。无论你是刚接触 ASP.NET 的新手还是做安全测试的工程师都可以用 viewgen 实际跑一遍解码、验签、伪造的完整流程很快就能建立起对这套机制的直观认识。⚠️ 声明本文仅用于教育和授权范围内的安全测试。未经授权对他人系统进行测试属于违法行为请务必在获得许可后再动手。【免费下载链接】viewgenViewgen is a ViewState tool capable of generating both signed and encrypted payloads with leaked validation keys项目地址: https://gitcode.com/gh_mirrors/vi/viewgen创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表