본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 7.크로스 사이트 스크립팅 [Stored XSS-Blog]

by Robert8478 2023. 12. 13.

크로스 사이트 스크립팅(XSS)이란? - 웹 사이트에서 입력한 데이터를 검증하지 않아 웹 브라우저를 실행할 때 발생하는 취약점이다.

입력 데이터에 스크립트 코드를 입력해서 세션 정보 탈취, 악의적인 사이트로 이동, 악성 프로그램 다운로드 등의 공격을 시도한다. 이 취약점은 서버에 전달되는 모든 변수값에서 발생할 수 있으며, 세션을 탈취해서 권한 획득을 하거나 악성코드를 배포하거나 피싱을 하는 목적 등으로 이용된다.

XSS의 종류는 코드의 입력에 따라서 저장하는 형태의 Stored XSS, 바로 실행되는 형태의 Reflected XSS, DOM Based 스크립팅 등으로 분류한다. 저장하는 형태의 Stored XSS가 보안 상 가장 위협적인 공격이다.

Stored XSS는 악의적인 스크립트 코드가 웹에 입력되면서 DB에 저장된다. 링크를 이용한 일회성 클릭 유도가 아닌 불특정 다수가 게시물에 접근하면 실행되는 형태로 지속적으로 악의적인 스크립트가 실행되기 때문에 위험하다.

실무에서는 권한 획득을 목적으로 하지만, 범죄자 입장에서는 악성코드 배포로 많이 사용한다.

[난이도 하]

우선 XSS 취약점이 있는지 파악하기 위해 간단한 alert 스크립트 구문을 넣어보자.

그랬더니 Hello World 라는 알림창이 나왔다. 이제 세션을 획득하기 위해 쿠키값을 띄워보도록 해보자.

<script>alert(document.cookie)</script> 를 입력하였더니 PHP 세션 아이디가 나왔다.
이를 이용하면 alert가 아닌 악성코드를 삽입하여 사용자가 페이지에 접속하면 접속한 사용자의 document.cookie 세션값을 해커에게 전달하도록 하게 될 수 있을 것이다.

[난이도 중,상]

기본 스크립트 구문이나 URL 인코딩한 스크립트 구문 전부 먹히지 않았다. php 코드를 살펴보자.

코드를 보니 sqli_check_3 함수에서 필터링을 하고 있는듯 하다.

찾아보니 mysqli_real_escape_string 함수를 이용해서 필터링 하고 있었다. 이는 링크와 데이터를 인자로 받으며, 입력한 데이터를 변환시킨다. SQL 문법에 사용되는 특수문자에 백슬래시(\)를 붙여서 SQL 문법으로 인식되지 않도록 하는 것이다. NULL, \r, \n, \, ', " 등이 필터링 된다.

htmlspecialchars로 우회할 수도 있으나 텍스트 입력 공간으로 SQL 인젝션을 시도할 가능성이 있기 때문에 이를 사용한 것으로 보인다. MySQL 버전이 5 이상이기 때문에 데이터베이스 연결을 위해 mysqli 함수를 썼을 것이다.