2015-12-28 7 views
1

Вектор атаки: java.io.PrintWriter.writeрешить его с помощью OWASP и ESAPI

Описание: Этот вызов java.io.PrintWriter.write() содержит Межсайтовый скриптинг (XSS) изъян. Приложение заполняет HTTP-ответ с помощью вводимого пользователем ввода, позволяя злоумышленнику встраивать вредоносный контент, такой как код Javascript, который будет выполняться в контексте браузера жертвы. XSS-уязвимости обычно используются для кражи или манипулирования куки-файлами, изменения представления контента и компрометации конфиденциальной информации, а новые векторы атаки обнаруживаются на регулярной основе. Первый аргумент write() содержит испорченные данные. Испорченные данные возникли из более раннего вызова функции javax.servlet.servletrequest.getparameter. Испорченные данные направляются в выходной поток, возвращаемый org.apache.jasper.runtime.pagecontextimpl.getout.

Это в коде первого аргумента writer.write (arg1) .. Просьба помочь мне относительно этого

ответ

1

Я думаю, что это относится к тому, что вы можете использовать ввод пользователя, который не продезинфицировать.

Например, в приведенном ниже упрощенном сервлете пользователь может напечатать собственное имя, передав параметр.

http://xxx/servlet/vulnerable?someuserinput=Bob

Но предположим, что злоумышленник разослал ссылку по электронной почте с чем-то неприятным в ссылке.

http://xxx/servlet/vulnerable?someuserinput=alert («Привет! Я делаю что-то неприятное !!»);

Правило всегда дезинфицировать ваши входы

@WebServlet(name = "vulnerable", urlPatterns = {"/vulnerable"}) 
public class NewServlet extends HttpServlet { 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     String someUserInput = request.getParameter("someuserinput"); 

     try (PrintWriter out = response.getWriter()) { 

      out.write("<!DOCTYPE html>"); 
      out.write("<html>"); 
      out.write("<head>");  
      out.write("</head>"); 
      out.write("<body>"); 
      out.write("<h1>Hello " + someUserInput + "</h1>");//something bad can happen here 
      out.write("</body>"); 
      out.write("</html>"); 
     } 
    } 

Я знаю, что вы спрашиваете о ESAPI, но OWASP имеет HTML простой Sanitizer.

https://github.com/OWASP/java-html-sanitizer

ESAPI в контексте HTML (как выше)

String safer = ESAPI.encoder().encodeForHTML(request.getParameter("someuserinput")); 

ESAPI в контексте Javascript

String safer = ESAPI.encoder().encodeForJavaScript(request.getParameter("someuserinput")); 
+0

Это будет работать ... если контекст HTML. Если параметр будет использоваться инфраструктурой javascript, скажем, AngularJS или просто старый javascript, тогда вы хотите использовать 'encodeForJavaScript()' – avgvstvs

+1

И семантически ... не используйте слово «безопасно» при работе с пользовательским вводом. Вы не хотите, чтобы люди теряли бдительность с их кодом. – avgvstvs

+0

@avgvstvs, спасибо, могу я добавить это как редактирование? – rjdkolb

 Смежные вопросы

  • Нет связанных вопросов^_^