NoSQL 주입 공격 이해 및 방어 방법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
인프라/DevOps/보안
대상자
- 대상: 웹 개발자, 보안 엔지니어, DevOps 엔지니어
- 난이도: 중급(보안 취약점 분석 및 방어 전략 이해 필요)
핵심 요약
- NoSQL 주입 공격은 사용자 입력이 검증되지 않은 채 NoSQL 쿼리에 삽입될 때 발생하며, 인증 우회, 데이터 조작 등의 위협을 유발합니다.
- MongoDB는 주요 NoSQL 데이터베이스로,
$eq
,$ne
,$regex
등 특수 연산자 사용이 공격 유발 요인입니다. - 방어 전략:
- 사용자 입력 검증 및 정제
- 파라미터화된 쿼리 사용
- 서버측 JavaScript 비활성화(
--noscripting
,security.javascriptEnabled: false
)
섹션별 세부 요약
1. NoSQL 데이터베이스 개요
- NoSQL 특징: 유연한 스키마, 대규모 데이터 처리, JSON/BSON 기반 저장(예: MongoDB)
- 주요 유형:
- 문서 기반: MongoDB
- 키-값 저장소: Redis
- 그래프 기반: ArangoDB
- 시간 시리즈: InfluxDB
2. NoSQL 주입 공격의 위협
- 공격 방식:
- 인증 우회, 데이터 읽기/수정, 스크립트 실행, 관리자 권한 획득
- 예시 공격 코드:
```json
{"username": "admin", "password": {"$regex": ".*", "$options": "i"}}
```
- 차별점:
- SQL과 달리 JSON 형식 사용, 스키마 유연성으로 인해 공격이 더 쉬움
3. 취약점 식별 방법
- 테스트 대상: 로그인 폼, 검색창, HTTP 헤더, 쿠키
- 테스트 방법:
- 특수 문자(
'
,"
,\
,{
,}
) 및 MongoDB 연산자($eq
,$in
) 삽입 - 보안 도구: NoSQLMap 사용
4. 방어 전략
- 입력 검증:
- 정규 표현식 적용, 불필요한 특수 문자 제거
- 쿼리 파라미터화:
- ORM 라이브러리(예: Mongoose) 사용, 쿼리 빌더 활용
- 접근 제어:
- 최소 권한 원칙 적용, 불필요한 액세스 제한
- MongoDB 보안 설정:
--noscripting
플래그 사용,security.javascriptEnabled: false
설정
결론
- NoSQL 주입 방어는 입력 검증, 파라미터화, 보안 설정 조합으로 효과적입니다.
- MongoDB 기반 애플리케이션은
$regex
등 연산자 사용 시 특별한 주의가 필요하며, NoSQLMap과 같은 도구를 활용해 취약점을 정기적으로 점검해야 합니다.