Как добавить недопустимый шаблон в Hibernate Validator? - PullRequest
0 голосов
/ 15 мая 2019

Я прочитал owasp.org статью о XSS-атаках и о том, как их предотвратить.

В Примере 2 они сказали:

Если они фильтруют по <или открыто вам, следует попробовать различные методы кодирования: </p>

<script src=http://www.example.com/malicious-code.js></script>

%3cscript src=http://www.example.com/malicious-code.js%3e%3c/script%3e

\x3cscript src=http://www.example.com/malicious-code.js\x3e\x3c/script\x3e

Я использую Bean Validation 2.0 (JSR 380) для защиты приложения и @SafeHtml аннотацию для защиты каждого поля String.

Проблема в том, что я пытаюсь протестировать различные шаблоны из примеров owasp:

User user = new User();
user.setFirstName("aaa<img src=`~`onerror=prompt(666)>a");
user.setMiddleInitial("<script>alert(document.cookie);</script>");
user.setLastName("\"><ScRiPt>alert(document.cookie)</ScRiPt>");
user.setPhone("<scr<script>ipt>alert(document.cookie)</script>");
user.setFax("<script src=\"http://attacker/xss.js\"></script>");
user.setCellular("<script type=\"text/vbscript\">alert(DOCUMENT.COOKIE)</script>");
user.setEmail("<script src=http://www.example.com/malicious-code.js></script>");
user.setAlertMethodCd("%3cscript src=http://www.example.com/malicious-code.js%3e%3c/script%3e");
user.setHrid("\\x3cscript src=http://www.example.com/malicious-code.js\\x3e\\x3c/script\\x3e");
user.setOrgUserId(">\"><script>alert(\"XSS\")</script>&");
user.setAddress1("\"><STYLE>@import\"javascript:alert('XSS')\";</STYLE>");
user.setAddress2("<IMG SRC=\"javascript:alert('XSS');\">");
user.setCity("<IMG SRC=javascript:alert('XSS')>");
user.setZipCode("<IMG SRC=JaVaScRiPt:alert('XSS')>");

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

Set<ConstraintViolation<User>> violations = validator.validate(user);

Iterator<ConstraintViolation<User>> iterator = violations.iterator();
while (iterator.hasNext()) {
        ConstraintViolation<User> cv = iterator.next();
        System.out.println(cv.getRootBeanClass().getName() + "." + cv.getPropertyPath() + " " + cv.getMessage());
}
        assertEquals(14, violations.size());

Фактический результат:

User.fax fax should be valid
User.firstName First name should be valid
User.middleInitial middleInitialshould be valid
User.cellular cellular should be valid
User.orgUserId orgUserId should be valid
User.address2 address2 should be valid
User.phone phone should be valid
User.email Email should be valid.
User.city city should be valid
User.zipCode zipCode should be valid
User.lastName lastName should be valid
User.address1 address1 should be valid

java.lang.AssertionError: 
Expected :14
Actual   :12

Как видите:

user.setAlertMethodCd("%3cscript src=http://www.example.com/malicious-code.js%3e%3c/script%3e");
user.setHrid("\\x3cscript src=http://www.example.com/malicious-code.js\\x3e\\x3c/script\\x3e");

может передать @SafeHtml аннотацию.

Есть ли у вас опыт с такими проблемами? Можно ли как-нибудь добавить новые шаблоны в черный список?

1 Ответ

1 голос
/ 16 мая 2019

@SafeHTML использует очень простую кодировку для сущностей HTML, поэтому данные проходят валидатор.

Я рекомендую использовать очень сильный кодер ( OWASP Java Encoder, например ) для борьбы с XSS.

В любом случае, лучший способ предотвратить XSS - это использовать шаблоны проверки WhiteList и использовать хорошее кодирование => https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...