在 BufferedReader readLine() 方法上反射 XSS

问题描述

我用 Checkmarx 工具扫描了一个 java web 项目,分析在执行 web 服务响应 JSON 的方法标记一个 XSS 漏洞,该漏洞在 while((output = Encode.forJava(br.readLine())) != null) { 行中,特别是在br.readLine()

Checkmarx 说:

攻击者可以简单地改变返回的网页 在用户输入 readLine 中提供修改后的数据,由 NetClientPost 方法。此输入然后流经代码 直接到输出网页,无需消毒。 这可以启用反射跨站点脚本 (XSS) 攻击。

我尝试使用 Owasp for Java,实现方法 Encode.forJava(),但漏洞继续出现在分析中。这是该方法的实现:

public String NetClientPost (String urlSer,String param){
        String result ="";
        try {
            InetAddress ip = InetAddress.getLocalHost();
            String host = ip.getHostAddress();
            doTrustToCertificates();
            URL url = new URL(urlSer);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type","application/json");
            conn.setConnectTimeout(2000);
            String input = param;
            String output = "";

            try(OutputStream os = conn.getoutputStream()) {
                os.write(input.getBytes());
                os.flush();
                if (conn.getResponseCode() != 200) {
                    throw new RuntimeException("Failed : HTTP  code : " + conn.getResponseCode());
                }
                
                try (BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())))) {
                    while ((output = Encode.forJava(br.readLine())) != null) {//LINE OF CHECKMARX XSS
                        result += output;
                    }
                }
            }
            
            conn.disconnect();
            return result;

        } catch (MalformedURLException e) {
            return result;
        } catch (IOException e) {
            return result;
        } catch (Exception e) {
            return result;
        }
    }

有人知道如何解决这个问题吗?

解决方法

尝试将传入的数据解析为 JSON,然后在发送之前将其序列化回字符串。

这样您就可以确保您的方法只向客户端返回 JSON。如果由于某种原因,您的传入数据不是 JSON,那么您的方法在解析 JSON 时会遇到错误,然后您可以适当地处理该错误。

Encode.forJava 在这里不是一个有用的方法:它用于对要插入到 Java 字符串文字中的字符串进行编码。