前言

  1. 打开网站发现可以下载帮助文档,通过帮助文档知道用户名规则和默认的密码是:111
  2. 通过弱口令登录一个普通用户,发现下载文件是直接拼接绝对路径的。

任意文件下载绕过

随意传一个路径导致接口报错知道了网站的绝对路径

img

测试发现可以下载 web.config ,但是 aspx, ashx, cs, dll 之类的后缀名下载不了

img

突然想起在文件后缀名加一个 . 在 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;
	}
}

img

任意文件上传

上传的接口需要登录,可以传入一个 SaveName ,像任意文件下载做了文件后缀名的过滤,可以利用上面的方式进行绕过 1.aspx.

img

img

利用方式:

方式一: 传入 SaveName 的情况:fileName 不等于空就不会进入if (string.IsNullOrEmpty(fileName)) 判断

string sub_path = Share.IO.GetNewTempRelativePath(context.Session["MemID"].ToString());
string fileName = "1.aspx.";
bool isimg = false;

上传的文件不在网站目录,但是文件名不会重命名,可以利用 ../ 进行跨目录,但是 ../ 会被拦截。img

方式二:

  1. 不传入 SaveName 就会进入 if (string.IsNullOrEmpty(fileName)) 判断 ,context.Server.MapPath 就是网站目录
  2. 获取后缀名:System.IO.Path.GetExtension(context.Request.Files[0].FileName); 可以直接上传 aspx
  3. isimg = ture ,resPath 就会输出 fileName | showpath

img

成功拿下

img