XSS(Stored, 저장형 XSS)
개념
공격자가 악성 스크립트를 웹 애플리케이션의 서버에 영구적으로 저장하고,
이를 다른 사용자가 웹 페이지를 방문할 때마다 실행되도록 하는 일반적인 형태의 XSS 유형이다.
주로 게시판, 댓글, 프로필 정보 등 사용자 생성 콘텐츠를 저장하는 기능에서 발생한다.
즉, 악성 스크립트가 서버에 저장된 후, 해당 데이터를 불러오는
모든 사용자의 브라우저에서 악성 스크립트가 실행되는 지속적인 공격 유형이다.
열람하는 사용자들은 쿠키를 탈취당하거나 다른 사이트로 리디렉션 되는 등의 공격을 받는다.
실습(Low Level)
Stored XSS 실습 페이지의 구성을 살펴보면, 방명록에 이름과 메시지를 남기는 형태이다.
만약 이 메시지를 남길 때, HTML 검증이 이루어지지 않는다면 Stored XSS 취약점이 발생할 것이다.
Name, Message 칸에는 글자수 제한이 있는 것을 확인할 수 있다.
개발자도구(F12)를 통해 Name 칸의 maxlength 값을 임의 값(100)으로 변경하여 입력제한을 푼다.
이후에 경고창을 출력하는 스크립트 문을 작성하여 Sign Guestbook 버튼을 클릭한다.
그대로 경고창이 출력되는 것을 확인할 수 있으며, 방명록이 저장된 상태이다.
이 페이지를 접속할 때마다 경고창이 출력되게 된다.
실습(Medium Level)
Medium Level도 동일하게 maxlength 값을 조정하고
스크립트를 작성한 결과 <script> 문이 공백처리 된다고 유추할 수 있다.
script를 대문자로 작성하면 우회가 가능하다.
소스코드를 확인해 보면 str_replace() 함수를 이용하여 "<script>" 문자열을 제거하는데, 이는 대문자 태그를 검사하지 않는다.
실습(High Level)
High Level에서 이전 두 레벨의 우회방법을 그대로 사용하였을 때, 방명록 결과이다.
결과를 봐서는 <script>를 사용할 때, 이어지는 모든 문장이 치환되었다고 추측할 수 있다.
이를 우회하기 위해서는 <script>라는 태그 외의 다른 태그인 img 태그를 사용하는 방법을 생각할 수 있다.
<img src=“x”onerror=“alert(document.cookie)”> 스크립트를 사용하여 쿠키를 경고창에 띄우도록 유도한다.
우회가 성공한 것을 확인할 수 있다.
소스코드를 살펴보면 preg_relace() 함수를 이용하여 대소문자를 구분하지 않고 "<*s*c*r*i*p*t"를 제거하고 있다.
"</script", "<sc\ript", "<SCRIPT", "<Script", "<sCRIPT" 등의 다양한 우회방법을 방어할 수 있다.
하지만 자바스크립트를 삽입할 수 있는 요소를 매우 다양하기 때문에 쉽게 우회할 수 있다.
실습(Impossible Level)
HTML 삽입이 불가능한 Impossible Level의 소스코드를 살펴보면,
Name 입력과 Message 입력 모두에 대해서 htmlspecialchars() 함수를 적용하고 있다.
이 함수는 입력에서 특수문자를 변환(’<‘ → '<', ‘>’ → '>', ‘&’ → '&', ‘”’ → '"')한다.
사용자 입력에서 HTML 삽입을 거의 원천적으로 차단하게 된다.
그렇다면 지금까지 우회했던 방법을 그대로 Impossible Level에 사용해 본다.
위와 같이 특수문자들이 모두 변환되어 HTML 삽입이 원천 차단된 것을 확인할 수 있다.
XSS(Reflected, 반사형)
개념
악성 스크립트가 웹 애플리케이션의 서버에 저장되지 않고, 즉시 반사되어 공격 대상의 브라우저에서 실행되는 유형이다.
주로 검색 결과 페이지, 에러 메시지, 또는 URL 파라미터를 이용해 공격이 이루어진다.
공격자가 클릭을 유도하는 악성 링크를 생성하여 웹사이트에 배포하고, 사용자가 해당 링크를 클릭하면,
사용자의 쿠키 값이 공격자에게 전송되며, URL에 포함된 악성 스크립트가 서버로 전송된 후 즉시 반사되어 브라우저에서 실행될 수 있다.
즉, 불특정 다수를 대상으로 하는 Stored XSS 방식과는 달리,
공격자가 특정 사용자를 이용하여, 사회공학적인 기법 등을 통해 공격을 수행할 수 있는 형태이다.
이는 특정 사용자가 이용되어서 해당 사용자가 직접 서버 쪽으로 공격하는 형태로 동작하기 때문에 반사형이라 불리고,
서버 입장에서는 실제 공격자가 아닌, 이용된 사용자가 공격자인 것처럼 보이기 때문에 결과적으로는 실제 공격자를 알 수 없게 된다.
저장형 XSS와의 차이점
보안이라는 관점에서 바라봤을 때는 사실 공격자가 누구인지, 무엇을 타겟으로 하는지에 대한 부분들을 집중적으로 본다.
저장형 XSS 같은 경우는 공격자가 스크립트가 포함된 게시글을 업로드한다. 즉, 글쓴이가 누구인지를 알 수 있고
해당 계정, IP 정보 등을 추적할 수 있다. 이는 공격자를 식별하여 차단 조치를 하는 등의 추가적인 조치를 취할 수 있다.
하지만 반사형 XSS의 경우는 공격자가 Direct로 서버에다가 행위를 하는 것이 아닌 특정 대상(피해자)를 정한다.
그리고 해당 피해자에게 사회공학적 기법 등을 통해 공격을 수행하여, 아무런 의심 없이 수행된 URL 정보로 하여금
서버 쪽에 공격이 이루어지는 형태로써 작동을 하는 것이다.
이는 서버측에서 바라보았을 때, 저장형 XSS의 경우는 공격자가 누구인지를 식별할 수 있지만
반사형 XSS의 경우는 실제 피해자가 공격자인 것으로 보여지게 된다.
즉, 직접적 행위를 하는 것을 저장형 XSS라고 볼 수 있고, 반사형 XSS는 피해자를 통해서 공격이 이루어지는 형태로서 보이다 보니,
본래 공격자가 누구인지를 알 수가 없다는 특징적인 부분들이 존재한다고 보면 된다.
실습(Low Level)
실습 페이지는 "What’s your name?" 이라는 입력 칸이 존재하는 것을 확인할 수 있다.
여기에 임의의 입력값 'jys'를 Submit 하면, 입력값 ‘jys’가 파라미터로 넘어가는 것을 확인할 수 있다.
그렇다면, 아래와 같이 악성 스크립트를 입력값으로 작성하여, 파라미터로 그대로 전달되도록 한다.
아래와 같이 파라미터로 스크립트가 넘어가며, 우회를 성공하였다.
실습(Medium Level)
Low Level에서 사용한 스크립트를 그대로 사용한 결과를 보았을 때, <script>가 공백처리 되었다고 유추할 수 있다.
script를 SCRIPT로 대문자 변환 시, 우회가 성공한 것을 확인할 수 있다.
실습(High Level)
High Level의 결과를 보면 Stored XSS와 동일하게 <script>를 사용할 때, 이어지는 모든 문장이 치환되었다고 추측할 수 있다.
<script>라는 태그 외의 다른 태그인 img 태그를 사용하여 우회한다.
실습(Impossible Level)
Impossible Level의 소스코드를 보았을 때, GET 방식으로 전달된 name 변수를
htmlspecialchars( ) 함수로 처리한 후에 HTML에 출력하는 방식으로 HTML 삽입을 차단하고 있다.
'IT_정보보안 > 웹 모의해킹 프로젝트 (DVWA)' 카테고리의 다른 글
38. 웹 모의해킹 실습 (5) : Weak Session IDs, XSS(DOM) (2) | 2024.11.18 |
---|---|
37. 웹 모의해킹 실습 (4) : SQL Injection, SQL InjectionI (Blind) (1) | 2024.11.12 |
36. 웹 모의해킹 실습 (3) : 파일 업로드, Insecure CAPTCHA (2) | 2024.10.27 |
35. 웹 모의해킹 실습 (2) : CSRF, File Inclusion (1) | 2024.09.30 |
34. 웹 모의해킹 실습 (1) : DVWA 환경 구성 및 Command injection, Brute Force (1) | 2024.09.22 |