본문 바로가기
Security, SecOps

[Security] SQL 인젝션

by BenKangKang 2024. 6. 8.

 

사이드 프로젝트로 만든 서비스에 에러 로그가 올라와 확인했는데 누군가 취약점을 파악하기 위한  악의적인 시도를 한 것으로 확인되었다.

SQL 인젝션 공격을 시도했는데 다행히 대응이 되어 있어서 문제는 없었다. 보안 관련 이슈가 직접적으로 발생한 것은 처음이라 기록한다.

악의적인 요청

SQL 인젝션?

웹 애플리케이션의 데이터베이스와 상호 작용하는 SQL 쿼리를 조작하여 악의적인 SQL 명령을 삽입하고 실행할 수 있도록 하는 보안 취약점입니다. SQL 인젝션 공격은 데이터 유출, 데이터베이스 조작, 관리자 권한 탈취

 

 

  • /api/v1/products/-1%20OR%202+106-106-1=0+0+0+1
    • 이 공격은 -1 OR 2 + 106 - 106 - 1 = 0이라는 조건을 만들어, 논리적으로 참인 구문을 삽입하여 쿼리를 조작하려는 시도입니다.
  • /api/v1/products/-1'%20OR%202+53-53-1=0+0+0+1%20--
    • 이 공격은 -1' OR 2 + 53 - 53 - 1 = 0 --이라는 구문을 만들어, 뒤에 있는 SQL 명령을 주석 처리하여 무효화시키려는 시도입니다.
  • /api/v1/products/-1'%20OR%202+992-992-1=0+0+0+1%20or%20'8rfROn0u'='
    • 이 공격은 -1' OR 2 + 992 - 992 - 1 = 0 OR '8rfROn0u'='이라는 구문을 삽입하여, 항상 참인 조건을 만들어 쿼리를 조작하려는 시도입니다.
  • /api/v1/products/710%22XOR(71*if(now()=sysdate(),sleep(15),0))XOR%22Z
    • 이 공격은 710" XOR (71 * IF(NOW()=SYSDATE(), SLEEP(15), 0)) XOR "Z 구문을 삽입하여 데이터베이스 서버가 현재 시간을 확인하고 15초 동안 지연되게 하는 시도입니다.
  • /api/v1/products/71qIuTR56y'%20OR%20317=(SELECT%20317%20FROM%20PG_SLEEP(15))--
    • 이 공격은 71qIuTR56y' OR 317 = (SELECT 317 FROM PG_SLEEP(15)) -- 구문을 삽입하여 PostgreSQL 데이터베이스 서버가 15초 동안 지연되게 하는 시도입니다.
  • /api/v1/products/71'%22
    • 이 공격은 71'" 구문을 삽입하여 쿼리를 중단시키고, 이후의 SQL 명령을 주석 처리하려는 시도입니다.

 

대응법

1. ORM(Object Relational Mapping) 

ORM은 데이터베이스 쿼리를 추상화했기 때문에 직접적인 SQL 쿼리를 작성하지 않는다. JPA를 사용하고 있기 때문에 이미 적용되어 있다.

 

2. Prepared Statements (미적용)

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute(['username' => $username, 'password' => $password]);
$rows = $stmt->fetchAll();

 

Prepared Statements 를 적용하여 데이터와 쿼리를 분리해 인젝션을 방지할 수 있다. 

 

3. 서버 에러 추상화

에러 발생 원인은 따로 로깅하고 요청 응답에는 표시하지 않는다.

 

보안 중요성은 비교적 낮은 서비스지만 권한을 탈취 당하지 않으려면 최소한의 방지책이 적용되어 있어야한다. 보안이 중요한 서비스라면 클라우드 프로바이더가 제공하는 WAF 와 같은 서비스를 도입해 공격을 감지 및 방지하는 것이 좋겠다.

 

댓글