본문 바로가기
Hacking

🧥 SQL Injection을 알아보자!

by Yubin Heo 2020. 4. 23.

SQL Injection 이란? 응용 프로그램 보안 상의 허점의도적으로 이용하여,

개발자가 생각지 못한 SQL문을 실행되게 함으로써

데이터베이스를 비정상적으로 조작하는 공격방법입니다.

 

그렇다면 SQL이 무엇일까요? 그전에 알아야 하는 용어가 바로 query인데요!
query란 직역하면 질문, 질의 라는 뜻입니다. 즉 파일의 내용을 알기 위해서 반드시 어떠한 내용을 코딩해야 하는데 그때 그런 코드나 key를 쿼리라고 합니다!

 

💨 SQL Injection 코드 알아보기

https://noirstar.tistory.com/264

위의 사진은 일반적으로 로그인 시 많이 사용되는 SQL 구문입니다. 

해당 구문에서 입력값에 대한 검증이 없음을 확인, 

악의적인 사용자가 SQL 구문을 주입한다.

or 1=1 즉, 1은 1이므로 항상 참이 됩니다.

그렇게 해서 뚫리게 되는겁니다.

 

💨 SQL Injection 실습

우선 Let's Learing PHP 강의에서 만들었던 php 데이터베이스를 준비했습니다.

이 데이터베이스 안에 user 테이블엔 아래와 같은 행들을 넣어놓았습니다.

 

이제 SQL을 아래와 같이 입력해 줍니다.

select password from user where id like 'itsme' or 1=1

위 코드는, user 테이블에서 password 필드값을 id가 i 이거나 1=1을 충족하는 행을 가져오겠단 뜻 입니다.

우선 where ~~ 를 보겠습니다. 

id의 값이 itsme 이거나, 1=1 인 행을 가져오겠다는 의미 입니다.

근데, where은 조건이 참인 행을 가져오게 되는데,

여기에 1=1을 넣어버리면 앞에가 blog.hyb.kr이던, phpisgod 이던

의미가 없어져 버립니다 왜냐구요? 1=1은 항상 참이니까요.

 

그렇게 해서 위 SQL 구문을 삽입하면, 

 

이런 결과가 나오게 됩니다.

그냥 테이블 안에 있는 password 행이 싹다 나와버렸죠?

 

물론 SELECT 구문만 되는 것은 아닙니다. delete도 모두 적용되겠죠?

아래와 같은 SQL문을 삽입해 보겠습니다.

 

DELETE FROM `user` WHERE id='nodejsisgod' or 1=1;

 

ㅋㅋ 결과가 예측되시나요?

 

 

하나도 빠짐없이 모든 행이 삭제되버렸습니다. (아까운 것들;;)

 

 

 

💨 SQL Injection 방어하기 (PHP, Node.js)

해킹법만 알려주면 뭔가 심한 욕설(?)을 선물받을 것 같아서,

언어별로 방어하는 법도 알려드리겠습니다.

언어별이라기 보단 제가 아는 언어 두개로 준비했습니다

 

PHP7 : 쿼리에 삽입될 변수에 mysqli_real_escape_string() 함수를 씌워줍니다.

$e_password = mysqli_real_escape_string($conn, $password);

 

Node.JS : 가장 간단한 방법으로는 테이블에 삽입될 필드를 ? 로 처리하는 방법입니다.

 

const sql = `insert into cloud(hi, i, am, hyb) values(?, ?, ?, ?);`;
const params = [hi, i, am, hyb];

connection.query(sql, params, function (err, rows) {
    //...
});

 

오늘은 이렇게 SQL Injection에 대해서 알아봤습니다.

어떻게 보면 해킹이란거 정말 쉽게 느껴질 수도 있는데,

대부분의 사이트는 SQL Injection을 하게 내버려 두지 않습니다.

그리고 패스워드와 같은 중요한 정보들은 쉽게 볼 수 없도록 암호화 합니다.

 

다음에 기회가 된다면 더 어려운 Injection인 Blind Injection에 대해서 알아보도록 하겠습니다.

댓글