Yozzang의 해킹일기 💻
article thumbnail
Published 2022. 4. 2. 01:53
SQL Injection (SQL 인젝션) WebHacking
728x90

이번 포스트에서는 SQL Injection에 대한 포괄적인 소개를 다루도록 하겠습니다.

SQL Injection

 

SQL Injection의 정의 :

SQL Injection은 우리나라 말로 SQL 주입이라 할 수 있습니다. 즉 임의의 SQL 쿼리문을 주입하는 공격 기법이라 할 수 있습니다. 좀 더 자세하게 설명하자면 SQL 인젝션은 웹 사이트의 보안상 허점을 이용해 특정 SQL 쿼리문을 전송하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위입니다.

SQL Injection의 발생 원인 :

SQL Injection은 주로 사용자가 입력한 데이터가 제대로 필터링, 이스케이핑하지 못했을 경우에 발생합니다. 즉, 클라이언트 측의 데이터를 신뢰해서 그대로 SQL문에 사용했기 때문입니다.

SQL Injection이 왜 위험한가?

앞서 설명했듯이 SQL Injection이 임의의 SQL 쿼리문을 주입하는 공격이라 했습니다. 이는 즉, 악의적인 의도를 가진 사용자(해커)가 SQL 인젝션을 통해 로그인 인증 우회하거나 특정 DB(데이터베이스)의 중요한 정보를 열람하거나 조작할 수 있다는 뜻입니다.

SQL Injection 방어법 :

그럼 SQL 인젝션은 어떻게 방어할 수 있을까? 현재 알려진 SQL 인젝션 대비 방안이 여러 있습니다. 그 중 대표적인 대비 방안으로는 시큐어 코딩을 통해 사용자가 입력한 값의 유효성을 검증하는 것입니다. 주로 사용자의 입력값을 필터링하는 "블랙 리스트 방식"과 "화이트 리스트 방식"이 있습니다. 이에 대한 자세한 소개는 다른 포스트에 진행하도록 하겠습니다.

간단한 SQL Injection 공격 예시

아래 그림과 같이 로그인 페이지가 있습니다. 그리고 이 페이지의 사용자 중 'alice'라는 아이디를 가진 사람이 있다고 가정하자.


로그인을 검증하는 SQL 구문이 다음과 같습니다.

$sql = "SELECT * FROM users WHERE id = '$id' AND password = '$pw'";


SQL 구문을 간단히 리뷰하자면, users라는 테이블의 모든 정보(*)를 가져옵니다(SELECT). 단, 아이디는 '$id', 패스워드는 '$pw'인 계정의 정보만.

그러면 어떤 방법으로 SQL 인젝션 공격을 할 수 있을까요? 여기서 우리는 코드의 주석(#) 기능을 사용해서 공격해보도록 하겠습니다.

주석(#) : 코드에 대한 설명을 추가하는 것이 주 목적이며, 컴파일러와 인터프리터에 의해 일반적으로 무시되어 프로그램에 영향을 주지 않는다.

우리는 아이디 란에 alice' #, 비밀번호란에 1이라는 값을 입력할 것입니다. 이를 SQL 문에 대입하면 아래와 같이 완성하게 됩니다.

$sql = "SELECT * FROM users WHERE id = 'alice' #' AND password = '1'";

이 SQL 문은 "id가 alice인 계정의 모든 정보를 users 테이블에 가져온다"를 뜻합니다. 주석(#) 다음의 문장은 무시하게 되니까 비밀번호는 아무거나 입력해도 됩니다. 이를 통해 우리는 쉽게 인증 우회 공격을 진행할 수 있습니다.

실제 공격 코드를 대입해보면 다음과 같습니다.

공격 시도
공격 성공


앞서 소개한 방법 외에도 여러 가지 SQL 인젝션 공격법이 있습니다. 이는 훗날 다른 포스트를 통해 차차 설명하도록 하겠습니다.

이상 SQL Injection에 관한 내용이었습니다.

'WebHacking' 카테고리의 다른 글

DNS 파밍 공격  (0) 2022.07.28
OS Command Injection (OS 명령어 인젝션)  (0) 2022.07.23
profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!