.NET预编译环境下的两种Getshell方法
注: 必须要有两个必要条件
1.文件名不会被重命名
2.可跨目录
先来了解一下什么是预编译?
这里我简单的写了一个ashx文件。正常来讲
应该是一个ashx和一个cs文件-(一个处理文件一个源文件)
或者另一种写法。只有一个ashx文件(源代码写在处理文件内)
这时候在web服务器上是可以正常访问的
当然,即使更改了ashx文件中的内容。也会在下一次请求文件时进行刷新。这种叫动态编译。即访问一次,编译一次。
那么预编译是什么?
就类似于先将源文件进行编译成dll文件。
如index.aspx
-> 预编译 -> index.dll
当用户访问时,并不是指向index.aspx而是指向index.dll
即使index.aspx
文件被删除了,或者进行了更改。只要index.dll
没有进行更改。那么,内容就不会更新。
在程序进行发布时。会有这么一个选项
参考Visual Studio:
这里会有一个“允许更新预编译站点”。如果这个进行了选中。那么aspx进行更改的同时,也会进行处理。因为这里是允许更新预编译内容的。
如果程序在发布时没有进行选中。那么新建的aspx文件就不会更新处理。
这就导致了我们在实际渗透环境中,上传的aspx文件不能被处理。或者显示
has not been pre-compiled, and cannot be requested.
预编译,因此无法请求。
这里有两种解决方法:
第一种方法:
更改PrecompiledApp.config
的内容(满足最开始的两个条件可以直接覆盖原文件内容)
<precompiledApp version="2" updatable="false"/>
PrecompiledApp.config
主要作用就是控制程序是否允许更新预编译内容。
上面的默认配置是false
。也就是不允许更新预编译内容。这时候我们上传的aspx内容是不会被编译处理的。
如果要进行处理需要把updatable
的值改为true
<precompiledApp version="2" updatable="True"/>
上传的文件就可以直接进行处理
注意:这个方法比较鸡肋,需要重启IIS后才能生效。不建议
第二种方法:
既然预编译是将aspx编译成了dll文件
存储在bin目录
下。那么,当我们满足最开始的两个条件时。可以尝试往bin目录
写一个已编译的dll文件。
具体操作:
使用NET.Framework
自带的aspnet_compiler.exe
进行编译。
aspnet_compiler.exe默认目录
C:\Windows\Microsoft.NET\Framework64\v2.0.50727
编译
aspnet_compiler -v \ -p (web文件所在目录) (编译后存储目录) -fixednames
-v 要编译的虚拟目录。这个\是根目录 也就是shell的所在的目录
-fixednames 每个.aspx文件都编译生成单独的dll文件,并使用固定文件名。
这里我使用冰蝎2.0的aspx shell
,放在指定目录
然后运行命令
aspnet_compiler -v \ -p 需要编译的目录 编译后的存储目录 -fixednames
这时候shell.aspx
已经被编译了
即使shell.aspx
不存在,访问指定路径,也是能正常处理的。
这里主要看bin
目录。
生成了两个文件
.dll
和.compiled
文件。这就是已经编译好的内容
将dll
文件拖入dnspy
。
这里的AppRelativeVirtualPath
就是你shell的地址。这里是根目录下的shell.aspx
只需要将这两个文件上传到bin
目录下即可。
上传完毕后。访问AppRelativeVirtualPath
显示的路径
这里肯能会提示Server Too Busy
刷新几次就可以了
写在最后的话:
别用Burp
的Paste form File
。 容易丢失字节,导致文件无法正常处理
自己写个表单,或者用PostMan
等工具
大师傅TQL~~YYDS