Apache CouchDB (CouchDB Injection)
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 쿼리 조작 방지
- 최신 버전 유지
'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 |
댓글