본문 바로가기

SW Dev Portfolio

XSS 해킹을 막기 위한 나의 노력 및 해결 방법

반응형

https://junhyunny.github.io/information/security/spring-mvc/stored-cross-site-scripting/

 

저장형 XSS(Stored Cross Site Scripting) 공격과 방어

<br /><br />

junhyunny.github.io

http://blog.plura.io/?p=7614 

 

XSS 대응방안

개요 XSS 공격은 웹 응용프로그램에 존재하는 취약점을 기반으로 웹 서버와 클라이언트 간 통신 방식인 HTTP 프로토콜 동작과정 중에 발생합니다. XSS 공격은 웹사이트 관리자가 아닌 이가 웹페이

blog.plura.io

[ 문제점 ]

게시글 작성 기능 이용 시 전달되는 파라미터 내 스크립트를 삽입할 경우 이용자 입력 값에 대한 서버 측 필터링 미흡으로 Stored XSS 공격이 가능함. 

[ 방안 ]

1. 게시글 등록 기능 이용 시 전달되는 파라미터에 대한 검증이 미흡하여 일부 스크립트의 삽입이 가능하였으므로 해당 파라미터에 대한 입력 값 검증이 강화되어야 함.

2. 게시글 요청 및 등록 시 가급적 HTML이나 자바 스크립트 작성에 사용되는 키워드 및 특수문자 사용을 제한할 것을 권고함.

우선 

기존에 적용된 lucy 를 점검해줌 

https://hailey0.tistory.com/39

 

lucy-xss-servlet-filter 로 크로스사이트 스크립팅 공격 예방하기

네이버에서 이전에 개발되었던 lucy-xss-filter 라는 라이브러리로 기본적인 크로스사이트 스크립팅 방지 문자들을 치환하기는 유용했으나 일일히 치환로직을 추가해야했기 때문에 조치가 누락되

hailey0.tistory.com

lucy-xss-default-sax.xml

<?xml version="1.0" encoding="UTF-8"?>

<config xmlns="http://www.nhncorp.com/lucy-xss"
	extends="lucy-xss-default-sax.xml">

	<elementRule>
        <element name="p"/>
        <element name="a" />
        <element name="abbr"/>
        <element name="acronym"/>
        <element name="adress"/>
        <element name="applet"/>
        <element name="area"/>
        <element name="b"/>
        <element name="base"/>
        <element name="basefont"/>
        <element name="bdo"/>
        <element name="big"/>
        <element name="blockquote"/>
        <element name="body"/>
        <element name="br"/>
        <element name="button"/>
        <element name="caption"/>
        <element name="center"/>
        <element name="cite"/>
        <element name="code"/>
        <element name="col"/>
        <element name="colgroup"/>
        <element name="dd"/>
        <element name="del"/>
        <element name="dfn"/>
        <element name="dir"/>
        <element name="div"/>
        <element name="dl"/>
        <element name="dt"/>
        <element name="em"/>
        <element name="embed"/>
        <element name="fieldset"/>
        <element name="font"/>
        <element name="form"/>
        <element name="frame"/>
        <element name="frameset"/>
        <element name="h1"/>
        <element name="h2"/>
        <element name="h3"/>
        <element name="h4"/>
        <element name="h5"/>
        <element name="h6"/>
        <element name="head"/>
        <element name="hr"/>
        <element name="html"/>
        <element name="i"/>
        <element name="iframe"/>
        <element name="img"/>
        <element name="input"/>
        <element name="ins"/>
        <element name="isindex"/>
        <element name="kbd"/>
        <element name="label"/>
        <element name="legend"/>
        <element name="li"/>
        <element name="link"/>
        <element name="map"/>
        <element name="marquee"/>
        <element name="menu"/>
        <element name="meta"/>
        <element name="nobr"/>
        <element name="noframes"/>
        <element name="noscript"/>
        <element name="object"/>
        <element name="ol"/>
        <element name="optgroup"/>
        <element name="option"/>
        <element name="p"/>
        <element name="param"/>
        <element name="pre"/>
        <element name="q"/>
        <element name="rt"/>
        <element name="ruby"/>
        <element name="s"/>
        <element name="samp"/>
        <!-- <element name="script"/> -->
        <element name="select"/>
        <element name="small"/>
        <element name="span"/>
        <element name="strike"/>
        <element name="strong"/>
        <element name="style"/>
        <element name="sub"/>
        <element name="sup"/>
        <element name="table"/>
        <element name="tbody"/>
        <element name="td"/>
        <element name="textarea"/>
        <element name="tfoot"/>
        <element name="th"/>
        <element name="thead"/>
        <element name="title"/>
        <element name="tr"/>
        <element name="tt"/>
        <element name="u"/>
        <element name="ul"/>
        <element name="var"/>
        <element name="wbr"/>
        <element name="xml"/>
        <element name="xmp"/>
        
        <!-- HTML5 added at 2012.04.10 Start-->
        <element name="article"/>
        <element name="aside"/>
        <element name="audio"/>
        <element name="bdi"/>
        <element name="canvas"/>
        <element name="command"/>
        <element name="datalist"/>
        <element name="details"/>
        <element name="figcaption"/>
        <element name="figure"/>
        <element name="footer"/>
        <element name="header"/>
        <element name="hgroup"/>
        <element name="keygen"/>
        <element name="mark"/>
        <element name="meter"/>
        <element name="nav"/>
        <element name="output"/>
        <element name="progress"/>
        <element name="rp"/>
        <element name="section"/>
        <element name="source"/>
        <element name="summary"/>
        <element name="time"/>
        <element name="track"/>
        <element name="video"/>
        <!-- HTML5 added at 2012.04.10 End-->
        
        <!-- IE핵 처리를 위해 추가-->
        <element name="IEHackExtension" disable="ture" >
        </element>
    </elementRule>
 
    <attributeRule>
        <attribute name="src">
            <allowedPattern><![CDATA[['"]?\s*http://.*]]></allowedPattern>
        </attribute>
        <attribute name="href">
            <notAllowedPattern><![CDATA[(?i:script)]]></notAllowedPattern>
            <notAllowedPattern><![CDATA[(?i:\.css)]]></notAllowedPattern>
        </attribute>
        <attribute name="style" disable="false" exceptionTagList="a"/> <!-- 2013.12.24 수정 : A 태그는 style 속성에 의한 우회 공격 이슈로 style 속성을 배제힌다. -->
    </attributeRule>


</config>

해당 코드를 통해서 부족한 부분 보충하였으나 적용 안됨.... 

pom.xml

pom.xml
		
		<dependency>
			<groupId>com.navercorp.lucy</groupId>
			<artifactId>lucy-xss</artifactId>
			<version>1.6.3</version>
		</dependency>
		
		<dependency>
		    <groupId>com.navercorp.lucy</groupId>
		    <artifactId>lucy-xss-servlet</artifactId>
		    <version>2.0.0</version>
		</dependency>

controller 

게시글 view api에 

import com.nhncorp.lucy.security.xss.LucyXssFilter;
import com.nhncorp.lucy.security.xss.XssFilter;

적용해줌 

LucyXssFilter filter = XssFilter.getInstance();
String clean = filter.doFilter(result.get("content").toString());

result.replace("content", clean);

controller 들어온 content 값을 filter를 통해 문제가 될만한 코드를 정리해주고 

깨끗해진 코드를 대체하여 view에 전송 

 
반응형