[웹해킹] SQL 인젝션 공격 이란?

 

SQL 인젝션 공격

 

SQL 인젝션 공격 이란 데이터베이스에 전송되는 SQL 쿼리문을 사용자 입력으로 조작하여, 데이터베이스 내의 데이터를 변조하거나 허가되지 않은 정보에 접근 할 수 있는 공격이다. 웹사이트의 회원정보 등 개인정보를 빼낼 때 최근까지도 자주 쓰이는 웹 공격이다.

 

 

 

 

 

 

실제 사례

 

· 2011년 소니 해킹
2011년에 소니 데이터베이스가 SQL 인젝션 공격을 당해 100만 명의 회원정보와 350만 개의 디지털 쿠폰 등이 탈취

· 2015년 뿜뿌 해킹
뿜뿌 사이트가 해킹 되어 190만의 회원정보가 유출

· 2015년 어나니머스 WTO 해킹
유명한 해킹그룹인 어나니머스가 WTO 세계무역기구의 한 사이트를 SQL 인젝션 공격으로 해킹하여 수천 명의 각국 재직자 정보를 유출

 

 

 

 

 

 

두 가지의 기본적인 SQL 인젝션 공격을 살펴 보자.

 

 

WHERE 구문을 이용한 SQL 인젝션

 

 

첫 번째는 WHERE 구문을 이용하여 공격하는 예다. ID가 1인 사용자 정보를 요청한다고 생각 해보자. 요청을 받으면 웹 애플리케이션은 내부에 있는 데이터베이스로  그림과 같은 SQL 쿼리문을 전송하게 된다. 이 때 쿼리문 안에 WHERE라는 조건문이 있고 사용자가 입력한 ID값 1이 조건으로 입력 된다. 

 

 

오른쪽의 쿼리문 뜻은 ID가 1인 경우 users라는 사용자 테이블에서 이름과 이메일을 가져오라는 뜻이다.

 

 

 

 

 

이 쿼리가 실행이 되면 DB에서 ID가 1인 사용자정보가 웹 애플리케이션을 통해 클라이언트 까지 전달된다. 이 때 해커는 1 뒤에다가 SQL 쿼리문을 조작하기 위해 밑의 그림처럼 입력한다.

 

 

 

 

 

 

이 값이 그대로 쿼리문으로 들어갔을 때, WHERE 조건문을 보면 중간에 'or' 키워드로 인해 ID가 1이거나 뒤의 조건인 1=1 인 항상 참이되는 구문이 삽입된다.

 

 

 

결국 WHERE 구문이 우회되고 모든 사용자의 개인정보가 리턴 된다.

 

 

 

 

 

 

UNION 구문을 이용한 SQL 인젝션

 

 

두번 째로 UNION을 사용하는 경우이다.

 

 

 

 

위의 상황과 동일한 상황이다.

 

 

 

해커는 이번에는 or 이라는 구문 대신 union 키워드를 삽입하고 뒤에 패스워드를 요청하는 select 구문을 삽입 한다. 이렇게 되면 다음과 같은 SQL 쿼리문이 구성 된다. union을 사이에 두고 select 구문 두 개가 위치하게 되었다.

 

 

 

 

union은 합집합으로 두 개의 select 구문 모두를 포함 시키는 키워드이다. 따라서 이 경우는 원래 실행되어야 하는 ID가 1인 사용자 정보 이외에도 뒤의 select 구문의 결과를 같이 포함하게 되는데 뒤의 구문은 WHERE 조건문이 없기 때문에 모든 사용자의 이름과 비밀번호가 리턴된다. 끝에 #이 삽입 되었는데 #은 mysql에서 #뒤에 오는 내용을 주석처리 할 때 사용한다. 이것은 혹시 뒤에 있을지 모르는 다른 sql 쿼리문은 생략시키고 항상 해커가 원하는 결과만 얻을 수 있도록 사용하기 위함이다.

 

 

이러한 방식으로 UNION을 이용하면 데이터베이스에 다른 테이블도 접근할 수 있고 모든 정보를 빼낼 수 있다.

댓글

Designed by JB FACTORY