DVWA에서 XSS 실습하기 (Low)

맑음·2025년 5월 17일
post-thumbnail

XSS?

XSS (Cross-Site Scripting)은 웹 애플리케이션의 위험하고 흔한 보안 취약점 중 하나로 공격자가 웹 페이지에 악성 스크립트를 삽입하여 사용자의 브라우저에서 실행되게 만드는 공격 기법입니다

더 많은 내용은 XSS에 대해 알아보기를 봐주시면 감사하겠습니다

DVWA 환경에서 XSS 실습하기

이번에는 XSS를 실습해보도록 합시다

본 실습은 DVWA 환경을 구축한 후 가장 취약한 환경인 Low 레벨에서 진행되었습니다!

Stored XSS

이번에는 3가지를 진행할 예정이며 먼저 Stored XSS부터 해보겠습니다
DVWA에서 XSS (Stored)를 클릭해 줍시다
방명록 기능이 있네요
한번 입력해봅시다
잘 입력되는 것을 볼 수 있네요
다음으로 View Source를 눌러 소스를 봅시다

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = stripslashes( $message );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Sanitize name input
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    //mysql_close();
}

?>

문제점이 보이시나요?
사용자가 입력하는 것을 그대로 DB에 저장되고 출력 시 이스케이프 처리가 없으면 그대로 실행됩니다
즉 악성스크립트를 넣으면 그대로 실행이 가능하다는 것 입니다

그럼 한번 시도해 봅시다

XSS는 쿠키 탈취, 세션 하이재킹, 피싱 등 다양한 공격을 수행하기 때문에 저는 일단 쿠키를 확인해보겠습니다
JavaScript에 document 객체에 있는 document.cookie를 이용하면 쿠키 확인이 가능합니다
그럼 저는 이를 이용한 악성 스크립트를 입력해보겠습니다

Name 부분에는 아무거나 넣고 Message 부분에 아래와 같이 입력해주겠습니다

<script>alert(document.cookie)</script>

그럼 아래와 같이 쿠키의 내용이 뜨는 것을 확인할 수 있습니다
자 그러면 이번에는 새로고침을 한번 해봅시다
보이시나요? 방명록 기능에 악성 스크립트를 서버에 저장해 방명록을 확인하면 스크립트가 실행이 됩니다
스크립트가 이를 삭제하지 않고 반복적으로 스크립트가 실행되는 것을 확인할 수 있습니다

이 쿠키는 이제 제 것입니다ㅎㅎ

이번에는 Name에 넣어볼까요?
Name 항목은 10글자로 제한이 있네요
그렇다고 포기할 제가 아니죠
개발자 옵션에서 Name 부분을 찾아봅시다
역시나 maxlength="10"이 보이네요
그럼 없애봅시다!
입력 제한이 없어졌습니다
그럼 다시 Name에 동일한 스크립트를 넣어봅시다
동일한 결과를 얻을 수 있네요

쿠키를 탈취해봤습니다!

Reflected XSS

이번에는 Reflected XSS를 진행해 봅시다
XSS (Reflected)를 눌러봅시다
이름이 무엇인지 묻고있네요
이름을 넣어봅시다!
이렇게 Hello + name으로 나타나는 것을 확인할 수 있네요
View Source를 눌러 소스를 확인해봅시다

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?>

뭐가 문제인지 보이시나요?
바로 $_GET['name']의 값을 HTML 인코딩 없이 바로 출력합니다
즉 사용자가 악성 스크립트를 입력으로 주면 그대로 실행된다는 것입니다
참고로 X-XSS-Proteciton: 0는 브라우저의 XSS 보호 기능도 강제로 끄는 헤더입니다

자 이제 또 쿠키를 탈취해봅시다
아래를 name 부분에 입력해봅시다

<script>alert(document.cookie)</script>

역시나 쿠키의 내용이 뜨는 것을 확인할 수 있습니다!

Reflected XSS는 공격자가 조작한 링크를 사용자가 클릭할 때 서버로부터 악성 스크립트가 포함된 응답이 바로 반환되어 실행되는 형태입니다
그렇기에 이번에는 긴급한 메일인 것처럼 위장을 하고 링크를 URL을 클릭하도록 해보겠습니다

저한테 직접 위와 같은 메일을 보냈습니다
보안 문제인 것 같은데 한번 클릭해 보겠습니다

절대 남에게 악용을 해선 안됩니다! 책임은 본인에게 있습니다!

헉! 심각한 보안 위협이라 해서 클릭했더니 제 쿠키의 내용이 노출되어 버렸네요....

스팸 메일 등 수상한 URL은 꼭 클릭하지 않도록 합시다!

DOM-based XSS

마지막으로 DOM-based XSS를 실습해 봅시다
XSS (DOM)을 클릭해 봅시다
언어를 선택하라고 나오네요
저는 한국인이니 한글을 선택하려고 했는데 없네요
아쉬운대로 영어라도 선택하겠습니다
선택했더니 URL에 아래와 같이 나타나네요
default라는 매개변수 값이 설정되는 것을 확인할 수 있습니다

그럼 View Source를 통해 확인하려고 했는데 없네요
개발자 도구에서 한번 확인해봅시다
default 매개변수에 설정된 값으로 페이지를 구성하는 것을 확인할 수 있네요!

그럼 이 값을 조작해봅시다
default에 English로 되어있던 것을 Korean으로 바꿨더니 Korean이 드롭다운에 표시가 되네요!

그럼 마찬가지로 아래의 내용을 넣어봅시다

<script>alert(document.cookie)</script>

역시나 쿠키의 내용이 뜨는 것을 확인할 수 있습니다

실습 후기

이번 실습도 아직 Low 레벨이라 그런지 어렵다고 생각되는 부분은 없었습니다
XSS도 OWASP Top 10에 있는데 이유를 알 것 같습니다

특히 Reflected XSS는 정말 많은 사람들이 별 생각 없이 누르다가 당할 것 같은 공격이라 더 와닿는 느낌이 들었습니다
정말 조심하고 또 조심해야할 것 같습니다

오늘도 즐거운 실습 끝!

profile
내일도 맑음

0개의 댓글