본문 바로가기
IT/보안설정

크로스사이트 스크립팅(XXS)

by psluckyguy 2022. 2. 26.
반응형

크로스사이트 스크립팅:
악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법
공격 방식은 크게 stored 공격 방식과 reflected 공격 방식으로 나누어 짐
사이트간 스크립팅


XXS
를 유발할 수 있는 스크립트
<script> … </script>
<img src=“javascript:…..”>
<div style=“background-image:url(javascript…)”></div>
<embed>…</embed>
<iframe></iframe>
※ Filtering
을 우회하기 위해 다양한 표현 가능
%3Cscript%3E........%3Cscript%3E ◆ Jav&#97;script;
◆ Java&#13;script ◆ Java&#0013;script



Step 1) 사용자 입력 값을 전달받는 애플리케이션(회원정보 변경, 게시판, 댓글, 자료실 등)
스크립트 입력 후 실행되는지 확인

Step 2) 사용자 입력 값을 전달받는 애플리케이션(검색, URL)에 스크립트 입력 후 실행되는지
확인


웹 사이트에 사용자 입력 값이 저장되는 페이지는
공격자가 웹 브라우저를 통해 실행되는 스크립트 언어
(HTML, Javascript, VBScript )를 사용하여 공격



###공격 예제###

게시판에 아래와 같이 저장
<script>alert('
관리자XSS공격!!');</script>

그리고 게시물을 읽었을때 팝업으로 해당 내용이 나오면 취약

 

 

++++++JSP예제++++++++++

<%@page import="java.util.*"%>

<% String user_id = XSSFilter(request.getParameter("user_id"));

String passwd = XSSFilter(request.getParameter("passwd"));

 %>

<%!

/* * JSP에서 작성한 자바 메소드 */

/* XSS 필터 */

public String XSSFilter(String str){

// javascript 문자열 제거

if(str.toLowerCase().indexOf("javascript") > -1){

/* 대소문자 구분 없애는 정규식 문자열 시작 위치에 (?i) 삽입 */

str = str.replaceAll("(?i)javascript", "");

 }

// script 문자열 제거

 if(str.toLowerCase().indexOf("script") > -1){

 str = str.replaceAll("(?i)script", "");

 }

return str;

}

/* html 태그 전체 제거 */

public String stripTagAll(String str){

 str = str.replaceAll("<","&lt;");

str = str.replaceAll(">","&gt;"); return str;

 }

/* html 태그 전체 제거 후 일부 허용할 태그 목록*/

 public String allowTag(String str){

/* sample */

str = str.replaceAll("&lt;p&gt;", "<p>");

 return str;

 }

 %>

샘플 코드에서는 javascript, script 문자열만 replace 했지만 필요에 따라

iframe, frame, embed, object, layer, onload, onclick, vbscript, applet 등을 코드에 추가

출처: https://taking.co.kr/100?category=382032 [TAKING]

 

 

 


##ASP#######
<%
중략
If use_HTML Then
 content = Server.HTMLEncode(content)
중략
Sub ReplaceStr(content, byref str) content = replace(content, "'", " \'")
 content = replace(content, "&", "&amp;")
 content = replace(content, " \'", "&quot")
 content = replace(content, "<", "&lt")
 content = replace(
End Sub
 
중략
%>

####PHP####
중략
 if($use_html == 1) // HTML tag
를 사용해야 하는 경우 부분 허용
 
$memo = str_replace("<", "&lt", $memo);// HTML TAG 모두 제거
 
$tag = explode(",", $use_tag);
 for($i=0; $i<count($tag); $i++) { //
허용할 TAG만 사용할 수 있도록 변경
 
$memo = eregi_replace("&lt".$tag[$i]." ", "<".$tag[$i]." ", $memo);
 $memo = eregi_replace("&lt".$tag[$i].">", "<".$tag[$i].">", $memo);
 $memo = eregi_replace("&lt/".$tag[$i], "</".$tag[$i], $memo); }
 else // HTML tag
를 사용하지 못하게 할 경우 $memo = str_replace("<", "&lt", $memo);
 $memo = str_replace(">", "&g

===JSP=======
<%
중략
string subject = request.getParameter("subject_BOX");
 subject = subject.replaceAll(“<”, “&lt”);
 subject = subject.replaceAll(“>”, “&gt”);
 
중략
%>

=============

 

##참고 필터링 대상 ###
<> &lt; &gt; innerHTML
javascript eval onmousewheel onactive onfocusout
expression charset ondataavailable oncut onkeyup
applet document onafteripudate onclick onkeypress
meta string onmousedown onchange onload
xml create onbeforeactivate onbeforecut onbounce
blink append onbeforecopy ondbclick onmouseenter
link binding onbeforedeactivate ondeactivate onmouseout
style alert ondatasetchaged ondrag onmouseover
script msgbox cnbeforeprint ondragend onsubmit
embed refresh cnbeforepaste ondragenter onmouseend
object void onbeforeeditfocus ondragleave onresizestart
iframe cookie onbeforeuload ondragover onuload
frame href onbeforeupdate ondragstart onselectstart
frameset onpaste onpropertychange ondrop onreset
ilayer onresize ondatasetcomplete onerror onmove

 

 

 

 

 

'IT > 보안설정' 카테고리의 다른 글

NTP Amplification DDoS 공격 (monlist 취약점)  (0) 2022.05.18