懒人最新OA注入漏洞+getshell

颓废 2019年5月19日09:53:37评论523 views字数 2492阅读8分18秒阅读模式
摘要

0x01 注入(好几处) Ps:感觉这种问题出现的情况非常多啊,内部本来有写过滤,但就是在某些地方不用
在用户中心的地方,因为代码基本上都相同,所以拿一处来说就好了
manage/Common/Mail_List.aspx页面,会根据querystring传入的值来判断是收件箱/草稿箱还是xx箱

0x01 注入(好几处)

Ps:感觉这种问题出现的情况非常多啊,内部本来有写过滤,但就是在某些地方不用
在用户中心的地方,因为代码基本上都相同,所以拿一处来说就好了
manage/Common/Mail_List.aspx页面,会根据querystring传入的值来判断是收件箱/草稿箱还是xx箱

if (!base.IsPostBack) {     if (!string.IsNullOrEmpty(base.Request.QueryString["fid"]) && !string.IsNullOrEmpty(this.Uid))     {         this.Show(base.Request.QueryString["fid"]);      } } 

跟入Show方法

private void Show(string string_2) {     //xxxx     string text = "FolderType=" + string_2 + " and ReceiverID=" + this.Uid;     string text2 = base.Request.QueryString["keywords"];     if (!string.IsNullOrEmpty(text2) && Utils.CheckSql(text2))     {         string text3 = text;         text = string.Concat(new string[]{                 text3,                 " and (SenderRealName like '%",                 text2,                 "%' or SenderDepName like '%",                 text2,                 "%' or Subject like '%",                 text2,                 "%') "         });      } int num4 = Convert.ToInt32(MsSqlOperate.ExecuteScalar(CommandType.Text, "select count(*) from Mails where " + text, null)); } 

注意到有个CheckSql的方法,但是,他并没有处理传入的string2也就是querystring进来的fid,把他带入了text变量,然后下面判断什么鬼就直接不用管了,因为下面执行sql中直接就把text带进去了,注入产生,这个系统如果出错会跳转到自定义错误页面,但是直接用sqlmap跑就可以啦

懒人最新OA注入漏洞+getshell

0x02 getshell

Ps:这种判断方法也经常遇到,不仅是CTF,实战中也遇到过两次
在User_InfoEdit.aspx页面中,有个上传头像的操作,看看文件上传的处理

if (this.Fup.HasFile) {         FileExtension[] fileEx = new FileExtension[]         {                 FileExtension.GIF,                 FileExtension.JPG,                 FileExtension.PNG,                 FileExtension.BMP         };         if (FileSystemManager.IsAllowedExtension(this.Fup, fileEx))         {                 string userName = sys_UserInfo.UserName;                 string text = base.Server.MapPath("~/Files/common/");                 string text2 = userName + Path.GetExtension(this.Fup.FileName);                 text += text2;                 this.Fup.PostedFile.SaveAs(text);                 sys_UserInfo.PerPic = text2;                 this.Fup.Dispose();         } } 

跟进这个FileExtension发现是个枚举

public enum FileExtension {         JPG = 255216,         GIF = 7173,         BMP = 6677,         PNG = 13780 } 

这些数字很奇怪,那么来分析一下,以PNG文件举例,这个文件前两个字节是89 50,89转换为10进制为137,50转换为10进制为80,合起来刚好就是13780,再看看JPG图片,前两字节为FF D8,十进制分别为255,216,合起来刚好是255216,至于为什么会看前两个字节呢,往下走

跟进IsAllowedExtension,这里开始判断合法文件了,将整个fileupload控件和文件类型的数组传了进去,跟进去

public static bool IsAllowedExtension(FileUpload fileUpload_0, FileExtension[] fileEx) {         int contentLength = fileUpload_0.PostedFile.ContentLength;         byte[] buffer = new byte[contentLength];         fileUpload_0.PostedFile.InputStream.Read(buffer, 0, contentLength);         MemoryStream memoryStream = new MemoryStream(buffer);         BinaryReader binaryReader = new BinaryReader(memoryStream);         string text = "";         try         {                 text = binaryReader.ReadByte().ToString();                 text += binaryReader.ReadByte().ToString();         }         catch         {         }         binaryReader.Close();         memoryStream.Close();         bool result;         for (int i = 0; i < fileEx.Length; i++)         {                 FileExtension fileExtension = fileEx;                 if (int.Parse(text) == (int)fileExtension)                 {                         result = true;                         return result;                 }         }         result = false;         return result; } 

这些操作完成的功能是,读了上传文件内容的前两个字节,然后转换成10进制依次和枚举值比较,相同则判断是合法能上传的文件
构造一个文件,将前两字节置为89 50,伪造成png

懒人最新OA注入漏洞+getshell

然后上传就行了

懒人最新OA注入漏洞+getshell

访问原文

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
颓废
  • 本文由 发表于 2019年5月19日09:53:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   懒人最新OA注入漏洞+getshellhttp://cn-sec.com/archives/68358.html

发表评论

匿名网友 填写信息