article thumbnail image
Published 2022. 11. 13. 19:07

SQL Injection이란?

 

SQL 인젝션(SQL 삽입 공격)은 악의적인 사용자가 데이터베이스와 연동된 웹 애플리케이션에서 조작된 질의(쿼리)문을 주입하여 웹 서비스에 대한 DB정보를 열람또는 조작할 수 있는 하나의 취약점입니다. 인젝션 공격은 OWASP Top10 중 첫 번째에 속해 있었으며, 공격이 비교적 쉬운 편이고 공격에 성공할 경우 큰 피해를 입힐 수 있는 공격입니다.

 

 

OWASP : 에 관한 정보노출, 악성 파일 및 스크립트, 보안 취약점 등을 연구하는 회사로 보안에 큰 영향을 줄 수 있는 보안 취약점목록을 발표합니다.

 

 

 

OWASP에서 발표한 10가지의 웹 보안위협

 

OWASP Top Ten | OWASP Foundation

The OWASP Top 10 is the reference standard for the most critical web application security risks. Adopting the OWASP Top 10 is perhaps the most effective first step towards changing your software development culture focused on producing secure code.

owasp.org

대표적인 사례

 

‘여기어때’ 고객정보 유출…“‘SQL인젝션’ 공격 흔적, 금전 협박”

숙박 O2O(Online to Offline) 서비스 ‘여기어때’에서 해킹으로 고객정보가 대량 유출됐다. 최근 ‘여기어때’를 이용한 고객들에게 불쾌한 내용의 문자 메

www.bloter.net

 

뽐뿌가 당한 SQL인젝션 해킹, 어떻게 막을 수 있나?

지난 11일 온라인 커뮤니티 사이트 뽐뿌가 해킹으로 인해 회원 190만 명의 아이디와 비밀번호 등이 유출된 가운데 해커가 해킹 공격에 사용한 SQL 인젝션 기법이 이슈가 되고 있다. SQL(Structured Query

www.boannews.com

 

공격방식

비밀번호와 상관없이 로그인이 된다

간단한 예시로 아래와 같이 우선 SQL 문법을 활용하여 공격하는 방식이라고 이해하면 됩니다.

 

 

그렇다면 이러한 방식이 왜 실행될 수 있었을까?

  • 실제 실행되는 SQL 질의문 ( 사용자의 입력값을 그대로 전달받아 실행 )
SELECT * FROM Users WHERE id = 'TESTID@gmail.com' AND password='123' OR "1"="1"
//혹은
SELECT * FROM Users WHERE id = '' OR 1=1'--AND password='123'

123 OR 1=1 로 전달한 비밀번호가 SQL 조건에 그대로 들어가면서 1=1이라는 참조건과 OR(한쪽이라도 true면 전체 조건문이 true) 를 통해 password 부분이 무조건 TRUE 를 반환하게 되고 이때 아이디만 일치하거나 아이디 자체에 집어넣게 된다면 사용자 정보 혹은 관리자 계정(모든 데이터의 최상단에 있는 계정으로 로그인)을 알 수 있게 됩니다.

 

  • 실제 서버쪽에서 처리하는 SQL 쿼리문 (예시)
const sql =
    "select * from Users where id='" +
    QueryString.id +
    "' AND password ='" +
    QueryString.password +
    "'";
con.query(sql, function (err, result) {
    if (err) throw err;
    res.send(result);
  });

이러한 방식을 논리적 오류를 이용하였다해서 오류 기반 SQL 주입(Error based SQL Injection)이라고 합니다

 

이 외에도

  1. UNION 기반 SQL 주입(UNION-Based SQL Injection) → UNION 명령을 이용
  2. 부울(참,거짓) 기반 SQL 주입([Blind] Boolean-Based SQL Injection) → 참과 거짓의 응답을 이용(로그인 , 아이디 중복확인)
  3. 시간 기반 SQL 주입 → 마찬가지로 참과 거짓의 응답을 이용하는 기법 SLEEP, BENCHMARK
  4. 저장된 프로시져 SQL 주입 → 저장 프로시저를 이용
  5. 다량 SQL 주입

등등이 있습니다.

 

대응 방식

위 예시를 바탕으로..

//in Node.js
const sql =
    "select * from Users where id='" +
    req.params.id +
    "' AND password ='" +
	  req.params.password +
    "'";
con.query(sql, function (err, result) {
    if (err) throw err;
    res.send(result);
  });

이러한 방식을 사용하면 안된다 ( 파라미터를 직접 코딩 )

 

Parameter Binding (필수적으로 사용할 필요가 있다)

(프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는 행위를 의미)

 

bind variable(PreparedStatement in JAVA)

“'123' OR "1"="1"” 문장을 돌면서 바꿔준다 + 효율성

let id = req.params.id; //QueryString.id
let password = req.params.password; //QueryString.password
const sql = 'SELECT * FROM User WHERE id = ? AND password = ?';
dbconn.query(sql, [id , password], function(err, results, field){
	...
});
//자동으로 파싱해준다
  1. 자동으로 SQL의 ‘?’의 순서와 배열 순서가 일치하도록 매핑되어 SQL이 실행됨
  2. SQL 질의문에 대해서 한번만 실행시키고 이후 값만 바꿔 계속 실행될 수 있음

서버에서 발생한 에러메시지를 클라이언트에서 노출시키지 않을 것 ( 정보 노출 ) 

  • 어떤 dbms를 쓰는지, 버전이 무엇인지 등 이러한 부분이 노출되어 악의적으로 사용될 수 있다

입력 값에 대한 검증

  • 하나의 대응 방식이 될 수 있다

 

참고자료

 

 

SQL 주입 공격(SQL Injection Attack)

SQL 주입(SQL Injection) 웹 해킹의 가장 대표적인 사례로서 웹 소스의 보안 취약점을 이용하여 데이터베이스에 요청하는 SQL을 임의의 값으로 변조하여 의도된 동작과는 다른 동작을 하게 하여 원하

secstudy.tistory.com

 

SQL Injection 이란? (SQL 삽입 공격)

1. SQL Injection 1.1 개요 Ÿ SQL InjectionSQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는

noirstar.tistory.com

 

JPA - 파라미터 바인딩

🟡 이름 기준 파라메터 이름 기준 파라메터는 파라메터를 이름으로 구분하는 방법이다. 이름 기준 파라메터 앞에는 : 를 붙힌다. String userNameParam = "Binsoo"; TypedQuery query; query = em.createQuery("SELECT m

soobindeveloper8.tistory.com

 

'TIL > 개념정리' 카테고리의 다른 글

vanilla js로 간단하게 spa 구현  (0) 2023.01.08
WebPack을 사용하는 이유와 정리  (0) 2023.01.07
this란  (1) 2022.11.02
호이스팅이란?  (0) 2022.10.31
실행 컨텍스트란?  (0) 2022.10.31
복사했습니다!