SQL injection

2026. 3. 28. 00:20·Web Hacking Practice/취약점 진단

점검 목적

- 웹 애플리케이션 내 SQL문으로 해석될 수 있는 입력값 허용을 차단하고 운영 중인 데이터베이스에 대한 
비인가된 접근 및 조작을 방지하여, 데이터 무결성과 보안성을 확보하기 위함

 

판단 기준

- 양호 : 임의로 작성된 SQL 쿼리 입력에 대한 적절한 검증을 통해 비정상적인 쿼리가 실행되지 않도록 
하는 경우

 

- 취약 : 임의로 작성된 SQL 쿼리 입력에 대한 검증이 이루어지지 않아 비정상적인 쿼리가 실행되는 경우

 

조치 방법

- 소스코드 내 SQL 쿼리를 입력값으로 받는 함수나 코드를 사용할 경우, 임의의 SQL 쿼리 입력에 대한 
검증 로직을 구현하여 서버에 검증되지 않는 SQL 쿼리요청 시 에러 페이지가 아닌 정상 페이지가 
반환되도록 필터링 처리하고 웹방화벽에 SQL 인젝션 관련 룰셋을 적용하여 SQL 인젝션 공격을 차단함

 

 

점검 방법

- Step 1) 사용자 입력값 조건에 따른 참, 거짓 SQL 쿼리를 삽입하여, 응답의 변화(응답시간, 에러메시지, 응답 내
용 등) 유무 확인

 

 

Step 2) 인증 페이지(로그인, 비밀번호 검증 등) 내 참이 되는 SQL쿼리를 삽입하여 우회 유무 확인

 

 

 

조치 방법

 

1. SQL 쿼리 내 사용되는 문자열의 유효성을 검증하는 로직 구현
2. 아래와 같은 특수문자에 대하여 사용자 입력값으로 지정 금지

 

 

3. Prepared Statements를 사용하여 사용자 입력과 SQL 쿼리를 분리하여 처리
4. 시스템에서 제공하는 에러 메시지 및 DBMS에서 제공하는 에러코드가 노출되지 않도록 예외처리
5. 웹 방화벽(WAF)에 대하여 SQL Injection 관련 룰셋 추가

 

자바 특수문자 필터링 로직

 

public static String sanitize(String input) {
 if (input == null) {
 return null;
 }
 // 특수문자 및 키워드들을 공백으로 치환
 String[] sqlKeywords = {"SELECT", "UNION", "INSERT", "UPDATE", "DELETE", "DROP", "--"};
 String pattern = "(?i)\\b(" + String.join("|", sqlKeywords) + ")\\b|['\"\\\\;()<>#/*!]";
 Pattern regex = Pattern.compile(pattern + "|--");
 Matcher matcher = regex.matcher(input);
 return matcher.replaceAll(" ");
}
... String sanitizedInput = sanitize(userInput);

 

Prepared Statement 로직 

 

String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, userInput);
... ResultSet resultSet = preparedStatement.executeQuery();

 

파라미터 바인딩 : 쿼리를 실행할 때, 쿼리 문자열과 사용자 입력값(파라미터)을 분리하여 처리하는 기법. 데
이터베이스는 쿼리 문자열을 미리 파싱하고 컴파일하며, 쿼리 실행 시점에 파싱된 쿼리 문자열에 파라미터를 
바인딩하여 데이터를 전달하므로 데이터베이스는 파라미터를 데이터로만 인식함

 

ORM(JPA-Hibernate) 파라미터 바인딩 사용 예시

 

public class ItemService {
 @PersistenceContext
 private EntityManager em;
 public List<Item> findItemsByUserInput(String userInput) {
 
 // JPQL을 사용하여 SQL Injection 방지
 String jpql = "SELECT i FROM Item i WHERE i.itemID > :userInput";
 Query query = em.createQuery(jpql, Item.class);
 query.setParameter("userInput", userInput);
 return query.getResultList();
 }
}

 

 

 

 

 

'Web Hacking Practice > 취약점 진단' 카테고리의 다른 글

에러 페이지 정보 노출  (0) 2026.03.28
디렉터리 인덱싱  (0) 2026.03.28
SSTI injection  (0) 2026.03.26
XXE(XML External Entities) injection  (0) 2026.03.26
XPath injection  (0) 2026.03.26
'Web Hacking Practice/취약점 진단' 카테고리의 다른 글
  • 에러 페이지 정보 노출
  • 디렉터리 인덱싱
  • SSTI injection
  • XXE(XML External Entities) injection
Rookie_W
Rookie_W
Rookie 님의 블로그 입니다. IT 관련 공부(정보보안)를 하는 학생입니다. 공부하는 과정을 블로그에 남기고자 개설하였습니다.
  • Rookie_W
    Rookie 공부 노트
    Rookie_W
  • 공지사항

    • Rookie의 (정보보안) 공부 블로그 입니다.
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 글쓰기
    • 관리 페이지
    • 분류 전체보기 (120)
      • Programming (8)
        • Python (8)
      • IT 보안 (2)
        • ASCII Table(아스키 코드표) (1)
        • 개념 정리 (1)
      • 정보보안기사 (8)
        • 일반 (0)
        • 시스템 보안 (0)
        • 네트워크 보안 (2)
        • 웹 보안 (0)
        • 법률 (0)
      • Web Hacking Practice (57)
        • Webgoat (1)
        • 취약점 진단 (25)
        • 웹 모의해킹 (29)
        • portswigger web security ac.. (2)
      • Security Analysis & Researc.. (0)
      • Certifications (14)
        • 네트워크 관리사 (13)
        • cbt 오답노트 (1)
      • Education (8)
        • SK Shields Rookies (8)
      • CTF (13)
        • 써니나타스 (11)
        • CTFtime (2)
      • Markdown 사용법 (0)
      • Hacking tools (3)
      • Deep Learning & Machine Lea.. (5)
        • 데이터수집 (1)
        • 기초통계 (1)
        • 데이터전처리 (1)
        • 머신러닝_지도학습 (1)
        • 머신러닝_비지도학습 (1)
      • 라우터 (1)
      • 관리자전용 (0)
  • 링크

    • Github
    • Dreamhack
  • 인기 글

  • 태그

    nos
    SK쉴더스루키즈
    민감한 데이터 노출
    네트워크
    파일업로드
    루키즈34기
    WEB
    linux
    정보수집
    XSS
    문제풀이
    모의해킹
    sql injection
    Web-3
    OS injection
    정보보안기사
    루키즈
    보안대책
    써니나타스
    File Inclusion
  • hELLO· Designed By정상우.v4.10.5
Rookie_W
SQL injection
상단으로

티스토리툴바