g2h

안녕하세요 👋 저는 g2h입니다.

보안 컨설팅, 모의해킹, 개인학습을 통해 배우고, 경험한 내용의 글을 쓰고 있습니다.
아래에서 최근 글과 연구 기록을 확인하세요.

Browse by Category

분류 전체보기 (156)
Network (5)
Web (37)
System (32)
Pentest (14)
WriteUP (47)
도구|Tools (12)
Security Issue (6)
1-Day-Analysis (1)
한줄보안 (1)
Infra (1)

Latest

Apache CouchDB (CouchDB Injection)

카테고리: Web/Web Hacking Techniques · 2025. 5. 15.

CouchDB란?

Apache CouchDB라고 불리는 DBMS는 NoSQL 문서 지향 데이터베이스로 일반적인 관계형데이터베이스인 RDBMS랑은 다르다.

일반적은 RDBMS의 경우 테이블과 행,열을 기반으로 관리되지만, CouchDB의 경우 JSON 기반 문서(document) 구조이다. 또한 스키마가 존재하지 않으며, 각 문서마다 구조가 달라도 된다.

특징

  • JSON 포맷으로 저장하며, HTTP를 통해 RESTfull API로 접근
  • avaScript로 작성된 MapReduce 기반의 Design Documents를 통해 쿼리 수행
  • 데이터 복지 및 분산 저장을 지원하여 고가용성 확보 가능
  • 기본 포트는 5984

기본적인 사용방법

1. Create : POST는 _id를 생성하거나 지정 가능

curl -X POST http://localhost:5984/db이름 \
  -H "Content-Type: application/json" \
  -d '{
        "_id": "user_123",
        "name": "홍길동",
        "email": "gil@example.com"
      }'

2. Read : GET + /db_name/문서 id를 통해 조회 가능

curl -X GET http://localhost:5984/db_name/user_123

3. 전체 문서 조회 : include_docs=true를 줄  경우 실제 문서 내용도 같이 나옴

curl -X GET http://localhost:5984/db이름/_all_docs?include_docs=true

 

4. 전체 DB 목록 확인

curl -X GET http://localhost:5984/_all_dbs

 

동작 메서드 URL 예시 비고

문서 생성 POST /db _id 생략 시 자동 생성
문서 읽기 GET /db/doc_id  
문서 수정 PUT /db/doc_id _rev 필요
문서 삭제 DELETE /db/doc_id?rev=rev_id _rev 필요
조건 쿼리 POST /db/_find Mango Query JSON 문법 사용

CouchDB 특수 구성 요소

구성 요소 설명 관련 URI/포트 주요 기능/역할

_all_dbs 존재하는 모든 데이터베이스 목록 반환 /_all_dbs 데이터베이스 탐색
_uuids 고유 UUID 생성 엔드포인트 /_uuids 문서 ID 자동 생성 시 활용
_session 인증/세션 관리용 /_session 로그인, 쿠키 기반 인증
_replicate 데이터베이스 간 복제 설정 /_replicate 단방향/양방향 복제
_changes DB 변경 내역 스트림 확인 /{db}/_changes 실시간 동기화 기반
_bulk_docs 여러 문서를 한 번에 삽입/갱신 /{db}/_bulk_docs 대량 작업 처리
_design/ 디자인 문서 (Design Document) /{db}/_design/{ddoc} View, Show, List, Validate 정의
_view/ MapReduce 기반 쿼리 실행 /{db}/_design/{ddoc}/_view/{view} 인덱싱 및 질의
_show/ 문서 조회용 HTML/JSON 변환기 /{db}/_design/{ddoc}/_show/{func} 사용자 지정 출력
_list/ View 결과 커스터마이징 /{db}/_design/{ddoc}/_list/{func}/{view} View 출력 포맷 제어
_rewrite/ 사용자 정의 URI 라우팅 /{db}/_design/{ddoc}/_rewrite/{path} RESTful API 설계 지원
_security DB별 접근제어 설정 /{db}/_security 읽기/쓰기 사용자 제어
_users 사용자 계정이 저장된 DB /_users 인증 사용자 계정 저장소
_dbs_info 다수 DB 상태 정보 제공 /_dbs_info DB 존재 여부, 크기 등
_up CouchDB 서버 상태 확인용 /_up 헬스체크 용도 (200 OK 여부)
_nodes/ 클러스터 노드 정보 /_nodes/{node} 분산 환경에서 노드 관리
_membership 클러스터 구성원 목록 /_membership 현재 클러스터 구성 확인
_active_tasks 실행 중인 백그라운드 작업 확인 /_active_tasks 복제, 컴팩션, 인덱스 빌드 등
_stats 내부 통계 정보 /_stats 요청 수, 응답 시간 등 메트릭
_log CouchDB 서버 로그 보기 /_log 실시간 로그 확인
_config CouchDB 구성 설정 /_config 실시간 설정 조회 및 수정

