1.概述
这系统是二、三月份的时候朋友发我的,叫我审计一下,大概看了一下漏洞挺多的,引擎搜索了一下发现没人报出来,但应该不少人知道了,以为只是一个小型的系统,但没想到关键字一查有1W多个,算中型了,由于是收费的系统,不好透露,怕厂商警告,这里简单分享一下漏洞点,原理,审计的思路,小白解说,第一次写文章,没啥技术含量,可能写的并不是很好希望大佬们给指点一下哈哈,废话不多说,进入正题。
2.任意文件删除
在Ajax/upload.ashx中,可以看到没啥其他代码,直接简单粗暴引用了DLL文件程序。
我们这里直接跟进bin目录下的DLL文件,用ILSpy反汇编出来,看看有那些功能项
然后直接中奖,其中的Name值,没有任何过滤,直接通过context.Request["name"]取值,然后判断文件是否存在,存在则直接删除,并且没有做任何的权限限制,导致我们可以直接前台传值引用,造成任意文件删除。
3.Sql注入,任意文件下载。
在Ajax/upload.ashx中,这里文件下载,是通过查询数据库,判断文件是否存在,如果存在就下载,但是str的传值,没有经过任何过滤,通过context.Request["trueFileName"]传值进去,我们只需要根据action构造出相应的类,然后传入值即可造成Sql注入。
构造trueFileName=1' and (select @@version)>0--,成功返回数据库版本,顺便报错绝对路径,然后根据绝对路径,删除任意文件。
这里也应该可以构造MSSQL语句,把字符串../../../../+你要的文件,写入数据库中的FileSaveName,然后自定义这里dataSource.Rows[0]["FileSaveName"]返回的值,从而造成任意文件下载,不过有点麻烦,这里就不贴出来了(学艺不精,辣鸡小白)。
4.Sql注入(2)
在Ajax/upload.ashx中,str通过context.Request.QueryString["FID"]传值,然后赋值到Sql语句里面,跟上面一样,造成Sql注入,这里就不多说啥了,确实漏洞多,换个点继续撸,上传类粗略的看完他类。
5.Sql注入(3)
在Ajax/AjaxMethod.ashx中,通过context.Request["Name"];获取值,然后bool flag5 = !(new CreatePageManager().GetEmpByName(text2) == "0");,接着跟进一下
public string GetEmpByName(string empname)
{
return new CreatePageDao().GetEmpByName(empname);
}
在接着跟进一下
public string GetEmpByName(string LoginUser)
{
string result = string.Empty;
string sqlStr = string.Format("SELECT count(*) FROM bfEMP WHERE upper(LoginUser)='{0}'", LoginUser.ToUpper());
DataTable dataSource = this.GetDataSource(sqlStr);
bool flag = dataSource != null && dataSource.Rows.Count > 0;
if (flag)
{
result = dataSource.Rows[0][0].ToString();
}
return result;
}
我们根据代码构造action,然后传入name值,这里拐了几个弯,但是.NET的程序算起来,利用ILSpay溯源跟踪还是蛮容易的,单击就可以自动追踪到类的位置,其他地方Sql注入也还有,挺多的,但是不想看了,因为这个开发有问题,很多地方都是直接传进去,只有少数地方使用了参数化传值,大部分地方都是直接使用sql字符串拼接,也不验证数据类型,我看着代码都心累,其他还有一些漏洞,但是
6.密码重置sql注入(4)
在目录下的initpwd.aspx文件中,本来想看看又没有密码重置漏洞,但一看没找到啥,也可能是我技术不太行,又找到个注入,这里的string text15 = cookieValue;是通过GetCookieValue取值,然后直接使用Sql字符串进行拼接,然后跟到GetCookieValue
public static string GetCookieValue(string key) { bool flag = HttpContext.Current != null; string result; if (flag) { HttpCookie httpCookie = HttpContext.Current.Request.Cookies["UserCookie"]; try { string text = ""; bool flag2 = httpCookie != null; if (flag2) { Hashtable hashtable = JsonConvert.DeserializeObject(httpCookie.Value, typeof(Hashtable)) as Hashtable; bool flag3 = hashtable != null && hashtable.ContainsKey(key); if (flag3) { text = hashtable[key].ToString(); } } result = text; return result; } catch (Exception ex) { UserCookie.WriteLog("cookie err:" + ex.Message, "ddSaas"); result = ""; return result; } } result = ""; return result; }
发现是通过Json的形式,在客服端保存的cookie,取值的时候是直接取值的,我们只需要修改cookie中的值,就可以造成sql注入,这里应该可以直接构造Sql语句,使返回为为真,然后任意重置用户的账号密码。