在得到某一个政用系统源码时,对这个系统进行了小小的审计,系统是.NET开发的,还做的不错,很多常规漏洞都有很好的防范,但是一些小小的细节还是有很多没有做到位,在审计的时候发现几处漏洞,但都是比较鸡肋的,这里就挑两处比较算漏洞的来分析吧,由于漏洞通用政府,所以就某系统吧。

越权漏洞

这个漏洞算是比较鸡肋的了,因为要知道其他用户的guid,而guid是系统在建立帐号之初自动随机生成的,所以要爆破32位还是比较难的,看起来像MD5,其实不是,但是如果爆破出来,可以登录账户了,连帐号密码都不用。下面来看下代码怎么写的。

这个是修改账户密码的代码,其他位置逻辑相同。

1

首先,获取我们传过来的参数值

guid

password

然后判断这两个参数是否为空,这个地方并没有检查旧密码,所以给越权提供了条件。利用attender类进行密码的更新,这个帐号定位是利用guid来进行的,前面说了,每个账户生成唯一的一个gud值。成功返回1,失败返回0。所以,只要我们控制了guid的值,就可以重置任意用户的密码值了。

这里就不演示了,下面来看一个威力大的文件上传漏洞。

文件上传漏洞

2

后端首先获取了pic参数的值,这个是上传文件的数据。

接着一个if判断语句判断数据是否为空,然后初始化文件后缀放到str4变量中

1
string str4 = "jpeg";

对我们上传的文件进行数据分割以’,’为分隔符,

1
string[] strArray = str.Split(new char[] { ',' });

把文件的Type与真正的文件数据进行分割

1
string[] strArray3 = strArray[0].Split(new char[] { ';' })[0].Split(new char[] { ':' });

我们上传的数据格式是下面这个样子的

1
data:image/jpg;base64,dGVzdA==

下面就是漏洞点了,前面说了str4为文件后缀变量,这里把我们的文件Type给赋值给了str4,而image/jpg这个是我们可控的。

1
2
3
4
5
6
7
try
{
str4 = strArray3[1].Split(new char[] { '/' })[1]; //漏洞点
}
catch
{
}

文件的数据是经过了Base64加密了的,所以我们上传也要把数据加密成Base64在上传。

下面代码先是对文件数据进行了解密,然后进行了文件后缀拼接并把文件名赋值给了变量str6,最后写入相关上传目录。

1
2
3
4
5
6
byte[] bytes = Convert.FromBase64String(strArray[1].ToString().Replace(" ", "+"));
string str6 = DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") + "." + str4;
File.WriteAllBytes(context.Server.MapPath("~/upload/img/" + str6), bytes);
retmodel.Succeed = "1";
retmodel.Text = str6;
}

好了,漏洞就是这样。下面来找个真实网站试一下。

3

4