CouchDB Injection

CouchDB 환경에서 Injection은 주로 사용자 입력이 필터링 없이 뷰(view) 또는 쿼리 구조 내에서 사용될 때 발생한다.

SQL Injection과 달리 JavaScript 기반 MapReduce 쿼리를 조작 하거나, HTTP API호출을 악용하는 방식이다..

  • MapReduce 뷰 조작
  • Slector 기반 Mango 쿼리 조작
  • _find 앤드포인트 조작
  • Design Document 변조
  • 연산자 기반 공격

연산자를 통한 공격 기법

공격 기법 명 사용 연산자 공격 방식 악용 예시 상세 설명 대응 방법

인증 우회 $ne (not equal) 비밀번호가 null이 아니면 조건 만족 { "username": "admin", "password": { "$ne": null } } admin의 패스워드가 어떤 값이든 존재하면 인증 통과 $ 키 사용 제한, password 타입 검사
권한 우회 $gt, $gte 권한 필드를 상위로 조건 조작 { "role_level": { "$gt": 0 } } role_level이 1 이상이면 관리자 페이지 접근 우회 필드 값 범위 화이트리스트화
관리자 식별 $in 여러 값 중 하나만 일치하면 조건 만족 { "username": { "$in": ["admin", "root"] } } 관리자 계정명을 추측하여 정보 유출 가능 사용자 정의 목록 금지
정보 검색 $regex 정규표현식 기반 유사 문자열 검색 { "email": { "$regex": ".*@gmail.com" } } 이메일 패턴 탐색 및 타겟 선별 (피싱에 악용) 정규표현식 필드 차단
논리 조합 우회 $or, $and 둘 중 하나만 참이면 조건 통과 { "$or": [{ "role": "admin" }, { "access": true }] } 약한 필드를 묶어 인증 우회 시도 논리 연산자 제한
ID 무차별 대입 $nin (not in) 특정 필드 제외 조건으로 정보 필터링 { "role": { "$nin": ["user"] } } 일반 사용자를 제외한 계정 모두 조회 요청자 역할과 DB 접근 논리 일치시킴
비정상 필터 오용 $exists, $type 필드 존재 여부나 타입 조건 사용 { "password": { "$exists": true } } 패스워드 필드가 있는 계정만 검색하여 타겟 확인 쿼리 검증 로직 삽입
쿼리 우회 및 서버 과부하 $not NOT 조건으로 필터 무력화 { "is_active": { "$not": { "$eq": false } } } 예상과 반대되는 조건으로 필터 우회 쿼리 조합의 depth 제한
DoS 또는 탐색 공격 $where, $expr (MongoDB 스타일) JavaScript 조건 또는 함수 기반 필터 { "$where": "this.password.length > 0" } 서버 자원 과부하 유발 또는 조건 탐색 (CouchDB는 일부 제한적) 쿼리 형태 분석 및 제한

 

공격 표면 탐색

1. 포트 스캔

nmap -p 5984 --script http-couchdb-info <target>

2. 익명 접근 여부 확인

curl http://<target>:5984/_all_dbs

3. 취약한 Desig 문서 확인

curl http://<target>:5984/dbname/_design/<doc>

보호대책

  1. 인증
    • _users DB와 _config API접근에 인증 절차가 필요하도록 설정
  2. CORS 설정
    • origin, credentials 제한
  3. admin party 차단
    • 설치 직후 admin party 상태를 차단
  4. _users, _replicator 권한 제한
    • 일반 사용자가 쓰기 불가하도록 제한
  5. 입력 검증
    • selector 쿼리 조작 방지
  6. 최신 버전 유지

'Web > Web Hacking Techniques' 카테고리의 다른 글

Redis (Redis Injection)  (0) 2025.05.19
MongoDB (MongoDB Injection)  (0) 2025.05.16
DOM Clobbering  (0) 2025.05.14
Flask Debugger (Console Mode) Vulnerabilities  (0) 2025.05.13
브라우저의 URL 정규화 방식(Proxy Tool Bypass)  (0) 2025.05.13

댓글