'XSS'에 해당되는 글 2건

XSS In event handler

Hacking/Web 2020. 8. 6. 17:33
반응형

1. Question

이번 포스팅을 시작하기에 앞서 먼저 질문을 드리겠습니다.


아래 코드에서 TEST를 눌렀을 때와 TEST2를 눌렀을 때 결과가 어떻게 될 것이라 예상하시나요?

1
2
3
4
5
6
<html>
    <body>
        <a onclick="alert('123')">TEST</a>
        <a onclick="alert('123&apos;)+alert(&apos;Hacked')">TEST2</a>
    </body>
</html>
cs


TEST를 클릭했을 때는 당연히 123이 출력이 될 것입니다.

그렇다면 TEST2를 클릭했을 때는?

123&apos;)+alert(&apos;Hacked 이라는 문자열이 출력될 것이라 예상하시나요?


정답은 [그렇지 않다] 입니다.


TEST2를 클릭하게 되면 123이 출력되고 이후 Hacked라는 문자열이 출력됩니다. 

즉, <a onclick="alert('123&apos;)+alert(&apos;Hacked')">TEST2</a> 이라는 문장이

<a onclick="alert('123')+alert('Hacked')">TEST2</a>처럼 작동을 한다는 것이죠




2. Why?

이것은 왜 그럴까요?


대부분 XSS의 대응방안으로 싱글쿼터('), 더블쿼터(") 등을 HTML Entity로 인코딩하는 것으로 알고 계실겁니다.

사용자가 입력한 문자열이 자바스크립트 영역이나 HTML 영역에 포함이 되었다면 위와 같은 특수문자를 HTML Entity로 인코딩하여 대응이 가능합니다.


하지만, 위와 같이 사용자의 입력값이 Event Handler에 속하게 될 경우 브라우저가 이를 렌더링하여 원래 문자열로 변경하여 실행시키기 때문에 서버 측에서 사용자의 입력값을 HTML Entity로 변경하여도 실행이 되는 것입니다.




3. How?

그렇다면 위와 같이 사용자의 입력값이 이벤트 핸들러에 포함되는 경우 어떻게 대응을 해야할까요?


사용자가 입력한 값을 태그가 아닌 단순 문자열로 출력해주는 기능을 활용하면 됩니다.

JSP 언어 기준으로는 JSTL의 c:out이 있습니다.


c:out 태그의 escapeXml 옵션을 false로 지정하면 해당 스크립트가 실행이 되지만 true로 지정할 경우에는 값을 문자열 그대로 출력하기 때문에 스크립트 실행이 되지 않습니다.


◎ escapeXml=false

1
<c:out value="<script>alert(1)</script>" escapeXml="false"/>
cs


◎ escapeXml=true

1
<c:out value="<script>alert(1)</script>"/>
cs



따라서 만약 사용자로부터 입력받는 것을 단순히 ${input}이라고 지정했다면 c:out을 이용하여 아래와 같이 수정하면 됩니다.

<c:out value="${input}"/>



(참고)

https://needjarvis.tistory.com/51

https://webcoding.tistory.com/entry/JSP-JSTL-cout-%ED%83%9C%EA%B7%B8-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0



반응형
블로그 이미지

rootable

,
반응형

만약 XSS(Cross Site Scripting) 취약점이 발견되어 대응을 해야할 때 각 파라미터별로 원하는 문자를 모두 필터링 걸어준다는 것은 비효율적이라는 생각이 들었다.


그래서 XSS 방어를 위한 관련 라이브러리가 존재하지 않을까하여 찾아본 것을 공유한다.


1. StringEscapeUtils

 StringEscapeUtils 클래스는 Apache에서 공식으로 제공해주는 class이다. 해당 클래스에 대한 설명은 다음과 같이 나와있다.

Escape and unescape Strings for Java, Java Script, HTML and XML

 

설명에서 보는 것처럼 해당 클래스는 HTML 뿐만 아니라 Java, Java Script, XML에 대한 escape와 unescape도 제공을 해주고 있다.

하지만 이번 포스팅의 주제가 XSS인 만큼 HTML에 대한 기능에 대해서만 살펴보도록 하겠다.


 ◎ escapeHtml3(String input) : HTML entites를 사용하여 String 안의 문자들을 escape한다. HTML version 3.0을 escape하는 translator object이다.


 ◎ escapeHtml4(String input) : HTML entites를 사용하여 String 안의 문자들을 escape한다. HTML version 4.0을 escape하는 translator object이다.


 ◎ unescapeHtml3(String input) : entity escapes를 포함하는 문자열을 실제 유니코드 문자들로 entity escapes를 포함하는 문자열을 실제 유니코드 문자가 포함된 문자열로 unescape한다. HTML version 3.0을 unescape하는 translator object이다.


 ◎ unescapeHtml4(String input) : entity escapes를 포함하는 문자열을 실제 유니코드 문자들로 entity escapes를 포함하는 문자열을 실제 유니코드 문자가 포함된 문자열로 unescape한다. HTML version 4.0을 unescape하는 translator object이다.



간단하게 위의 class를 이용한 코드는 다음과 같다. 


import org.apache.common.lang3.StringEscapeUtils;

...

String text = request.getParameter("text");

text = StringEscapeUtils.escapeHtml4(text);

...


참고 : http://commons.apache.org/proper/commons-lang//apidocs/org/apache/commons/lang3/StringEscapeUtils.html





2. Lucy-XSS

Lucy-XSS는 naver에서 open source 형태로 제공해주는 XSS 관련 라이브러리이다.

해당 라이브러리에 대한 설명을 보면 이 library 또한 위에서 말한 StringEscapeUtils를 사용했음을 알 수 있다.


Lucy-XSS에는 XssFilter, XssPreventer 두가지가 제공되는데 각각은 다음과 같을 때 사용하라고 명시되어 있다.


XssPreventer : HTML 이외의 간단한 text 파라미터일 때에는 XssPreventer를 사용

XssFilter : 메일, 게시판 등 입력값으로 HTML 태그를 받을 경우에는 XssFilter를 사용


아래는 각각에 대한 간단한 코드이다.


XssPreventer

@Test

public void testXssPreventer() {

String dirty = "\"><script>alert('xss');</script>";

String clean = XssPreventer.escape(dirty);


assertEquals(clean, "&quot;&gt;&lt;script&gt;alert(&#39xss&#39);&lt;/script&gt;");

assertEquals(dirty, XssPreventer.unescape(clean));

}


◎ XssFilter

@Test

public void testSuperSetFix() {

XssSaxFilter filter = XssSaxFilter.getInstance("lucy-xss-superset-sax.xml");

String expected = "<TABLE class=\"Naver_Layout_Main\" style=\"TABLE-LAYOUT: fixed\" cellSpacing=\"0\" cellPadding=\"0\" width=\"743\">" + "</TABLE>" + "<SPAN style=\"COLOR: #66cc99\"></SPAN>";

String actual = filter.doFilter(clean);

assertEquals(expected, actual);

}


참고 : https://github.com/naver/lucy-xss-filter

반응형

'Develope > JSP' 카테고리의 다른 글

[JSP 보안] Secure Coding  (0) 2018.05.01
[JSP] kali linux에 JSP 개발환경 세팅  (0) 2018.03.31
블로그 이미지

rootable

,