728x90

Cross-Site Scripting (XSS)

설명

공격자가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점이다.

사용자가 입력한 정보를 출력할 때 스크립트가 실행되도록 하는 공격기법이다.

다른 사이트로 어떤 정보를 전송하는 행위가 주로 일어나기 때문에 사이트간 스크립팅이라는 이름을 가지고 있다.

 발생원인

웹 페이지에서 사용자로부터 입력받은 값을 제대로 검사하지 않고 사용할 경우 발생한다.

 위험성

ㅇ사용자의 쿠키 정보 노출로 세션 하이재킹과 같은 공격이 실행될 수 있다.

ㅇ사용자를 피싱 사이트로 접속하게 만들어 사용자의 중요 정보를 탈취할 수 있다.

ㅇ클라이언트(브라우저)에서 악성코드가 실행되어 사용자 PC를 좀비화할 수 있다.

 대응

입력값에 대해 정규식을 이용하여 정확하게 허용되는 패턴의 데이터만 입력되도록 한다.
ㅇ서버로 들어오는 모든 요청에 대해 XSS 필터를 적용하여 안전한 값만 전달되어 사용되도록 한다.
ㅇ출력값에 대해 HTML 인코딩을 적용하여 스크립트가 동작되지 않도록 한다.


공격자가 의도적으로 브라우저에서 실행될 수 있는 악성 스크립트를 웹 서버에 입력 또는 이것을 출력 시 위험한 문자를 중성화시키지 않고 처리하는 애플리케이션의 개발 과정에서 발생한다.
XSS는 일반적으로 자바스크립트에서 발생하지만, VB 스크립트, ActiveX 등 클라이언트에서 실행되는 동적 데이터를 생성하는 모든 언어에서 발생이 가능하다.

가장 일반적인 방법은 게시판 같은 곳에 HTML 문서에 <script>를 이용하여 이 스크립트 태그 안에 악성 스크립트를 저장하는 방식이다.
즉 텍스트만 표시되도록 설계된 어떤 게시판에 <script> “악성 스크립트” </script>과 같은 태그를 포함한다.

웹해킹의 기본은 웹페이지 소스보기부터 출발한다.
애초에 설계때부터 추후에 등장할 지 모를 버그 등 위험성을 모두 고려하여 설계하는것이 시큐어코딩이다.
XSS 취약점을 근본적으로 제거하기 위해서는 스크립트 등 해킹에 사용될 수 있는 코딩에 사용되는 입력 및 출력 값에 대해서 검증하고 무효화시켜야 한다.
입력 값에 대한 유효성 검사는 데이터가 입력되기 전에 가능하면, 입력 데이터에 대한 길이, 문자, 형식 및 사업적 규칙 유효성을 검사해야 한다.
출력 값을 무효화하기 위해서는 XSS 공격은 기본적으로 <script> 태그를 사용하기 때문에 XSS 공격을 차단하기 위해 태그 문자(<, >) 등 위험한 문자 입력 시 문자 참조(HTML entity)로 필터링하고, 서버에서 브라우저로 전송 시 문자를 인코딩하는 것이다.
예를 들어, 문자 “<”는 동일한 의미의 HTML “&lt;”로 변경한다. HTML 엔터티는 대부분의 브라우저에서 특수한 의미를 가지지 않으며, 단순한 문자로 처리된다.
이렇게 인코딩하면 사용자는 <script>가 <script>로 보이지만 HTML 문서에서는 &lt;script&gt;로 나타나서 브라우저에서 일반 문자로 인식하고 스크립트로 해석되어 실행되지는 않는다.

htmlspecialchars($str,ENT_QUOTES,'UTF-8');
이 함수는 문자열에서 특정한 특수 문자를 HTML 엔티티로 변환한다.
& (앰퍼샌드) 는 &amp; 로 바꾼다.
" (큰따옴표) 는 &quot; 로 바꾼다.
' (작은따옴표) 는 &#039; 로 바꾼다.
< (~ 보다 작다는 기호) 는 &lt; 로 바꾼다.
> (~ 보다 크다는 기호) 는 &gt; 로 바꾼다.
htmlspecialchars 함수를 사용하면 악성 사용자로부터 XSS 공격을 방지 할 수 있다.

게시판의 게시글, 댓글, 쪽지 등에 자바스크립트 코드가 들어가지 않도록 필터링해야 한다.
HTTP  헤더에 문자 인코딩을 지정하지 않는 페이지는 XSS 공격의 위험성 있으므로 반드시 문자 인코딩을 설정해야 한다. 모든 파라미터는 변조할 수 있다는 전제하에 Web 애플리케이션을 작성해야 한다.

