One has to wonder what is EMC thinking when they take some decisions: In Webtop 6.8 EMC introduced a “new” library in order to improve protection against XSS vulnerabilities. They decided to use OWASP’s ESAPI library, a project that hasn’t been updated in over 2 years (check ESAPI/esapi-java-legacy · GitHub and ESAPI/esapi-java · GitHub) and doesn’t show any sign of being currently developed (quite the contrary: Off-the-Wall Security)
Anyway, with the introduction of this library they have broken the virtuallinks component, at least for everyone that uses non ASCII characters. To sum up what has been discussed in Webtop 6.8 Download Servlet Escaped Umlaut Problem:
In a “standard” environment:
- Tomcat running with -Dfile.encoding=UTF-8
- Default ESAPI.properties
- Webtop version: 6.8 SP6
Any “weird” character (in spanish: áéíóúñ) will break the virtuallinks functionality in two cases:
1. The user is logged in webtop:
VirtualLink404Handler.getServletErrorRequestUri method has an url conversion
virtualLinkPath = URLDecoder.decode(virtualLinkPath, "UTF-8");
that has the following behaviour (in Chrome and Firefox, IE seems to work just fine):
BEFORE URLDecoder: /folder%20name/%C3%A1%C3%A9%C3%AD%C3%B3%C3%BA
AFTER URLDecoder: /folder name/áéíóú
BEFORE URLDecoder: /folder%20name/%C3%A1%C3%A9%C3%AD%C3%B3%C3%BA
AFTER URLDecoder: /folder name/áéíóú
BEFORE URLDecoder: /folder%20name/%E1%E9%ED%F3%FA
AFTER URLDecoder: /folder name/?????
that “????” string will return “?????” or a sequence of square icons or simply a blank depending of the character encoding. In order to fix it, you need to rewrite the class changing that method to something like:
String vLink=URLDecoder.decode(virtualLinkPath, "UTF-8");
if (vLink.indexOf("?")!=-1){//broken UTF-8 encoding
virtualLinkPath = URLDecoder.decode(virtualLinkPath, "ISO-8859-1");
}else{
virtualLinkPath = URLDecoder.decode(virtualLinkPath, "UTF-8");
}
This will make virtuallinks that have special characters to be correctly opened from any browser.
2. The user hasn’t logged in webtop:
Virtuallink component will redirect to the login component (check url-addressable-components & virtuallinkconnect first) and then you’ll get a popup saying
“There’s been an error. Contact with your administrator”
without any additional info or stacktrace in the logs.
What is happening is that ESAPI is forbidding the redirection to the login compoenent due to the presence of “unsafe” characters as you can see in a the following phantom exception:
HTTP header value: Header Manipulation: FormProcessor: Invalid input. Please conform to regex ^[a-zA-Z0-9()\-=\*\.\?;,+\/:&_ ]*$ with a maximum length of 1024
Obviously, your next step would be adding the special characters to the Validator.HTTPHeaderValue regular expression in ESAPI.properties:
Validator.HTTPHeaderValue=^[%a-zA-Z0-9áéíóúÁÉÍÓÚñÑ()\\-=\\*\\.\\?;,+\\/:&_ ]*$
Restart the server, retry the virtuallink url and:
HTTP header value: Header Manipulation: FormProcessor: Invalid input. Please conform to regex ^[%a-zA-Z0-9áéÃóúÃÉÃÓÚñÑ()\-=\*\.\?;,+\/:&_ ]*$ with a maximum length of 1024
WTF!!?? ESAPI reads the properties file as a stream and doesn’t care about the encoding
You can fix this by overwriting WDKESAPIValidator.getValidHeader (check ) or you can do it in a nicer way (considering it is unlikely that the ESAPI jar will be ever updated):
1. Download ESAPI 2.1.0 source
2. Modify org\owasp\esapi\reference\DefaultSecurityConfiguration.java:
protected String getESAPIProperty( String key, String def ) {
String value = properties.getProperty(key);
with
String value=null;
try {
value = new String(((String)properties.get(key)).getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
And
protected boolean getESAPIProperty( String key, boolean def ) {
String property = properties.getProperty(key);
with
String property=null;
try {
property = new String(((String)properties.get(key)).getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
3. Replace the class in webtop/WEB-INF/lib/esapi-2.1.0.jar
And now your special characters in ESAPI.properties will be read correctly and you can use again the virtuallink component.
