Search 페이지에 들어가면 다음과 같은 화면이 나온다.
search 버튼을 누르면
다음과 같이 genre와 action 변수가 get 방식으로 URL에 변수가 노출이 되어 나온다.
이제 여기에 injection 공격이 먹히는지 확인하기 위해 '를 입력한다.
다음과 같이 경고가 나온다.
또한 search를 누르게 되면 페이지는 contains 함수를 호출한다.
fn:contains ($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean?
contains 함수는 검색할 단어가 들어 있는지 검색해주는 함수인데 두 개의 변수를 받는다.
첫번째 변수 안에는 테스트할 변수, 두 번째 명령어는 검색할 명령어가 들어가게 되고 만약 검색할 변수가 테스트할 변수 안에 있으면 참, 그렇지 않으면 거짓이 되어 출력이 된다.
contains 함수를 이용하여 쿼리가 작성된다고 하면
$result = $xml -> xpath("/hero[contains(genre, ' ')]")
다음과 같이 들어가게 될 것이다.
이제 항상 참인 쿼리를 집어 넣어보자
') or 1=1 ][(' a
다음과 같은 코드를 집어넣게 되면 쿼리문이 작성될 때
xpath("/hero[contains(genre, ' ') or 1=1 ] [ ' or '])
다음과 같은 형식으로 들어가게 될 것이며 이 결과 항상 참인 결과가 되기 때문에 모든 영화의 종류가 다 나올 것이다.
다음과 같이 입력하면
다음과 같이 모든 결과가 나오게 된다.
다음으로는 XML 데이터베이스의 내용을 출력하는 쿼리를 입력한다.
'|' 연산자는 AND 연산자처럼 서로 다른 쿼리를 연결할 때 사용한다.
'//*' 은 현재 노드로부터 모든 노드를 조회하는 명령어이다.
이제 이 2개의 명령어를 가지고 XML의 데이터 베이스 내용을 출력해보자
')] | //*|Lactea[('
다음과 같은 명령어를 입력하면 현재 노로부터 모든 노드를 검색할 수 있다.
쿼리를 작성해보면
[contains(genre,' ')] | //*| Lactea[(' ')]
다음과 같은 쿼리문이 만들어진다.
쿼리문을 해석해보면
contains(genre, ' ') -> 현재 동작중인 쿼리문을 닫아 정상적으로 쿼리문을 끝냄
| //* | -> AND 연산자를 이용해 현재 노드로부터 모든 노드를 조회하는 쿼리를 작성
Lactea[(' -> 뒤에 있는 ')를 끝내주기 위해 임의의 문자열을 추가 함
다음과 같이 동작을 할 수 있다.
코드 결과를 출력하면
다음과 같은 결과가 나온다.
난이도 - (중 / 상)
'를 입력을 하면 아무것도 안 나온다.
그 이유는 xmli_2.php 페이지를 확인해보면 된다.
xmli_2.php
난이도 (중)과(상)은 xmli_check_1 함수가 적용되어 있다.
xmli_check_1 함수는 functions_externnal.php 페이지에 있는데 functions_external.php를 확인하면
xmli_check_1 함수는 모든 특수문자를 WHITESPACE(공백)으로 치환해준다.
그렇기 때문에 XML XPATH Injection 공격이 먹히지 않았다.
'웹해킹 > bee-box' 카테고리의 다른 글
Broken Auth - Insecure Login Form (0) | 2019.10.21 |
---|---|
XML/Xpath Injection (0) | 2019.10.09 |
XML / XPATH 인젝션 - Login Form (0) | 2019.08.07 |
SQL Injection - Blind - Time Based (0) | 2019.08.06 |
Blind SQL Injection - Boolean Based (0) | 2019.08.05 |