Jump to content

[Xploit o Bug] groupsys se Asignan Rank Leader


Narutimmy

Recommended Posts

Hola vengo con un problema urgente que esta creando muchos problemas en el servidor, hace unos meses instale este sistema de grupos muy como ya que permite dar diferentes permisos a tus miembros, el problema es que ahi 1 usuario o mas no lose que de alguna manera se Mete a los clanes sin permiso sin invitacion ni nada, por si fuera poco Expulsa a todos los demas miembros incluidos al lider y demas.

El usuario se crea una cuenta con el name "Moderator" para que los usuarios crean que es alguien del staff pero no.

El sistema es este:

https://community.multitheftauto.com/ind ... ls&id=8291

Server:

------------------------------------------------------------------------------------ 
--  PROJECT:     N/A
--  RIGHTS:      All rights reserved by developers
--  FILE:        groupSystem/group.slua
--  DEVELOPER:  Sebbe (Smart)
------------------------------------------------------------------------------------
 
 
local groupTable = {}
local log = true -- Set this to false if you don't want group stuff to be logged in your server.log
local debugInfo = true -- Set this to false if you don't want to see see group logs in your debug mode.
local GAC = {} -- index = account (string), [1] = group name, [2] = rank, [3] = warning level, [4] = date Joined, [5] = last time online (Not Available)
local users = {}
local myGang = {}
local char = "[^0-9a-zA-Z_]"
local rankCache = {}
local db = dbConnect("sqlite", "/database.db")
dbExec(db, "CREATE TABLE IF NOT EXISTS groupmember (account TEXT, groupName TEXT, rank TEXT, warningLvl TEXT, joined TEXT, lastTime TEXT)")
dbExec(db, "CREATE TABLE IF NOT EXISTS groups (name TEXT, leader TEXT, message TEXT, chatcolor TEXT, notecolor TEXT, date TEXT, turfcolor TEXT, cashflow TEXT)")
dbExec(db, "CREATE TABLE IF NOT EXISTS groupRanks (groupName TEXT, name TEXT, permissions TEXT)")
 
--Some misc functions
_outputDebugString = outputDebugString
function outputDebugString(string)
    if (debugInfo) then _outputDebugString(string) end
end
 
function getTime()
    local time = getRealTime()
    local date = string.format("%02d/%02d/%02d", time.monthday, (time.month+1), (time.year-100) )
    local time = string.format("%02d:%02d", time.hour, time.minute)
    return date, time
end
 
MTAoutput = outputChatBox
function outputChatBox(message, player, r, g, b, bool)
    if (isElement(message) and getElementType(message) == "player") then
        MTAoutput(player, message, r, g, b, bool)
    else
        MTAoutput(message, player, r, g, b, bool)
    end
end
 
function groupLog(group, message)
    if (log) then
        outputServerLog("GROUP: "..group.." - "..message)
    end
   
    if (debugInfo) then
        outputDebugString("GROUP: "..group.." - "..message)
    end
end
 
--Lets start
 
local permToTable = {
    [1] = "invite",
    [2] = "promote",
    [3] = "demote",
    [4] = "kick",
    [5] = "warn",
    [6] = "delete",
    [7] = "deposit",
    [8] = "withdraw",
    [9] = "editInfo",
    [10] = "viewLog",
    [11] = "viewBlacklist",
    [12] = "addBlaclist",
    [13] = "changeTurfColor",
    [14] = "modifyAlliance",
    [15] = "modifyRanks",
    [16] = "withDrawMoney",
}
 
function account(plr)
    if (plr and isElement(plr)) then
        return getAccountName(getPlayerAccount(plr))
    end
end
 
function loadGroupRanks(query)
    local the_table = dbPoll(query, 0)
    if (the_table) then
        for ind, data in pairs(the_table) do
            if (not rankCache[data.groupName]) then rankCache[data.groupName] = {} end
            if (not rankCache[data.groupName][data.name]) then rankCache[data.groupName][data.name] = {} end
            local JSONtable = fromJSON(data.permissions)
            for ind, value in pairs(JSONtable) do
                if (value and ind) then
                    rankCache[data.groupName][data.name][ind] = true
                end
            end
        end
    end
