This is an automated email from the ASF dual-hosted git repository.

jleroux pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 357da7f17e Improved: Check parameters passed in URLs (OFBIZ-13295)
357da7f17e is described below

commit 357da7f17e3dd63d58177b514769d21aa56d036d
Author: Jacques Le Roux <[email protected]>
AuthorDate: Fri Oct 10 20:35:44 2025 +0200

    Improved: Check parameters passed in URLs (OFBIZ-13295)
    
    Thanks to Nicolas, improves previous commits that did not handle multipart
    element
    
    Also while at it, adds a space after "process" in deniedWebShellTokens of
    security.properties. I stumbled upon it after trying to upload a file 
created
    by a Canon camera. Anyway the deniedWebShellTokens comment suggest that when
    it's necessary.
---
 .../java/org/apache/ofbiz/base/util/UtilHttp.java  |  9 ++++---
 .../org/apache/ofbiz/common/UrlServletHelper.java  | 19 ++++++++-------
 framework/security/config/security.properties      |  2 +-
 .../apache/ofbiz/webapp/control/ControlFilter.java | 28 +++++++++++-----------
 4 files changed, 30 insertions(+), 28 deletions(-)

diff --git 
a/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilHttp.java 
b/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilHttp.java
index 04465aaf9b..83bbe85d5e 100644
--- a/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilHttp.java
+++ b/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilHttp.java
@@ -65,16 +65,12 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.net.ssl.SSLContext;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.servlet.http.HttpSession;
 
 import org.apache.commons.fileupload2.core.DiskFileItem;
 import org.apache.commons.fileupload2.core.DiskFileItemFactory;
 import org.apache.commons.fileupload2.core.FileItem;
 import org.apache.commons.fileupload2.core.FileUploadException;
 import org.apache.commons.fileupload2.jakarta.JakartaServletFileUpload;
-
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.http.NameValuePair;
 import org.apache.http.client.utils.URLEncodedUtils;
@@ -94,6 +90,10 @@ import org.apache.ofbiz.widget.renderer.VisualTheme;
 import com.google.re2j.Matcher;
 import com.google.re2j.Pattern;
 
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpSession;
+
 /**
  * HttpUtil - Misc HTTP Utility Functions
  */
