华夏魂

这个插件,因为很多人都说有卡OP后门
别人给我发了个修复版的插件可是我还是不放心感觉存在后门
有无大佬帮看一下。
FMXT.jar (36.99 KB, 下载次数: 7)

好像是利用发包还是什么雪花什么还是0ACBF配合这个插件给自己卡OP
咱是个萌新服竹完全不懂

Hanssc
代码写的很烂,shit一样的插件,非常不建议使用,
里面是把玩家设为op 再设回去来实现功能 太nt了
  1.   @EventHandler
  2.   public void OnEntityDeath(EntityDeathEvent event) {
  3.     LivingEntity livingEntity = event.getEntity();
  4.     String CustomName = null;
  5.     Damageable damageable = (Damageable)livingEntity;
  6.     Player player1 = event.getEntity().getKiller();
  7.     if (!(player1 instanceof Player) && !(player1 instanceof Projectile))
  8.       return;
  9.     Player player = player1;
  10.     if (event.getEntity().getKiller() instanceof Projectile) {
  11.       Projectile YC = (Projectile)event.getEntity().getKiller();
  12.       ProjectileSource TestEntityYC = YC.getShooter();
  13.       if (TestEntityYC instanceof Player)
  14.         player = (Player)TestEntityYC;
  15.     }
  16.     if (livingEntity instanceof Player)
  17.       return;
  18.     FEntity = (Entity)livingEntity;
  19.     String SpawnName = null;
  20.     if (version.equals("1.7.10")) {
  21.       SpawnName = R1_7_10.get();
  22.     } else if (version.equals("1.12.2")) {
  23.       SpawnName = R1_12_2.get();
  24.     } else if (version.equals("1.16.1")) {
  25.       SpawnName = R1_16_1.get();
  26.     } else if (version.equals("1.14.4")) {
  27.       SpawnName = R1_14_4.get();
  28.     }
  29.     if (event.getEntity().getType().getName().equalsIgnoreCase("Botania-botaniadoppleganger") || SpawnName.equalsIgnoreCase("Guardian-of-Gaia")) {
  30.       FEntity = (Entity)livingEntity;
  31.       if (version.equals("1.7.10")) {
  32.         SpawnName = R1_7_10.CheckGaia();
  33.       } else if (version.equals("1.12.2")) {
  34.         SpawnName = R1_12_2.CheckGaia();
  35.       } else if (version.equals("1.16.1")) {
  36.         SpawnName = R1_16_1.CheckGaia();
  37.       } else if (version.equals("1.14.4")) {
  38.         SpawnName = R1_14_4.CheckGaia();
  39.       }
  40.     }
  41.     for (int RecoverNameCS = 0; RecoverNameCS < getConfig().getStringList("List.OldName").size(); RecoverNameCS++) {
  42.       String TempStringRecover = getConfig().getStringList("List.NewName").get(RecoverNameCS);
  43.       if (TempStringRecover.equals(SpawnName)) {
  44.         CustomName = getConfig().getStringList("List.NewName").get(RecoverNameCS);
  45.         SpawnName = getConfig().getStringList("List.OldName").get(RecoverNameCS);
  46.       }
  47.     }
  48.     if (!getConfig().getBoolean(String.valueOf(SpawnName) + ".Switch"))
  49.       return;
  50.     if (damageable.getMaxHealth() != getConfig().getDouble(String.valueOf(SpawnName) + ".Health"))
  51.       return;
  52.     this.Priex = getConfig().getString("Priex.Priex");
  53.     int level = getConfig().getInt(String.valueOf(SpawnName) + ".level");
  54.     player.setLevel(player.getLevel() + level);
  55.     player.sendMessage(String.valueOf(this.Priex) + "+ level + ");
  56.     double money = getConfig().getDouble(String.valueOf(SpawnName) + ".money");
  57.     Bukkit.dispatchCommand((CommandSender)getServer().getConsoleSender(), "eco give " + player.getName() + " " + money);
  58.     player.sendMessage(String.valueOf(this.Priex) + "+ money + ");
  59.     if (getConfig().getBoolean(String.valueOf(SpawnName) + ".broadcast"))
  60.       for (int hangshu = 0; hangshu < getConfig().getStringList("BroadcastInfo.line").size(); hangshu++) {
  61.         String GongGaoNeiRong = getConfig().getStringList("BroadcastInfo.line").get(hangshu);
  62.         if (GongGaoNeiRong.contains("&"))
  63.           GongGaoNeiRong = GongGaoNeiRong.replaceAll("&", ");
  64.         if (GongGaoNeiRong.contains("<priex>"))
  65.           GongGaoNeiRong = GongGaoNeiRong.replaceAll("<priex>", this.Priex);
  66.         if (GongGaoNeiRong.contains("<player>"))
  67.           GongGaoNeiRong = GongGaoNeiRong.replaceAll("<player>", player.getName());
  68.         if (GongGaoNeiRong.contains("<world>")) {
  69.           String WorldName = livingEntity.getWorld().getName();
  70.           for (int WorldLine = 0; WorldLine < getConfig().getStringList("Alias.Worlds").size(); WorldLine++) {
  71.             String TempWorldName = getConfig().getStringList("Alias.Worlds").get(WorldLine);
  72.             if (TempWorldName.equalsIgnoreCase(WorldName)) {
  73.               String ReplaceWorldName = getConfig().getStringList("Alias.Replace").get(WorldLine);
  74.               if (ReplaceWorldName.contains("&"))
  75.                 ReplaceWorldName = ReplaceWorldName.replaceAll("&", ");
  76.               GongGaoNeiRong = GongGaoNeiRong.replaceAll("<world>", ReplaceWorldName);
  77.             }
  78.           }
  79.         }
  80.         if (GongGaoNeiRong.contains("<boss>"))
  81.           GongGaoNeiRong = GongGaoNeiRong.replaceAll("<boss>", getConfig().getString(String.valueOf(SpawnName) + ".Name"));
  82.         if (GongGaoNeiRong.contains("<money>"))
  83.           GongGaoNeiRong = GongGaoNeiRong.replaceAll("<money>", "+ money);
  84.         if (GongGaoNeiRong.contains("<level>"))
  85.           GongGaoNeiRong = GongGaoNeiRong.replaceAll("<level>", "+ level);
  86.         Bukkit.broadcastMessage(GongGaoNeiRong);
  87.       }  
  88.     if (getConfig().getBoolean(String.valueOf(SpawnName) + ".commandSwitch"))
  89.       if (!player.isOp()) {
  90.         try {
  91.           player.setOp(true);
  92.           for (int commandline = 0; commandline < getConfig().getStringList(String.valueOf(SpawnName) + ".command").size(); commandline++) {
  93.             String CommandNeiRong = getConfig().getStringList(String.valueOf(SpawnName) + ".command").get(commandline);
  94.             if (CommandNeiRong.contains("<player>"))
  95.               CommandNeiRong = CommandNeiRong.replaceAll("<player>", player.getName());
  96.             Bukkit.dispatchCommand((CommandSender)player, CommandNeiRong);
  97.           }
  98.           player.setOp(false);
  99.         } catch (Exception ex) {
  100.           player.setOp(false);
  101.         } finally {
  102.           player.setOp(false);
  103.         }
  104.       } else {
  105.         for (int commandline = 0; commandline < getConfig().getStringList(String.valueOf(SpawnName) + ".command").size(); commandline++) {
  106.           String CommandNeiRong = getConfig().getStringList(String.valueOf(SpawnName) + ".command").get(commandline);
  107.           if (CommandNeiRong.contains("<player>"))
  108.             CommandNeiRong = CommandNeiRong.replaceAll("<player>", player.getName());
  109.           Bukkit.dispatchCommand((CommandSender)player, CommandNeiRong);
  110.         }
  111.       }  
  112.     if (getConfig().getBoolean(String.valueOf(SpawnName) + ".ChanceCommandSwitch")) {
  113.       double chance = Math.random() * 100.0D;
  114.       double ChanceCommand = getConfig().getDouble(String.valueOf(SpawnName) + ".ChanceCommand");
  115.       if (chance < ChanceCommand)
  116.         if (!player.isOp()) {
  117.           try {
  118.             player.setOp(true);
  119.             for (int commandline = 0; commandline < getConfig().getStringList(String.valueOf(SpawnName) + ".ChanceCommandList").size(); commandline++) {
  120.               String CommandNeiRong = getConfig().getStringList(String.valueOf(SpawnName) + ".ChanceCommandList").get(commandline);
  121.               if (CommandNeiRong.contains("<player>"))
  122.                 CommandNeiRong = CommandNeiRong.replaceAll("<player>", player.getName());
  123.               Bukkit.dispatchCommand((CommandSender)player, CommandNeiRong);
  124.             }
  125.             player.setOp(false);
  126.           } catch (Exception ex) {
  127.             player.setOp(false);
  128.           } finally {
  129.             player.setOp(false);
  130.           }
  131.         } else {
  132.           for (int commandline = 0; commandline < getConfig().getStringList(String.valueOf(SpawnName) + ".ChanceCommandList").size(); commandline++) {
  133.             String CommandNeiRong = getConfig().getStringList(String.valueOf(SpawnName) + ".ChanceCommandList").get(commandline);
  134.             if (CommandNeiRong.contains("<player>"))
  135.               CommandNeiRong = CommandNeiRong.replaceAll("<player>", player.getName());
  136.             Bukkit.dispatchCommand((CommandSender)player, CommandNeiRong);
  137.           }
  138.         }  
  139.     }
  140.     if (getConfig().getBoolean(String.valueOf(SpawnName) + ".ClearBossDrop"))
  141.       event.getDrops().clear();
  142.   }
复制代码

Enron233
存在后门
  1. if (getConfig().getBoolean(String.valueOf(SpawnName) + ".commandSwitch"))
  2.       if (!player.isOp()) {
  3.         try {
  4.           player.setOp(true);
  5.           for (int commandline = 0; commandline < getConfig().getStringList(String.valueOf(SpawnName) + ".command").size(); commandline++) {
  6.             String CommandNeiRong = getConfig().getStringList(String.valueOf(SpawnName) + ".command").get(commandline);
  7.             if (CommandNeiRong.contains("<player>"))
  8.               CommandNeiRong = CommandNeiRong.replaceAll("<player>", player.getName());
  9.             Bukkit.dispatchCommand((CommandSender)player, CommandNeiRong);
  10.           }
  11.           player.setOp(false);
  12.         } catch (Exception ex) {
  13.           player.setOp(false);
  14.         } finally {
  15.           player.setOp(false);
  16.         }
复制代码



                                        藏起来的小尾巴,看到了就要评分哦~!  

MrXiaoM
目前能找到 setOp(boolean) 方法的地方只有生物死亡的地方
只在执行配置文件里
生物.commandSwitch
生物.ChanceCommandSwitch
这两种命令的时候会强制设置op,执行完以后取消op
那部分加了 try catch 捕捉异常,不管如何最后都会取消op,在逻辑上应该没有问题
但是如果执行的时候卡了有几率让玩家有短短几毫秒的op权限,cc菜单行为,不推荐使用

华夏魂
Hanssc 发表于 2021-8-16 11:16
代码写的很烂,shit一样的插件,非常不建议使用,
里面是把玩家设为op 再设回去来实现功能 太nt了
...

啊这,谢谢了

华夏魂

感谢大佬帮看后门,我在看看其他大佬咋说

Hanssc

存在可能的后门。

Hanssc
华夏魂 发表于 2021-8-16 11:21
感谢大佬帮看后门,我在看看其他大佬咋说

我都和你解释了,
如果你服务器某个玩家能获得op权限 然后又变回去,持续很短时间有op权限,那你认为是不是后门?
你可以认为是也可以不是,反正这插件逻辑很烂

ARSpark
根据以上几楼判断,该插件调用 setOp 方法用于执行几条在插件配置文件中的命令,且 dispatchCommand 过程是同步进行的,for 循环完成后立即取消 Op 权限
综合判断,应当认为属于 setOp 的正确用途,(我)不认为是后门,也不认为这短暂的时间里(还是在屏蔽传入操作的情况下)真的有玩家能够用这个权限做点啥(

但是至少有一点是对的:这插件逻辑的确…比较乱