gpt4 book ai didi

java - 解耦 JSON 服务中 unicode 转义导致的安全漏洞?

转载 作者:搜寻专家 更新时间:2023-10-31 20:12:18 24 4
gpt4 key购买 nike

看看这个简单的 JSON 系统,它由一个与后端对话的面向用户的服务组成:

import java.util.*;
import com.json.parsers.*;
import org.json.simple.*;

class Main{static {
String s = new java.util.Scanner(System.in).useDelimiter("\\A").next();
UserFacingService.handleMessage(s);
}}

class UserFacingService {
static void handleMessage(String s) {
JSONParser parser = JsonParserFactory.getInstance().newJsonParser();
Map js = parser.parseJson(s);
if (commandAllowed(js))
Backend.handleMessage(s);
else
System.out.println("unauthorized!");
}
static boolean commandAllowed(Map js) {
if (js.get("cmd").equals("bad stuff"))
return false;
return true;
}
}

class Backend {
static void handleMessage(String s) {
JSONObject js = (JSONObject) JSONValue.parse(s);
String cmd = (String)js.get("cmd");
if (cmd.equals("bad stuff")) {
doBadStuff();
} else if (cmd.equals("ping")) {
doPong();
}
}
static void doBadStuff() { System.out.println("doing bad stuff"); }
static void doPong() { System.out.println("doing pong"); }
}

面向用户的服务(使用 quick-json )防止用户让后端(使用 json-simple )做坏事。为了模拟用户,我使用了 Main 中的标准输入。在实际场景中,Backend 将在另一台服务器上,或者一些旧的遗留/二进制代码,因此我们不能简单地更改它以接受 Java 对象。设计是授权与 Backend 分开进行。这可以通过制作另一个只有管理员可以访问的名为 AdminFacingService 的类来详细说明,或者将 if (userIsAdmin) return true; 放在 UserFacingService 的顶部.commandAllowed.

如您所见,它按预期工作:

$ CP=.:json-simple-1.1.1.jar:quick-json-1.0.2.3.jar
$ javac -cp $CP A.java && echo '{"cmd": "ping"}' | java -cp $CP Main
doing pong
Exception in thread "main" java.lang.NoSuchMethodError: main

发送 {"cmd": "bad stuff"} 应该会导致面向用户的服务拒绝命令:

$ CP=.:json-simple-1.1.1.jar:quick-json-1.0.2.3.jar
$ javac -cp $CP A.java && echo '{"cmd": "bad stuff"}' | java -cp $CP Main
unauthorized!
Exception in thread "main" java.lang.NoSuchMethodError: main

这也行。但是如果用户发送 {"cmd": "bad\u0020stuff"},就会发生不好的事情:

$ CP=.:json-simple-1.1.1.jar:quick-json-1.0.2.3.jar
$ javac -cp $CP A.java && echo '{"cmd": "bad\u0020stuff"}' | java -cp $CP Main
doing bad stuff
Exception in thread "main" java.lang.NoSuchMethodError: main

但是怎么办?为什么面向服务的用户没有捕捉到这个?

最佳答案

bad\u0020stuff 作为输入,第一个解析器返回一个对象 js,其中 js.get("cmd") 返回字符串 bad\u0020stuff,因此 commandAllowed 返回 true。第二个解析器返回一个对象 js,其中 js.get("cmd") 返回 bad stuff(它转换 \u0020 到一个空格)。因此执行了 bad stuff 命令。

第一个解析器不遵循 RFC4627,因为它不解释 unicode 转义。

关于java - 解耦 JSON 服务中 unicode 转义导致的安全漏洞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19687443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com