Skip to content

Commit 7d9d0fb

Browse files
committed
Encode LDAP query parameter names as well
1 parent f7275f8 commit 7d9d0fb

2 files changed

Lines changed: 32 additions & 1 deletion

File tree

rt/rs/extensions/search/src/main/java/org/apache/cxf/jaxrs/ext/search/ldap/LdapQueryVisitor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ public void visit(SearchCondition<T> sc) {
6060
}
6161

6262
String ldapOperator = conditionTypeToLdapOperator(sc.getConditionType());
63+
String encodedName = Util.doRFC2254Encoding(name);
6364
String encodedRValStr = encodeQueryValues ? Util.doRFC2254Encoding(rvalStr) : rvalStr;
64-
sb.append(name).append(ldapOperator).append(encodedRValStr);
65+
sb.append(encodedName).append(ldapOperator).append(encodedRValStr);
6566

6667
sb.append(')');
6768
}

rt/rs/extensions/search/src/test/java/org/apache/cxf/jaxrs/ext/search/ldap/LdapQueryVisitorTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@
2020

2121
import java.util.Date;
2222

23+
import org.apache.cxf.jaxrs.ext.search.ConditionType;
24+
import org.apache.cxf.jaxrs.ext.search.SearchBean;
2325
import org.apache.cxf.jaxrs.ext.search.SearchCondition;
2426
import org.apache.cxf.jaxrs.ext.search.SearchParseException;
27+
import org.apache.cxf.jaxrs.ext.search.SimpleSearchCondition;
2528
import org.apache.cxf.jaxrs.ext.search.fiql.FiqlParser;
2629

2730
import org.junit.Ignore;
@@ -86,6 +89,33 @@ public void testComplexQuery() throws SearchParseException {
8689
assertEquals("(&(|(name=test)(level=18))(|(name=test1)(!level=19)))", ldap);
8790
}
8891

92+
@Test
93+
public void testLdapFilterInjectionViaUnencodedPropertyName() throws SearchParseException {
94+
SearchBean bean = new SearchBean();
95+
bean.set("cn)(|(sn", "admin");
96+
97+
SearchCondition<SearchBean> filter =
98+
new SimpleSearchCondition<>(ConditionType.EQUALS, bean);
99+
LdapQueryVisitor<SearchBean> visitor = new LdapQueryVisitor<>();
100+
filter.accept(visitor.visitor());
101+
102+
assertEquals("(cn\\29\\28|\\28sn=admin)", visitor.getQuery());
103+
}
104+
105+
@Test
106+
public void testLdapFilterInjectionViaUnencodedPropertyNameWithRawValue() throws SearchParseException {
107+
SearchBean bean = new SearchBean();
108+
bean.set("cn)(|(sn", "admin*");
109+
110+
SearchCondition<SearchBean> filter =
111+
new SimpleSearchCondition<>(ConditionType.EQUALS, bean);
112+
LdapQueryVisitor<SearchBean> visitor = new LdapQueryVisitor<>();
113+
visitor.setEncodeQueryValues(false);
114+
filter.accept(visitor.visitor());
115+
116+
assertEquals("(cn\\29\\28|\\28sn=admin*)", visitor.getQuery());
117+
}
118+
89119

90120
@Ignore
91121
public static class Condition {

0 commit comments

Comments
 (0)