🔓 보안 취약점 분석 보고서

Security Test App - 블랙박스 모의해킹 결과

📋 대상 시스템 정보

URL http://localhost:3000
기술 스택 Ruby on Rails 7.1 / PostgreSQL 15
테스트 일시 2026-01-18
테스트 유형 블랙박스 모의해킹 (Black-box Penetration Testing)

📊 취약점 요약

2
Critical
2
High
1
Medium
5
총 발견
# 취약점 심각도 CVSS 행정안전부 가이드
1 SQL Injection Critical 9.8 입력데이터 검증 및 표현
2 Stored XSS High 8.1 입력데이터 검증 및 표현
3 Mass Assignment High 8.8 보안기능 - 부적절한 인가
4 CSRF 보호 비활성화 Medium 6.5 보안기능 - CSRF
5 인증 우회 (쿠키 조작) Critical 9.1 보안기능 - 적절한 인증 없는 중요기능 허용

🔍 상세 분석

Critical 1. SQL Injection

위치: POST /login

설명: 로그인 폼의 email 필드에서 SQL 구문이 그대로 실행되어 인증을 우회할 수 있습니다.

email=test@example.com' OR '1'='1&password=wrong

✅ 결과: 비밀번호 검증 없이 로그인 성공 (302 → /users)

HTTP/1.1 302 Found
location: http://localhost:3000/users
set-cookie: remember_token=5; path=/
권고: Prepared Statement 또는 Parameterized Query를 사용하여 SQL 쿼리를 안전하게 처리하세요.

High 2. Stored XSS (Cross-Site Scripting)

위치: POST /users (회원가입) → GET /users (회원목록)

설명: 회원가입 시 이름 필드에 스크립트를 삽입하면 회원 목록 페이지에서 스크립트가 실행됩니다.

user[name]=<script>alert('XSS')</script>

✅ 결과: 스크립트가 필터링 없이 HTML에 렌더링됨

<td><script>alert('XSS')</script></td>
권고: 출력 시 HTML 이스케이프를 적용하세요. Rails에서 raw 또는 html_safe 대신 기본 출력을 사용하세요.

High 3. Mass Assignment (권한 상승)

위치: POST /users

설명: 회원가입 시 숨겨진 파라미터 is_admin=true를 추가하면 관리자 권한을 획득할 수 있습니다.

user[email]=test@example.com&user[name]=Test&user[password]=test&user[is_admin]=true

✅ 결과: 일반 사용자가 관리자 권한 획득

<td>AdminTest</td>
<td>✅</td> <!-- 관리자 표시 -->
권고: Strong Parameters에서 is_admin 같은 민감한 필드를 명시적으로 제외하세요.

Medium 4. CSRF 보호 비활성화

위치: 모든 POST 요청

설명: CSRF(Cross-Site Request Forgery) 토큰 검증이 비활성화되어 있어 외부 사이트에서 요청을 위조할 수 있습니다.

# authenticity_token 없이 요청
curl -X POST http://localhost:3000/users -d "user[email]=csrf@test.com..."

✅ 결과: CSRF 토큰 없이 요청 처리됨

HTTP/1.1 302 Found (회원가입 성공)
권고: protect_from_forgery with: :exception을 활성화하세요.

Critical 5. 인증 우회 (쿠키 조작)

위치: remember_token 쿠키

설명: 세션 토큰이 단순 사용자 ID로 설정되어 있어 쿠키 값만 변경하면 다른 사용자로 로그인할 수 있습니다.

Cookie: remember_token=1 # 또는 다른 사용자 ID

✅ 결과: 해당 ID의 사용자로 인증됨

remember_token=1 → 회원 목록 접근 성공
remember_token=2 → 다른 사용자로 접근 성공
권고: 암호화된 세션 토큰을 사용하고, httponlysecure 플래그를 설정하세요.

✅ 권고사항 요약

취약점 권고 조치
SQL Injection Prepared Statement / Parameterized Query 사용
Stored XSS 출력 시 HTML 이스케이프 (raw 대신 기본 출력)
Mass Assignment Strong Parameters에서 민감 필드 제외
CSRF protect_from_forgery 활성화
인증 우회 암호화된 세션 토큰 + httponly/secure 플래그

📚 참고 기준