end
dbQuery(loadGroupRanks, db, "SELECT * FROM groupRanks")
 
function loadGroupStuff(query)
    local g_table = dbPoll(query, 0)
   
    if (not g_table) then return end
   
    for ind, data in ipairs(g_table) do
        groupTable[data.name] = {data.leader, data.message, data.chatcolor, data.notecolor, data.date, data.turfcolor, data.cashflow}
    end
end
dbQuery(loadGroupStuff, db, "SELECT * FROM groups")
 
function loadClientGroup(query)
    local g_table = dbPoll(query, 0)
   
    if (not g_table) then return end
   
    for ind, data in ipairs(g_table) do
        if (getAccount(data.account)) then
            local player = getAccountPlayer(getAccount(data.account))
            users[data.groupName] = {}
            table.insert(users[data.groupName], data.account)
            if (player) then
                setElementData(player, "Group", data.groupName)
                myGang[player] = data.groupName
            end
            GAC[data.account] = {data.groupName, data.rank, data.warningLvl, data.joined, data.lastTime or 0}
        end
    end
end
dbQuery(loadClientGroup, db, "SELECT * FROM groupmember")
 
function addRank(group, rank, permissionTable)
    if (not rankCache[group]) then rankCache[group] = {} end
    --rankCache[group][rank] = {fromJSON(permissionTable)}
    dbExec(db, "INSERT INTO groupRanks VALUES (?, ?, ?)", tostring(group), tostring(rank), permissionTable)
    dbQuery(loadGroupRanks, db, "SELECT * FROM groupRanks")
end
 
function removeRank(group, rank)
    if (not rankCache[group]) then return true end
    if (rankCache[group][rank]) then
        rankCache[group][rank] = nil
        dbExec(db, "DELETE FROM groupRanks WHERE name=? AND groupName=?", tostring(rank), tostring(group))
        dbQuery(loadGroupRanks, db, "SELECT * FROM groupRanks")
        return true
    end
end
 
function isRank(group, rank)
    if (not rankCache[group]) then return false end
    return rankCache[group][rank]
end
 
function groupMemberLogin()
    if (GAC[account(source)]) then
        myGang[source] = GAC[account(source)][1]
        setElementData(source, "Group", GAC[account(source)][1])
    end
end
addEventHandler("onPlayerLogin", root, groupMemberLogin)
 
function getGroupMembers(group)
    local temp = {}
    for ind, data in pairs(users) do
        if (ind == group) then
            table.insert(temp, data[1])
        end
    end
    return temp
end
 
function getPlayerGroup(player)
    if (not GAC[account(player)]) then return false end
    return GAC[account(player)][1]
end
 
function getPlayerGroupRank(player)
    if (not GAC[account(player)]) then return false end
    return GAC[account(player)][2]
end
 
function getPlayerWarningLevel(player)
    if (not GAC[account(player)]) then return false end
    return GAC[account(player)][3]
end
 
function getGroupBankAmount(group)
    if (not groupTable[group]) then return end
    return groupTable[group][7]
end
 
function getPlayerJoinDate(player)
    if (not GAC[account(player)]) then return false end
    return GAC[account(player)][4]
end
 
function getHexCode(r, g, b)
    if (r and g and b) then
        return string.format("#%.2X%.2X%.2X", r, g, b)
    end
end
 
function getGroupChatColor(group)
    if (not groupTable[group]) then return 255, 255, 255 end
    local color = fromJSON(groupTable[group][3])
    return color[1], color[2], color[3]
end
 
