정보보안(구버전)/ bWAPP 2019. 2. 8. 20:23
웹 해킹 bWAPP - 29. A1 - Injection - XML/XPath Injection(Search)
본 내용은 교육 과정에서 필요한 실습 목적으로 구성된 것이며, 혹시라도 개인적인 용도 및 악의적인 목적으로 사용할 경우, 법적 책임은 본인에게 있다는 것을 알려드립니다.
1. Injection
- OWASP Top10 A1 - 악의적인 명령 삽입
- 서버로 전송되는 요청 정보에 악의적인 명령을 삽입하여 불필요한 동작을 실시하거나, 서버/시스템/DB 중요 정보를
획득할 수 있는 취약점이다.
- Ex) HTML 인젝션, SQL 인젝션, PHP 인젝션, XML 인젝션
2. XML
- HTML을 개선하여 만든 언어이다.
- 홈페이지 구축기능, 검색기능 등이 향상되었고, 웹 페이지의 추가와 작성이 편리해졌다.
- XML을 이용하면 사용자가 구조화된 데이터베이스를 조작할 수 있다.
- 데이터를 트리 구조의 노드로 표현하며, 사용자 정의로 데이터를 분류할 수 있다.
bee@bee-box:/var/www/bWAPP$ vi passwords/heroes.xml
<?xml version="1.0" encoding="UTF-8"?>
<hero>
:q! |
'heroes_xml.txt' 트리 구조
3. Xpath
- XML에게 질의할때 사용하는 일종의 쿼리이다.
- XML DB의 내용을 선택하거나 조작할 수 있다.
bee@bee-box:/var/www/bWAPP$ vi xmli_2.php
~ 중간 생략 ~
if(isset($_REQUEST["genre"]))
$genre = $_REQUEST["genre"];
// Loads the XML file
// XPath search
:q! |
4. Xpath 명령어
Xpath 조회 연습 사이트 : https://www.w3schools.com/xml/xpath_examples.asp
명령어 |
내용 |
/ |
최상위 노드 |
// |
현재 노드로부터 모든 노드 조회 |
* |
모든 노드 조회 |
. |
현재 노드 |
.. |
현재 상위 노드 접근 |
parent |
현재 노드의 부모 노드 조회 |
child |
현재 노드의 자식 노드 조회 |
node() |
현재 노드로부터 모든 노드 조회 |
[ ] |
조건문 (where 구문 개념) |
5. 실습에 사용할 함수
- contains() 함수 : 두개의 인자에서 첫번째 인자의 문자열이 두번째 인자의 문자열이 있으면 참, 없으면 거짓으로 처리
contains('CCNA', 'CCNP') <- 참
contains('CCNA', 'MS') <- 거짓
6. Injection - XML/XPath Injection(Search)
- 이 시나리오는 XML 구조에 악의적인 행위를 발생시키는 내용을 인젝션하는 공격하는 내용이다.
- 실습 진행시 영화 장르를 선택하여 검색하면 해당 장르에 해당하는 영화가 출력된다.
- 이를 통해서 참/거짓을 추측하여 공격을 실시할 수 있다.
Ex1) Injection - XML/XPath Injection(Search) 이해
보안 레벨 선택 및 시나리오 선택
'(작은 따옴표)를 인젝션하여 취약점이 있는지 확인 실시
') or 1=1 ][ ('1 을 인젝션하여 참인 경우, 출력 내용 확인
') or 1=1] | //* | cisco[('1 을 인젝션하여 출력 내용 확인
[참고] 인젝션 실시 및 참/거짓 이해
$result = $xml->xpath("//hero[contains(genre, '$genre')]/movie");
Ex1) ') or 1=1 ][ ('1
$result = $xml->xpath("//hero[contains(genre, '') or 1=1 ][ ('1')]/movie");
① ② ③
① hero[contains(genre, '')
') 을 인젝션하여 contains 함수를 닫아서 정상 쿼리로 인식하여 거짓으로 처리됨
② hero[contains(genre, '') or 1=1 ]
거짓
] 을 인젝션하여 정상 쿼리로 인식하고, or 1=1에 의해서 [ ] 안에 내용이 참으로 처리됨
③ [ ('1')]
[ ('1 을 인젝션하여 1이라는 의미 없는 문자를 입력하여 정상 쿼리로 인식함
Ex2) ') or 1=1] | //* | cisco[('
$result = $xml->xpath("//hero[contains(genre, '') or 1=1] | //* | cisco[('1')]/movie");
① ② ③
① hero[contains(genre, '') or 1=1]
') 을 인젝션하여 contains 함수를 닫아서 거짓으로 처리되며, or 1=1]에 의해서 참으로 처리함
② | //* |
파이프는 서로 다른 쿼리들 연결을 수행하며, //*에 의해서 현재 노드로부터 모든 노드를 조회함
③ cisco[('1')]/
cisco라는 문자열과 함께 [(1' 를 인젝션하여 1이라는 의미 없는 문자를 입력하여 정상 쿼리로 인식함
Ex3) 'xmli_2.php' & 'functions_external.php' 파일 내용 확인
bee@bee-box:/var/www/bWAPP$ ls -l xmli_2.php
-rw-rw-r-- 1 root www-data 7579 2014-11-02 23:52 xmli_2.php
bee@bee-box:/var/www/bWAPP$ vi xmli_2.php
~ 중간 생략 ~
include("functions_external.php");
ini_set("display_errors", 1);
function xmli($data) if(isset($_COOKIE["security_level"])) switch($_COOKIE["security_level"]) case "0" :
$data = no_check($data);
case "1" :
$data = xmli_check_1($data);
case "2" :
$data = xmli_check_1($data);
default : $data = no_check($data); } } 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' 변경
보안 레벨 및 시나리오 선택
XML 인젝션 실패
[유튜브] 동영상 강의 링크 (구독! 좋아요!!!)
웹해킹 29. bWAPP Injection - XML&XPath Injection(Search) https://youtu.be/Rd4MBWAKPqI