任意文件下载绕过到getshell
前言
- 打开网站发现可以下载帮助文档,通过帮助文档知道用户名规则和默认的密码是:111
- 通过弱口令登录一个普通用户,发现下载文件是直接拼接绝对路径的。
任意文件下载绕过
随意传一个路径导致接口报错知道了网站的绝对路径
测试发现可以下载 web.config ,但是 aspx, ashx, cs, dll 之类的后缀名下载不了
突然想起在文件后缀名加一个 .
在 windows 好像可以解析,成功读取到源码。
#region 读取文件拓展名过滤
string downExtendName = Path.GetExtension(code).ToLower().Trim();
string[] notDownExtendNameArr = { ".aspx", ".cshtml", ".css", ".js", ".bat", ".dll", ".ashx", ".ascx", ".eri", ".xml", ".asp", ".cs" };
foreach (string item in notDownExtendNameArr)
{
if (downExtendName.Contains(item))
{
context.Response.Write("<script>alert('您下载的文件不被系统认可,请重新选择');</script>");
return;
}
}
任意文件上传
上传的接口需要登录,可以传入一个 SaveName ,像任意文件下载做了文件后缀名的过滤,可以利用上面的方式进行绕过 1.aspx.
利用方式:
方式一: 传入 SaveName 的情况:fileName 不等于空就不会进入if (string.IsNullOrEmpty(fileName)) 判断
string sub_path = Share.IO.GetNewTempRelativePath(context.Session["MemID"].ToString());
string fileName = "1.aspx.";
bool isimg = false;
上传的文件不在网站目录,但是文件名不会重命名,可以利用 ../ 进行跨目录,但是 ../ 会被拦截。
方式二:
- 不传入 SaveName 就会进入 if (string.IsNullOrEmpty(fileName)) 判断 ,context.Server.MapPath 就是网站目录
- 获取后缀名:
System.IO.Path.GetExtension(context.Request.Files[0].FileName);
可以直接上传 aspx - isimg = ture ,resPath 就会输出 fileName | showpath
成功拿下