@@ -230,7 +230,6 @@ public final class UtilHttp {
         if (isMultiPart) {
             // create the progress listener and add it to the session
             String encoding = request.getCharacterEncoding();
-            Charset charset = Charset.forName(encoding);
             JakartaServletFileUpload<DiskFileItem, DiskFileItemFactory> upload 
= UtilHttp.getServletFileUpload(request);
             FileUploadProgressListener listener = new 
FileUploadProgressListener();
             upload.setProgressListener(listener);
diff --git 
a/framework/common/src/main/java/org/apache/ofbiz/common/UrlServletHelper.java 
b/framework/common/src/main/java/org/apache/ofbiz/common/UrlServletHelper.java
index b4b9c2c674..8857cb547a 100644
--- 
a/framework/common/src/main/java/org/apache/ofbiz/common/UrlServletHelper.java
+++ 
b/framework/common/src/main/java/org/apache/ofbiz/common/UrlServletHelper.java
@@ -21,14 +21,6 @@ package org.apache.ofbiz.common;
 import java.io.IOException;
 import java.util.List;
 
-import jakarta.servlet.RequestDispatcher;
-import jakarta.servlet.ServletContext;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.ServletRequest;
-import jakarta.servlet.ServletResponse;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-
 import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.StringUtil;
 import org.apache.ofbiz.base.util.UtilValidate;
@@ -41,6 +33,14 @@ import org.apache.ofbiz.entity.util.EntityUtil;
 import org.apache.ofbiz.webapp.WebAppUtil;
 import org.apache.ofbiz.webapp.website.WebSiteWorker;
 
+import jakarta.servlet.RequestDispatcher;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
 public final class UrlServletHelper {
 
     private static final String MODULE = UrlServletHelper.class.getName();
@@ -50,6 +50,9 @@ public final class UrlServletHelper {
     public static void setRequestAttributes(ServletRequest request, Delegator 
delegator, ServletContext servletContext) {
         HttpServletRequest httpRequest = (HttpServletRequest) request;
         // check if multi tenant is enabled
+        if (delegator == null) {
+            delegator = WebAppUtil.getDelegator(servletContext);
+        }
         boolean useMultitenant = EntityUtil.isMultiTenantEnabled();
         if (useMultitenant) {
             // get tenant delegator by domain name
diff --git a/framework/security/config/security.properties 
b/framework/security/config/security.properties
index b5653c6518..a67d10be92 100644
--- a/framework/security/config/security.properties
+++ b/framework/security/config/security.properties
@@ -283,7 +283,7 @@ csvformat=CSVFormat.DEFAULT
 deniedWebShellTokens=java.,beans,freemarker,<script,javascript,<body,body 
,<form,<jsp:,<c:out,taglib,<prefix,<%@ page,<?php,exec(,alert(,\
                     
%eval,@eval,eval(,runtime,import,passthru,shell_exec,assert,str_rot13,system,decode,include,page
 ,\
                     chmod,mkdir,fopen,fclose,new 
file,upload,getfilename,download,getoutputstring,readfile,iframe,object,embed,onload,build,\
-                    python,perl ,/perl,ruby 
,/ruby,process,function,class,InputStream,to_server,wget 
,static,assign,webappPath,\
+                    python,perl ,/perl,ruby ,/ruby,process 
,function,class,InputStream,to_server,wget ,static,assign,webappPath,\
                     ifconfig,route,crontab,netstat,uname 
,hostname,iptables,whoami,"cmd",*cmd|,+cmd|,=cmd|,localhost,thread,require(,gzdeflate,\
                     execute,println,calc,touch,curl,base64, tcp ,4444,base32, 
tr , xxd ,bash, od ,|od ,printf,echo
 
diff --git 
a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
 
b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
index 4002d823fc..da80c8b9c5 100644
--- 
a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
+++ 
b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java
@@ -24,8 +24,8 @@ import java.net.URISyntaxException;
 import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -37,9 +37,11 @@ import org.apache.commons.validator.routines.UrlValidator;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.StringUtil;
+import org.apache.ofbiz.base.util.UtilGenerics;
 import org.apache.ofbiz.base.util.UtilHttp;
 import org.apache.ofbiz.base.util.UtilProperties;
 import org.apache.ofbiz.base.util.UtilValidate;
+import org.apache.ofbiz.common.UrlServletHelper;
 import org.apache.ofbiz.entity.GenericValue;
 import org.apache.ofbiz.security.SecuredFreemarker;
 import org.apache.ofbiz.security.SecuredUpload;
@@ -164,24 +166,24 @@ public class ControlFilter extends HttpFilter {
         HttpSession session = req.getSession();
 
         // Prevents stream exploitation
+        UrlServletHelper.setRequestAttributes(req, null, 
req.getServletContext());
         Map<String, Object> parameters = UtilHttp.getParameterMap(req);
         boolean reject = false;
         if (!parameters.isEmpty()) {
             for (String key : parameters.keySet()) {
                 Object object = parameters.get(key);
-                if (object.getClass().equals(String.class)) {
-                    String val = (String) object;
-                    if (val.contains("<")) {
+                if (object.getClass().equals(String.class)
+                        || object instanceof Collection) {
+                    try {
+                        List<String> toCheck = 
object.getClass().equals(String.class)
+                                ? List.of((String) object)
+                                : UtilGenerics.checkCollection(object, 
String.class);
+                        reject = toCheck.stream()
+                                .anyMatch(val -> val.contains("<"));
+                    } catch (IllegalArgumentException e) {
+                        Debug.logWarning(e, MODULE);
                         reject = true;
                     }
-                } else {
-                    @SuppressWarnings("unchecked")
-                    LinkedList<String> vals = (LinkedList<String>) 
parameters.get(key);
-                    for (String aVal : vals) {
-                        if (aVal.contains("<")) {
-                            reject = true;
-                        }
-                    }
                 }
             }
             if (reject) {
@@ -190,8 +192,6 @@ public class ControlFilter extends HttpFilter {
             }
         }
 
-
-
         // Check if we are told to redirect everything.
         if (redirectAll) {
             // little trick here so we don't loop on ourselves

Reply via email to