아래 코드는 htmlspecialchars 함수, strip_tags 함수를 이용하여 사용할 경우와 사용하지 않을 경우의 XSS 공격이라는 가정하의 예제인 셈이다.

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set('default_charset','UTF-8');

$str = "<h2> 'PHP' morden programing.</h2>";
// HTML 태그 속성 반영한 출력
echo $str.'<br/>';

$str2 = htmlspecialchars($str,ENT_QUOTES,'UTF-8'); // HTML 태그에 사용되는 특수문자를 HTML 엔티티로 변환
// HTML 태그 속성 제거된 문자열 출력
echo $str2.'<br/>';

// 정규식으로 HTML 태그 제거
$str3 = preg_replace("/(<([^>]+)>)/i","",$str);
echo $str3.'<br/>';
// ? : 0 또는 하나     {0,1} 와 같다.
// + : 1개 이상       {1,} 와 같다.
// * : 0 개 이상      {0,} 과 같다.
// [] : []안에 있는 문자열 중 한문자
// {} : {} 바로 앞에 있는 문자열(또는 문자)의 개수
// () : ()안에 있는 문자들의 그룹화
// | : OR 연산자 기능

// HTML 비 허용시
$str4 = strip_tags($str); // HTML 태그가 포함될 경우 HTML 태그 자체를 삭제
echo $str4.'<br/>';


$str ="<script>alert('xss 공격!');</script>";
$str1 = strip_tags($str); // HTML 태그가 포함될 경우 HTML 태그 자체를 삭제
echo $str1.'<br/>';
$str2 = preg_replace("/(<([^>]+)>)/i","",$str);
echo $str2.'<br/>';

$str ='<a href="javascript:alert(\'xss 공격!\')">XSS</a>';
$str1 = strip_tags($str); // HTML 태그가 포함될 경우 HTML 태그 자체를 삭제
echo $str1.'<br/>';


$str ='<img src="#" onerror="alert(\'XSS 공격!\');">';
$str = strip_tags($str); // HTML 태그가 포함될 경우 HTML 태그 자체를 삭제
echo $str.'<br/>';

$str ='<IFRAME src="&#106;&#097;&#118;&#097;&#115;&#099;&#114;&#105;&#112;&#116;&#058;
&#097;&#108;&#101;&#114;&#116;&#040;&#039;&#120;&#115;&#115;&#032;&#234;&#179;&#181;
&#234;&#178;&#169;&#033;&#039;&#041;&#059;" width="0" height="0" frameborder="0"></IFRAME>';
$str = strip_tags($str); // HTML 태그가 포함될 경우 HTML 태그 자체를 삭제
echo $str.'<br/>';

?>


결과 화면


Text to ASCII Converter : http://www.unit-conversion.info/texttools/ascii/#data


정규표현식으로 HTML 태그를 제거하는 것은 Javascript 함수로 만들어서 확인할 수 있다.


<iframe> 태그 삽입, <object> 태그 삽입, Web 브라우저 URL Spoofing(변조), 악성코드 은닉 등 다양한 XSS 공격 기법이 가능하므로 필터링에 각별한 고려가 필요하다.


국내에서는 게시판이 대부분 WYSIWYG 에디터를 이용하므로 선택적 필터링을 잘 해야 한다.


HTML Purifier는 해외의 보안 전문가들로부터 철저하게 검증받은 필터링 라이브러리이다.
whitelisting 기법을 사용하고, 잘못된 태그도 확실하게 걸러내준다.
처리속도가 빠르지 않기 때문에 HTML이 필요한 경우에만 사용해야 한다.


참고하면 도움되는 게시글
ㅇ 안경잡이 개발자 XSS 공격 강의 : https://www.youtube.com/watch?v=DoN7bkdQBXU
ㅇ [웹취약점] XSS 크로스 사이트 스크립팅 http://coashanee5.blogspot.com/2017/02/xss.html
ㅇ KISA(한국인터넷진흥원) XSS 공격 종류 및 대응 방법 : http://www.kisa.or.kr/uploadfile/201312/201312161355109566.pdf


728x90

'Web Security' 카테고리의 다른 글

HTML Purifier 사용법 예시  (0) 2023.02.28
remote IP address  (0) 2021.03.24
파일 다운로드 공격 방지  (0) 2019.07.05
파일 업로드 공격 방지  (0) 2019.06.21
SQL Injection 공격 방지  (1) 2019.06.19
블로그 이미지

Link2Me

,