SQL Injection
💣

SQL Injection

Description
SQL Injection, Blind SQL Injection
category
WebHacking
Tag
WEB Hacking
Date
Mar 15, 2024 04:05 AM

SQL Injection이란?

RDBMS에서는 조회 및 관리를 위해 SQL이란 언어를 사용합니다.
SQL Injection은 정상적인 SQL 구문 사이에 악의적인 SQL구문을 삽입하여 데이터베이스를 조회, 삭제, 수정할 수 있는 취약점입니다.
Blind SQL Injection도 존재하는데 해당 공격은 수많은 쿼리를 보내 임의의 데이터를 알아내는 방식입니다.
 
현재는 대부분의 프레임워크에서 ORM을 지원하기 때문에 해당 취약점은 줄어들고 있습니다.

Example(SQL Injection)

아래 코드는 로그인 기능을 하는 쿼리 입니다.
USER 테이블에서 user_id가 ‘bobong’이고 user_pw가 ‘bobong_password’인 데이터를 조회합니다.
SELECT * FROM USER WHERE user_id='bobong' and user_pw='bobong_password'
 
하지만 이러한 쿼리는 SQL 인젝션에 취약합니다. 만약 사용자가 비밀번호 대신 ' OR '1'='1을 입력하면, 쿼리는 다음과 같이 변합니다.
SELECT * FROM USER WHERE user_id='bobong' and user_pw='' OR '1'='1'
 
위 쿼리는 '1'='1' 조건으로 인해 항상 참이 되어, 사용자 id와 상관없이 모든 사용자 데이터를 반환하게 됩니다. 해당 방법 뿐만 아니라 UNION, Subquery 등을 사용하여 다양한 방식으로 Injection이 가능합니다.

Example(Blind SQL Injection)

아래 코드는 로그인 기능을 하는 쿼리 입니다.
SELECT * FROM USER WHERE user_id='bobong' and user_pw='bobong_password'
 
Blind SQL Injection 공격에는 여러 가지 방법이 있습니다.
그중에서 error-based, binary-based, strcmp-based, mid-based 방법을 사용하는 방법을 설명하겠습니다.

1. Error-based

공격자가 일부러 오류를 발생시키는 쿼리를 만들어 데이터베이스로부터 정보를 얻습니다. 예를 들어, 사용자가 아래와 같이 입력하면 오류가 발생하고 데이터베이스는 오류와 관련된 정보를 노출할 수 있습니다.
SELECT * FROM USER WHERE user_id='bobong' AND user_pw='' OR 1=(SELECT COUNT(*) FROM Users); --'

2. Binary-based

이 방법은 참/거짓 질문을 통해 데이터베이스의 정보를 한 비트씩 얻어내는 방법입니다. 예를 들어, 사용자가 아래와 같이 입력하면 데이터베이스 서버는 참 또는 거짓의 결과만 반환합니다.
SELECT * FROM USER WHERE user_id='bobong' AND user_pw='' OR SUBSTR(user_pw, 1, 1) > 'm'; --'

3. Strcmp-based

strcmp 함수는 두 문자열을 비교하고, 두 문자열이 동일하면 0을 반환합니다. 예를 들어, 사용자가 아래와 같이 입력하면 strcmp 함수를 이용해 데이터베이스에서 정보를 얻을 수 있습니다.
SELECT * FROM USER WHERE user_id='bobong' AND user_pw='' OR strcmp(user_pw, 'guess_password') = 0; --'

4. MID-based

MID 함수는 문자열에서 특정 부분을 추출하는 데 사용됩니다. 예를 들어, 사용자가 아래와 같이 입력하면 MID 함수를 이용하여 데이터베이스의 정보를 조각조각 내서 얻을 수 있습니다.
SELECT * FROM USER WHERE user_id='bobong' AND user_pw='' OR MID(user_pw, 1, 1) = 'g'; --'