정보보안(구버전)/ bWAPP 2019. 2. 8. 15:14

웹 해킹 bWAPP - 28. A1 - Injection - XML/XPath Injection(Login Form)

 

 

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

 

 

1. Injection

 

 - OWASP Top10 A1 - 악의적인 명령 삽입
 - 서버로 전송되는 요청 정보에 악의적인 명령을 삽입하여 불필요한 동작을 실시하거나, 서버/시스템/DB 중요 정보를

   획득할 수 있는 취약점이다.
 - Ex) HTML 인젝션, SQL 인젝션, PHP 인젝션, XML 인젝션

 

 

 

2. XML

 

 - HTML을 개선하여 만든 언어이다.

 - 홈페이지 구축기능, 검색기능 등이 향상되었고, 웹 페이지의 추가와 작성이 편리해졌다.
 - XML을 이용하면 사용자가 구조화된 데이터베이스를 조작할 수 있다.

 - 데이터를 트리 구조의 노드로 표현하며, 사용자 정의로 데이터를 분류할 수 있다.

 - heroes.xml 파일 : http://192.168.20.205/bWAPP/passwords/

 

28-0. heroes_xml.txt

 

bee@bee-box:/var/www/bWAPP$ vi passwords/heroes.xml

<?xml version="1.0" encoding="UTF-8"?>
<heroes>
        <hero>
                <id>1</id>
                <login>neo</login>
                <password>trinity</password>
                <secret>Oh why didn't I took that BLACK pill?</secret>
                <movie>The Matrix</movie>
                <genre>action sci-fi</genre>
        </hero>


 ~ 중간 생략 ~

 

        <hero>
                <id>6</id>
                <login>selene</login>
                <password>m00n</password>
                <secret>It wasn't the Lycans. It was you.</secret>
                <movie>Underworld</movie>
                <genre>action horror sci-fi</genre>
        </hero>
</heroes>

 

:q!

 

 

'heroes_xml.txt' 트리 구조

 

 

 

3. Xpath

 

 - XML에게 질의할때 사용하는 일종의 쿼리이다.
 - XML DB의 내용을 선택하거나 조작할 수 있다.

 

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

~ 중간 생략 ~

 

if(isset($_REQUEST["login"]) & isset($_REQUEST["password"]))
{

 

    $login = $_REQUEST["login"];
    $login = xmli($login);

 

    $password = $_REQUEST["password"];
    $password = xmli($password);

 

    // Loads the XML file
    $xml = simplexml_load_file("passwords/heroes.xml");

 

    // XPath search
    $result = $xml->xpath("/heroes/hero[login='" . $login . "' and password='" . $password . "']");

 

:q!

 

 

 

4. Xpath 명령어

 

Xpath 조회 연습 사이트 : https://www.w3schools.com/xml/xpath_examples.asp

 

 명령어

내용 

/

 최상위 노드

//

 현재 노드로부터 모든 노드 조회

*

 모든 노드 조회

.

 현재 노드

..

 현재 상위 노드 접근

parent

 현재 노드의 부모 노드 조회

child

 현재 노드의 자식 노드 조회

node()

 현재 노드로부터 모든 노드 조회

[ ]

 조건문 (where 구문 개념)

 

 

 

5. 실습에 사용할 함수 및 명령어

 

 명령어

내용 

 count()  

 노드들의 개수를 반환하는 함수

 string-length()

 문자열의 길이를 반환하는 함수

 ::*

 지정 노드의 모든 내용

 name()

 노드의 이름을 반환하는 함수

 substring()

 지정한 문자열을 반환하는 함수

 position()

 노드의 위치를 반환하는 함수

 string()

 인자로 받은 값을 문자열로 반환하는 함수

 

 

 

 

6. Injection - XML/XPath Injection(Login Form)

 

 - 이 시나리오는 XML 구조에 악의적인 행위를 발생시키는 내용을 인젝션하는 공격하는 내용이다.

 - 실습 진행시 로그인/패스워드 폼을 사용하는데, 로그인 폼에 인젝션을 실시하여 공격을 실시할 수 있다.

 - 참/거짓때 출력되는 메세지를 확인하여 XML 인젝션 공격을 진행한다.

 

 

Ex1) Injection - XML/XPath Injection(Login Form) 이해 I

 

 

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

 

 

' or 1=1 or ' 을 실시하여 참인 경우, 출력 메세지 확인(Neo 계정이 데이터베이스 첫번째 있기 때문에 출력됨)

 

 

 

' or 1=2 or ' 을 실시하여 거짓인 경우, 출력 메세지 확인(거짓인 경우 'Invalid credentials!' 가 출력됨)

 

 

 

[참고] 인젝션 실시 및 참/거짓 이해

 

$result = $xml->xpath("/heroes/hero[login='" . $login . "' and password='" . $password . "']");

 

 

Ex1) ' or 1=1 or '

 

$result = $xml->xpath("/heroes/hero[login='' or 1=1 or '' and password='']");

                                                                               ②            ①

 

'' and password=''  <- 거짓

 

'' or 1=1 or 거짓  <-

 

 

Ex2) ' or 1=2 or '

 

