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>
보호대책
- 인증
- _users DB와 _config API접근에 인증 절차가 필요하도록 설정
- CORS 설정
- origin, credentials 제한
- admin party 차단
- 설치 직후 admin party 상태를 차단
- _users, _replicator 권한 제한
- 일반 사용자가 쓰기 불가하도록 제한
- 입력 검증
- selector 쿼리 조작 방지
- 최신 버전 유지