주신 문자열은 SQL 인젝션(payload) 형태입니다. 구성과 동작, 보안 위험 및 방지 대책을 요약해 드립니다.
무엇을 의미하는지
- 입력: -1' OR 2+519-519-1=0+0+0+1 or 'DMkNbd5a'=''
- 해석: 입력 중 "-1'"는 문자열 리터럴을 닫아 SQL 문법을 깨고, 그 뒤의 OR 절이 쿼리의 조건을 항상 참(True)으로 만들려는 시도입니다.
- 산술식 단순화: 2+519-519-1 = 1, 0+0+0+1 = 1 이므로 비교는 1 = 1 이 되어 항상 참입니다.
- 결과: 원래 의도된 인증/검색 조건이 무시되고 WHERE 절 등이 항상 참이 되어 데이터 유출·우회(예: 로그인 우회, 모든 행 반환 등)가 발생할 수 있습니다.
보안 위험
- 인증 우회, 데이터 노출, 데이터 변경/삭제, 권한 상승 등 심각한 보안 사고로 이어질 수 있습니다.
- 특히 사용자 입력을 직접 쿼리에 삽입하는 경우 취약합니다.
권장 방지책 (우선순위)
- 준비된 문(Prepared Statements) / 파라미터 바인딩 사용
- SQL과 데이터(파라미터)를 분리하여 인젝션을 원천 차단합니다.
- 입력 검증(화이트리스트) 및 길이 제한
- 기대하는 형식(숫자, 이메일 등)만 허용하고 허용 길이를 제한합니다.
- 최소 권한 원칙
- DB 계정에 필요한 권한만 부여(예: 읽기 전용, DDL 권한 제한).
- 출력 이스케이프/인코딩
- 쿼리 외 다른 맥락에서 사용자 입력을 출력할 때 적절히 이스케이프합니다.
- 웹 방화벽(WAF) 및 로깅/모니터링
- 의심스러운 패턴 탐지 및 접근 차단, 시도 기록으로 이상 징후 추적.
간단한 예시 (안전한 방식)
PHP(PDO):
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$userInput]);
Python(psycopg2):
cur.execute("SELECT * FROM users WHERE id = %s", (user_input,))
Java(JDBC):
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
ps.setInt(1, userId);
ResultSet rs = ps.executeQuery();
추가 권장
- 기존 코드에서 문자열 연결로 쿼리 생성하는 부분을 전부 찾아 파라미터화하세요.
- 정기적인 보안 테스트(정적분석, 동적침투테스트)를 수행해 취약점을 발견·보완하세요.
요약
- 주신 입력은 SQL 인젝션 시도로, 산술 비교를 이용해 조건을 항상 참으로 만들어 쿼리 우회를 노립니다.
- 근본 해결은 준비된 문과 입력 검증이며, 최소 권한·로깅·WAF 등 다층 방어가 필요합니다.