function outputGroupMessage(message, group)
    for ind, data in pairs(GAC) do
        if (data[1] == group) then
            local acc = getAccount(ind)
            if (getAccountPlayer(acc)) then
                local color = fromJSON(groupTable[group][3])
                local hex = getHexCode(color[1], color[2], color[3])
                outputChatBox(hex.."("..group..") #FFFFFF"..message, getAccountPlayer(acc), 255, 255, 255, true)
                groupLog(group, message)
            end
        end
    end
end
 
function checkGroupAccess(player, actionID)
    local rank = getPlayerGroupRank(player)
    local group = getPlayerGroup(player)
    if (not rankCache[group]) then return false end
    if (rankCache[group] and rankCache[group][rank]) then
        if (tostring(actionID)) then
            for ind, data in pairs(permToTable) do
                if (data == actionID) then
                    actionID = ind
                    break
                end
            end
        end
        local actionID = tonumber(actionID)
        if (rankCache[group][rank][actionID]) then
            return true
        end
    end
end
 
function getPermissionCount(group, rank)
    if (not rankCache[group]) then return false end
    local count = 0
   
    if (rankCache[group] and rankCache[group][rank]) then
        for ind, data in pairs(rankCache[group][rank]) do
            count = count + 1
        end
    end
   
    return count
end
 
Link to comment

Quizas solo sea tema de tener mas seguridad en Servidor, quizas sea un 'exploit' en el que le muestra todos los botones, pero no veo una seguridad que impida la verificacion del permiso en servidor, es decir, si soy miembro, y le doy a kick (por alguna casualidad), no me impidiria ningun argumento kickear a alguien, yo le pondria verificaciones, pero vamos, por el resto no veo nada raro

Link to comment
¿Cómo podríamos ayudarte a resolver el retraso de tus players? xD Osea, no entiendo que podriamos hacer ._.

no no, osea ejemplo tu creas tu gang osea tu grupo no? y yo soy un usuario normal entonces mediante un bug o Algo entro a tu grupo sin tu permiso y me pongo rango fundador y te saco de tu grupo y me adueño de el, eso estan haciendo.

Link to comment
Porque no le preguntas a alguno de los jugadores que lo haya hecho?

Porque no son usuarios comunes son Brasileños, estan robando clanes ya que al meterse al clan sin permiso tienen acceso a la base o demas cosas.

Como siempre buscan alguna forma de encontrar un bug en tu server ._. , Podrias averiguar como se hiso esto, promocionando que daras VIP-Pro temporalmente a alguna persona que lo hizo, sera la unica forma de saber como lo hicieron.

Link to comment
Logre comvencerlo y me dijo como se hace y si, amm como puedo hacer para que cuando se cree el gang no se puedan usar caracteres como !,#, y eso que solo se puedan letras y numeros? tengo asi : local char = "[^0-9a-zA-Z_]"

Claro.. Tu sistema de grupos utiliza el sistema de cuentas de MTA y esos carácteres son excluídos.. desde la 1.5 las cuentas no tienen case sensitive, si tu grupo se llama 'xXElGrupoProXx' y alguien intenta usar 'xxelgrupoproxx' pasaría lo mismo...

Link to comment

Si es mediante GUI la creacion, usa ValidationString en la GUI

Como siempre buscan alguna forma de encontrar un bug en tu server ._. , Podrias averiguar como se hiso esto, promocionando que daras VIP-Pro temporalmente a alguna persona que lo hizo, sera la unica forma de saber como lo hicieron.

Los bugs surgen, y no todos tenemos "VIP-Pro", los desarrolladores mismos deberian buscar los bugs, ya que son los unicos que se saben el codigo 'a pie a pa', Cuando desarrollé mi group system recuerdo haber testado hasta uniendome de guest con el panel GUI (Aun sin logearme, osea, el panel de login de fondo), y nada, no habia ningun exploit de este tipo, el filtro que yo le habia puesto era una comparacion de grupo, es decir, si no era EXACTAMENTE igual el nombre del grupo al asignado, no tenia ningun poder sobre otra gang, por eso digo, que el error es muy raro

Link to comment
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...