XSS 취약점 대응(HTMLTagFilter사용)후 치환된 Data 조회 시 문제
- 작성자 :
- 신*안
- 작성일 :
- 2017-04-14 10:19:45
- 조회수 :
- 4,363
- 구분 :
- 개발환경
- 진행상태 :
- 완료
Q
XSS 취약점 대응(HTMLTagFilter사용)후 치환된 Data 조회 문제에 대해 문의 드립니다.
■ 현재 시스템 상황
현재 표준프레임워크에서 제공하는 HTMLTagFilter를 사용(web.xml)하여 입력 Data를 치환하는 방법으로 XSS 취약점을 대응하고 있습니다.
치환 된 data (ex. &는 → amp 변환) 그대로 DB에 저장(ex. &는 → amp 으로 저장)되고 있습니다.
이후 저장된 data가 그대로(ex. amp) 조회되어 문제가 되고 있습니다.
※ 현재 c:out은 사용않하고 있습니다
■ 문의사항
1. 치환된 data를 다시 입력한 문자로 재치환(amp는 &으로 재치환)하여 조회되게 해주고 싶습니다.
다시 입력한 문자로(amp가 &으로) 조회되는 경우 XSS방어가 되지 않은 것인지요?
테스트 해본결과 재치환하더라도 테그/스크립트가 실행되지 않았습니다.
1-1. 재치환(원래 입력한 문자로 변환)하는 펑션, 메쏘드는 표준프레임워크에서 별도로 제공하지 않는지요?
1-2. JSP화면에서 내부 unescape 펑션?을 사용하여 다시 디코드하는 방법을 고민하고 있습니다. 옳은 재치환 방법일까요?
unescape펑션 일부 발췌
unescape: {
html: function(encodedString) {
return
encodedString.replace(/amp/g, "&")
.replace(/"/g, "\"")
.replace(/'/g, "'");
......
2. "1"번 처럼 재치환을 하는 경우 결국 XSS 방어가 되지 않는다면 방어를 위해서 c:out으로 변경하는 방법이 권장하는 방법 인지요?
2-1. c:out 을 사용하게 되면 JSP화면에서만 선언하면 XSS방어가 되는지요?
2-2. c:out 의 사용 예제에 대한 소스를 받을 수 있을까요?
3. XSS방어 대응 중 c:out 사용은 데이터를 표시할때에 방어하는 것으로 알고 있습니다.
HTMLTagFilter를 사용하는 것처럼 입력Data submit 진행 시점부터 방어가 되지 않은것인지요?
입력Data submit 진행시점의 XSS방어는 불필요한 사항인지 문의드립니다.
ps.1 다른 Q/A글을 검색하여 HTMLTagFilter 를 web.xml에서 제거함으로 사용하지 않고(=치환하지 않고) c:out을 대신 사용하는
방법은 이전 질문글의 답변으로 보고 알고 있습니다. c:out을 사용하지 않고 다시 치환하는 방법으로 문의드립니다.
ps.2 c:out을 사용하는 XSS대응에서도 실제로 c:out 을 사용하여 방어하려면 escapeXml="true" 옵션을 주게 되고 < > & 등의 문자가 치환되어 gt lt amp로 보여지게 되므로 현재 상황과 같은 문제(치환된 문자가 보이는)가 발생이 예상됩니다.
■ 현재 시스템 상황
현재 표준프레임워크에서 제공하는 HTMLTagFilter를 사용(web.xml)하여 입력 Data를 치환하는 방법으로 XSS 취약점을 대응하고 있습니다.
치환 된 data (ex. &는 → amp 변환) 그대로 DB에 저장(ex. &는 → amp 으로 저장)되고 있습니다.
이후 저장된 data가 그대로(ex. amp) 조회되어 문제가 되고 있습니다.
※ 현재 c:out은 사용않하고 있습니다
■ 문의사항
1. 치환된 data를 다시 입력한 문자로 재치환(amp는 &으로 재치환)하여 조회되게 해주고 싶습니다.
다시 입력한 문자로(amp가 &으로) 조회되는 경우 XSS방어가 되지 않은 것인지요?
테스트 해본결과 재치환하더라도 테그/스크립트가 실행되지 않았습니다.
1-1. 재치환(원래 입력한 문자로 변환)하는 펑션, 메쏘드는 표준프레임워크에서 별도로 제공하지 않는지요?
1-2. JSP화면에서 내부 unescape 펑션?을 사용하여 다시 디코드하는 방법을 고민하고 있습니다. 옳은 재치환 방법일까요?
unescape펑션 일부 발췌
unescape: {
html: function(encodedString) {
return
encodedString.replace(/amp/g, "&")
.replace(/"/g, "\"")
.replace(/'/g, "'");
......
2. "1"번 처럼 재치환을 하는 경우 결국 XSS 방어가 되지 않는다면 방어를 위해서 c:out으로 변경하는 방법이 권장하는 방법 인지요?
2-1. c:out 을 사용하게 되면 JSP화면에서만 선언하면 XSS방어가 되는지요?
2-2. c:out 의 사용 예제에 대한 소스를 받을 수 있을까요?
3. XSS방어 대응 중 c:out 사용은 데이터를 표시할때에 방어하는 것으로 알고 있습니다.
HTMLTagFilter를 사용하는 것처럼 입력Data submit 진행 시점부터 방어가 되지 않은것인지요?
입력Data submit 진행시점의 XSS방어는 불필요한 사항인지 문의드립니다.
ps.1 다른 Q/A글을 검색하여 HTMLTagFilter 를 web.xml에서 제거함으로 사용하지 않고(=치환하지 않고) c:out을 대신 사용하는
방법은 이전 질문글의 답변으로 보고 알고 있습니다. c:out을 사용하지 않고 다시 치환하는 방법으로 문의드립니다.
ps.2 c:out을 사용하는 XSS대응에서도 실제로 c:out 을 사용하여 방어하려면 escapeXml="true" 옵션을 주게 되고 < > & 등의 문자가 치환되어 gt lt amp로 보여지게 되므로 현재 상황과 같은 문제(치환된 문자가 보이는)가 발생이 예상됩니다.
A
안녕하세요.
표준프레임워크 센터 입니다.
1. 다시 입력한 문자로(amp가 &으로) 조회되는 경우 XSS방어가 되지 않은 것인지요?
- 센터에서 제공하는 공통컴포넌에서는 db에 넣을때 & 형식으로 저장하고 다시 jsp 화면에 뿌릴때 c:out을 사용합니다.
- c:out 사용시 html special character로 변환됩니다.
1-1. 재치환(원래 입력한 문자로 변환)하는 펑션, 메쏘드는 표준프레임워크에서 별도로 제공하지 않는지요?
- 재치환(원래 입력한 문자로 변환)하는 가능은 따로 제공하고 있지 않습니다.
1-2. JSP화면에서 내부 unescape 펑션?을 사용하여 다시 디코드하는 방법을 고민하고 있습니다. 옳은 재치환 방법일까요?
- 해당 사항은 XSS방어 목적에 따라 틀려질꺼 같습니다. 이점 참고하여 진행하시면 될꺼 같습니다.
2. "1"번 처럼 재치환을 하는 경우 결국 XSS 방어가 되지 않는다면 방어를 위해서 c:out으로 변경하는 방법이 권장하는 방법 인지요?
- 센터에서 제공하는 공통컴포넌에서는 db에 넣을때 & 형식으로 저장하고 다시 jsp 화면에 뿌릴때 c:out을 사용합니다.
- 글쓴이 경함상 c:out, XSS 방어 function 형태로 많이 사용 합니다.
2-1. c:out 을 사용하게 되면 JSP화면에서만 선언하면 XSS방어가 되는지요?
- jsp 화면에서 html special character 문자 형태로 출력 됩니다.
2-2. c:out 의 사용 예제에 대한 소스를 받을 수 있을까요?
- 교육교재 easycompany, 공통컴포넌트에 적용 되어있습니다.
3. HTMLTagFilter를 사용하는 것처럼 입력Data submit 진행 시점부터 방어가 되지 않은것인지요?
- Data submit 진행시점의 multipart/form-data or 일반 데이터냐?에 따라 XSS방어 시점이 달라 질꺼 같습니다.
ps.1 다른 Q/A글을 검색하여 HTMLTagFilter 를 web.xml에서 제거함으로 사용하지 않고(=치환하지 않고) c:out을 대신 사용하는
방법은 이전 질문글의 답변으로 보고 알고 있습니다. c:out을 사용하지 않고 다시 치환하는 방법으로 문의드립니다.
> HTMLTagFilter사용하면 multipart/form-data 형식의 이외의 데이터를 html special character로 변환됩니다.
ps.2 c:out을 사용하는 XSS대응에서도 실제로 c:out 을 사용하여 방어하려면 escapeXml="true" 옵션을
> c:out 사용시 html special character 파싱되어 출력 하지만 브라우저에서는 해당 특수문자가 표시 됩니다.
감사합니다.
표준프레임워크 센터 입니다.
1. 다시 입력한 문자로(amp가 &으로) 조회되는 경우 XSS방어가 되지 않은 것인지요?
- 센터에서 제공하는 공통컴포넌에서는 db에 넣을때 & 형식으로 저장하고 다시 jsp 화면에 뿌릴때 c:out을 사용합니다.
- c:out 사용시 html special character로 변환됩니다.
1-1. 재치환(원래 입력한 문자로 변환)하는 펑션, 메쏘드는 표준프레임워크에서 별도로 제공하지 않는지요?
- 재치환(원래 입력한 문자로 변환)하는 가능은 따로 제공하고 있지 않습니다.
1-2. JSP화면에서 내부 unescape 펑션?을 사용하여 다시 디코드하는 방법을 고민하고 있습니다. 옳은 재치환 방법일까요?
- 해당 사항은 XSS방어 목적에 따라 틀려질꺼 같습니다. 이점 참고하여 진행하시면 될꺼 같습니다.
2. "1"번 처럼 재치환을 하는 경우 결국 XSS 방어가 되지 않는다면 방어를 위해서 c:out으로 변경하는 방법이 권장하는 방법 인지요?
- 센터에서 제공하는 공통컴포넌에서는 db에 넣을때 & 형식으로 저장하고 다시 jsp 화면에 뿌릴때 c:out을 사용합니다.
- 글쓴이 경함상 c:out, XSS 방어 function 형태로 많이 사용 합니다.
2-1. c:out 을 사용하게 되면 JSP화면에서만 선언하면 XSS방어가 되는지요?
- jsp 화면에서 html special character 문자 형태로 출력 됩니다.
2-2. c:out 의 사용 예제에 대한 소스를 받을 수 있을까요?
- 교육교재 easycompany, 공통컴포넌트에 적용 되어있습니다.
3. HTMLTagFilter를 사용하는 것처럼 입력Data submit 진행 시점부터 방어가 되지 않은것인지요?
- Data submit 진행시점의 multipart/form-data or 일반 데이터냐?에 따라 XSS방어 시점이 달라 질꺼 같습니다.
ps.1 다른 Q/A글을 검색하여 HTMLTagFilter 를 web.xml에서 제거함으로 사용하지 않고(=치환하지 않고) c:out을 대신 사용하는
방법은 이전 질문글의 답변으로 보고 알고 있습니다. c:out을 사용하지 않고 다시 치환하는 방법으로 문의드립니다.
> HTMLTagFilter사용하면 multipart/form-data 형식의 이외의 데이터를 html special character로 변환됩니다.
ps.2 c:out을 사용하는 XSS대응에서도 실제로 c:out 을 사용하여 방어하려면 escapeXml="true" 옵션을
> c:out 사용시 html special character 파싱되어 출력 하지만 브라우저에서는 해당 특수문자가 표시 됩니다.
감사합니다.