懒人OA 注入 && getshell

0x01 注入(好几处)

Ps:感觉这种问题出现的情况非常多啊,内部本来有写过滤,但就是在某些地方不用

在用户中心的地方,因为代码基本上都相同,所以拿一处来说就好了

manage/Common/Mail_List.aspx页面,会根据querystring传入的值来判断是收件箱/草稿箱还是xx箱

1
2
3
4
5
6
7
if (!base.IsPostBack)
{
if (!string.IsNullOrEmpty(base.Request.QueryString["fid"]) && !string.IsNullOrEmpty(this.Uid))
{
this.Show(base.Request.QueryString["fid"]);
}
}

跟入Show方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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跑就可以啦

e8474b1ffdbff1c962cb849acee3063d.jpg

0x02 getshell

Ps:这种判断方法也经常遇到,不仅是CTF,实战中也遇到过两次

在User_InfoEdit.aspx页面中,有个上传头像的操作,看看文件上传的处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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发现是个枚举

1
2
3
4
5
6
7
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控件和文件类型的数组传了进去,跟进去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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

772d928cc6f07ecc83017fb9119b964d.jpg

然后上传就行了

21033b51f486817b0892f6aa41701c4f.jpg

Author: 4uuu Nya
Link: https://qvq.im/2016/09/12/懒人OA-注入-getshell/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.