모의해킹

XML/XPath Injection (Login Form)

editor9386 2025. 2. 20. 00:19

XML 이란 ? Extensible Markup Language 로 데이터를 저장하고 전송하기 위한 마크업 언어이다.

HTML 과 비슷하게 태그를 사용하지만 XML 은 데이터를 표현하는 데 초점을 맞추고 있고 사용자가 원하는 태그를 직접 정의 할 수 있다.

 

XML은 사용자가 직접 태그를 정의할 수 있어 다양한 데이터를 표현할 수 있다.

EX) <학생>김완섭</학생> 이런식으로 데이터를 구분한다.

 

XPath : XML 문서 내에서 특정 요소(노드)를 찾기 위한 경로 언어 특정 태그를 선택(찾기)하기 위한 언어

 

 

 

[login='" . $login . "' and password='" . $password . "']

 

 

이런식으로 ID와 비밀번호를 한번에 받고 두 값이 모두 참이여야 하는 방식

 

[login='" . $login . "' and password='" . $password . "'] 이 부분이 항상 참이 되는 값을 생각해보면

 

[login=' " ' or 1=1 or ' " ' and password='" . $password . "']  

 

한 줄에서 or 연산자 보다 and 연산자의 연산 속도가 빠르기 때문에 and 연산자 먼저 계산

' " ' and password=' " . $password . " ' 항상 거짓(0)

 

login=' " ' or 1=1 or 0

login= 1 or 0

login= 1 으로 항상 참

 

 

그리고 데이터베이스 구조를 파악할 수 있는데 노드의 자식 노드들의 개수를 파악 하기위해 다음처럼 입력한다

neo 'and count(../child::*)=1 or 'a'='b (블라인드 인젝션 방식)

            의미 해석 :  개수(상위노드(../)의 자식노드(child) == 현재 노드 )의 개수가 1개인가?

 

login = ' [login 폼 입력 값 ] ' and password = ' [password 폼 입력 값] '

login = ' neo' and count(../child::*)=1 or 'a'='b ' and password = '  '

 

and 연산자부터 계산해보면

'a'='b ' and password = '  '

의 결과는 거짓이 되므로

login = ' neo' and count(../child::*)=1 or false

 

login = ' neo' and count(../child::*)=1

이 결과에 따라 참/거짓이 나뉘게 된다. 위 결과가 참이면 전체 쿼리가 참이 되어 로그인이 되는 것이고, 거짓이라면 로그인에 실패하는 것이다.

노드가 총 6개인 것을 알 수 있다.

'모의해킹' 카테고리의 다른 글

Broken Auth. - Forgotten Function  (0) 2025.02.23
XML/Xpath injection - Search  (0) 2025.02.23
SQL Injection - Blind - Time-Based  (0) 2025.02.13
페이로드  (0) 2025.02.12
SQL injection - blind (Boolean-Based)  (0) 2025.02.12