사이버보안공부

SQL Injection?

wnstj 2024. 2. 1. 22:55

SQL Injection

Injection?

인젝션은 주입이라는 뜻을 가진 영단어로,

인젝션 공격은 이용자의 입력 값이 애플리케이션의 처리 과정에서 구조나 문법적인 데이터로 해석되어 발생하는 취약점이다.

SQL Injection?

사용자가 로그인을 하기 위해 “id가 guest이고 password가 password인 계정으로 로그인한다”라는 요청을 보내면 DBMS에서는 이에 해당하는 정보를 찾고 로그인의 성공여부를 결정한다.

하지만 단지 “admin으로 로그인한다.”라는 요청을 보내면 DBMS는 비밀번호 일치 여부를 검사하지 않고, 아이디가 admin인 계정을 조회 후 사용자에게 값을 반환한다.

이와 같이 DBMS에서 사용하는 질의 구문인 SQL를 입력 값에 삽입하는 공격을 SQL Injection이라고 한다.

Example

SELECT * FROM accounts WHERE user_id='wnstj1030' and user_pw='password'

웹서비스는 사용자의 입력을 SQL구문에 포함해 요청하는 경우가 있다.

예를 들자면 위와 같이 로그인 시에 ID/PW를 포함하거나 게시글의 제목과 내용을 SQL에 포함하는 경우가 있다.

위 쿼리문을 보면 “wnstj1030”과 “password”라는 문자열을 SQL 쿼리에 포함하는 것을 확인할 수 있다.

SELECT * FROM accounts WHERE user_id='admin'

위는 조작한 SQL 쿼리문의 예시이다 user_pw의 조건이 사라져서 user_id가 admin인 계정의 비밀번호를 비교하지 않고 해당 admin 계정으로 로그인할 수 있게 된다.

하지만 실제에서는 위와 같이 SQL 쿼리의 조건을 없앨 수 없기 때문에 다음과 같은 공격기법들을 사용한다

SELECT * FROM user_table WHERE uid='admin' or '1' and upw='';

위 SQL쿼리에서는 문자열을 나타낼 때 ‘를 사용하는 것을 볼 수 있다.

그래서 위와 같이 ‘ 로 문자열을 끝낸 후 ‘ or ‘1 를 적으면

첫 번째 조건에서 admin인 데이터이고, 두 번째 조건은 이전의 식이 True이고 upw가 없는 경우이기 때문에

결과적으로 uid가 admin인 데이터를 반환하기 때문에 admin계정으로 로그인이 가능해진다.

SELECT * FROM user_table WHERE uid='admin'-- ' and upw='';

위 경우는 admin‘-- 로 문자열을 끝낸후 주석처리를 하여 조건이 uid = ‘admin’ 만 남게 하여

admin 계정으로 로그인이 가능해진다.