Web/Web Hacking Techniques

Apache CouchDB (CouchDB Injection)

g2h 2025. 5. 15. 16:02

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. 최신 버전 유지