$result = $xml->xpath("/heroes/hero[login='' or 1=1 or '' and password='']");

                                                                               ②            ①

 

'' and password=''  <- 거짓

 

② '' or 1=2 or 거짓  <- 거짓

 

 

 


Ex2) Injection - XML/XPath Injection(Login Form) 이해 II

 

28-1. XML 인젝션 추가-1.txt

현재 상위 노드인 heroes에서 자신과 동일한 위치에 있는 자식 노드(6개)가 몇개 인지를 알아보는 인젝션


 

 

28-2. XML 인젝션 추가-2.txt

부모의 이름(6글자)의 길이가 몇글자인지를 알아보는 인젝션

 

 

 

28-3. XML 인젝션 추가-3.txt

부모의 이름(heroes)을 알아보는 인젝션

 

 

 

28-4. XML 인젝션 추가-4.txt

첫번째 자식 노드의 이름 길이(4글자)와 이름(hero)을 알아보는 인젝션

(이런식으로 여섯번째 자식 노드까지 인젝션 실시)

 

 

 

28-5. XML 인젝션 추가-5.txt

첫번째 hero 노드의 자식 노드 개수(6개)를 알아보는 인젝션

 

 

 

28-6. XML 인젝션 추가-6.txt

첫번째 hero 노드의 첫번째 자식 노드 이름 길이(2글자)와 이름(id)를 알아보는 인젝션

 

 

 

28-7. XML 인젝션 추가-7.txt

첫번째 hero 노드의 두번째 자식 노드 이름 길이(5글자)와 이름(login)를 알아보는 인젝션

 

 

 

28-8. XML 인젝션 추가-8.txt

첫번째 hero 노드의 세번째 자식 노드 이름 길이(8글자)와 이름(password)를 알아보는 인젝션

 

 

 

28-9. XML 인젝션 추가-9.txt 

첫번째 hero 노드의 네번째 자식 노드 이름 길이(5글자)와 이름(secret)를 알아보는 인젝션

 

 

 

28-10. XML 인젝션 추가-10.txt

첫번째 hero 노드의 다섯번째 자식 노드 이름 길이(5글자)와 이름(movie)를 알아보는 인젝션

 

 

 

28-11. XML 인젝션 추가-11.txt

첫번째 hero 노드의 여섯번째 자식 노드 이름 길이(5글자)와 이름(genre)를 알아보는 인젝션

 

 

 

28-12. XML 인젝션 추가-12.txt

첫번째 hero 노드의 첫번째 자식 노드 id의 값 길이(1글자)와 내용(1)을 알아보는 인젝션

 

 

 

28-13. XML 인젝션 추가-13.txt

첫번째 hero 노드의 두번째 자식 노드 login의 값 길이(3글자)와 내용(neo)을 알아보는 인젝션

 

 

 

28-14. XML 인젝션 추가-14.txt

첫번째 hero 노드의 세번째 자식 노드 password의 값 길이(7글자)와 내용(trinity)을 알아보는 인젝션

 

 

 

 

Ex3) 'xmli_1.php' & 'functions_external.php' 파일 내용 확인

bee@bee-box:/var/www/bWAPP$ ls -l xmli_1.php
-rw-rw-r-- 1 root www-data 8577 2014-11-02 23:52 xmli_1.php

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

~ 중간 생략 ~

 

include("functions_external.php");
include("selections.php");

 

ini_set("display_errors", 1);

 

$message = "";

function xmli($data)
{

    if(isset($_COOKIE["security_level"]))
    {

        switch($_COOKIE["security_level"])
        {

            case "0" :

 

                $data = no_check($data);
                break;

 

            case "1" :

 

                $data = xmli_check_1($data);
                break;

 

            case "2" :

 

                $data = xmli_check_1($data);
                break;

 

            default :

 

                $data = no_check($data);
                break;

        }

    }

    return $data;

}

 

:q! 


 

bee@bee-box:/var/www/bWAPP$ gedit functions_external.php

~ 중간 생략 ~

 

function xmli_check_1($data)

{

 

    // str_replace()을 이용하여 특수문자(기호)들을 이스케프를 실시한다.

    // str_replace(A, B, C) : C 문자열에서 A 문자열을 B 문자열로 치환 시킴


    // Replaces dangerous characters: ( ) = ' [ ] : , * / WHITESPACE

    $input = str_replace("(", "", $data);   

    $input = str_replace(")", "", $input);

    $input = str_replace("=", "", $input);

    $input = str_replace("'", "", $input);

    $input = str_replace("[", "", $input);

    $input = str_replace("]", "", $input);

    $input = str_replace(":", "", $input);

    $input = str_replace(",", "", $input);

    $input = str_replace("*", "", $input);

    $input = str_replace("/", "", $input);

    $input = str_replace(" ", "", $input);

  

    return $input;

   

}

 

 

 


Ex4) 보안 레벨 'High' 변경

 

 

보안 레벨 및 시나리오 선택

 

 

 

28-15. XML 인젝션 추가-15.txt

XML 인젝션 실패

 

 

 

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

 

웹해킹 28. bWAPP Injection - XML&XPath Injection(Login Form)   https://youtu.be/yTxg2d5q240

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


Q