SQL인젝션

1. SQL 인젝션이란?

  1) 개요

SQL인젝션은 SQL Query를 처리하는 과정에서 예상치 못한 입력 값에 의해 DBMS의 정보를 노출하고 특정 명령어 실행 등이 발생하는 취약점을 노리는 공격기법이다. 인젝션 공격 중 가장 대표적인 기법 중의 하나.


인젝션 공격은 OWASP(Open Web Application Security Project)에서 발표하는 OWASP top 10에서 항상 등장하는 단골 손님이다. 데이터베이스의 민감한 정보들을 위/변조 하거나 삭제를 하는 등, 심각한 위협이 되기 때문.


사용자는 WEB을 통해 DB를 조회하는데, 이 때 공격자가 악의적인 목적의 쿼리문을 조작하여 인가되지 않은 DB의 정보를 요청한다.

즉, 입력 받은 데이터를 이용해 구문을 완성하는 특정 페이지에서 입력값의 적절한 검증절차 없이 쿼리문에 포함되어 실행될 때 발생한다.


  2) 시스템 영향

SQL injection이 시스템에 미치는 영향은 다양하다. 대표적으로 웹 어플리케이션의 인증을 우회하여 권한 이상의 명령을 실행할 수 있게 된다. 또한 데이터베이스의 내용을 덤프하거나 조작, 파괴도 가능하다. 시스템 함수를 호출할 수도 있으며, 결과 값에 따라 시스템의 주요 파일을 노출할 수도 있다.

세미콜론(;)을 이용하여 2개 이상의 쿼리문을 동시에 실행시킬 수 있다. 또한 UNION SELECT 구문을 이용해 2개 이상의 쿼리 결과값을 합칠 수 있다.


2. 공격 원리

  1) SQL 쿼리문 동작 프로세스

아이디 / 패스워드 입력 -> SQL 쿼리문 생성 -> 데이터베이스에 쿼리문 전송 -> 데이터베이스에서 쿼리문 실행 -> 결과값 반환


그림1 - SQL 쿼리문의 동작 프로세스


  2) 공격 방법

>논리적 오류를 이용하는 방법

  - 사용자 인증 창을 통해 입력 받은 ID와 PW 문자열이 인증을 위한 SQL 쿼리문의 일부가 되는 데 이것을 악용하는 방법이다.


그림2 - 관리자 로그인 페이지에서 인증 우회 시도


위 그림이 인증 우회에서 가장 대표적인 구문이다. 이것을 서버로 전송할 때 Burp Suite로 가로챈 내용이 아래 그림이다.


그림3 - php에게 넘겨지는 값을 burp suite로 가로챈 모습


%27은 ''(따옴표)'이고 %3D는 '='이다. 즉 admin_id='or'1'='1-- & admin_pass=1의 형태로 전송된다. 여기서 &연산을 통해 좌/우항이 모두 참인 경우 인증에 성공한다. 그러나 --으로 &부터는 주석처리를 시켰다.(MS-SQL에서는 --가 주석처리). 따라서 주석처리부분의 앞 내용만 참이 되도록 하는 것이다.
실제로 DB에서 받은 요청문은 아래와 같다.

SELECT * FROM user where id='입력값' & password='입력값'


기본적으로 파라미터 값의 시작에 홑따옴표가 붙는다. 그래서 'or과 같은 형태로 or의 앞부분을 닫아주는 것이다. or연산은 둘 중 하나만 참이어도 참이기 때문에 앞에는 어떤 것이 들어와도 상관이 없다. 엉뚱한 값을 넣어도 되는 것이다. 물론 특정 아이디에 접속하고 싶을 경우에는 올바른 아이디값을 입력하고 패스워드에 위 구문을 실행시키는 형식으로 사용이 가능하다.


불특정 ID로 접속할 경우(이 경우 DB의 맨 첫 번째로 저장된 ID로 접속 된다.)


SELECT * FROM user where id=''or'1'='1--'& password='1'


특정 ID에 패스워드 인증을 우회하는 경우


SELECT * FROM user where id='sieg' & password='random'or'1'='1'


이러한 형식으로 접근이 가능하다.

물론 요즘 웹사이트를 대상으로 이 정도의 공격은 거의 대부분 막힌다고 봐야한다. 어설프게 사용했다가 쇠고랑 차지 않도록 각별히 주의해야한다.

  

  3) 대표적 공격 문자열

 문자열(아이디와 패스워드)

결과 

'or 1=1--

'or'1'='1

 where 절 이하가 항상 참이 되어 인증 성공

')or('1'='1

 패스워드가 암호화 저장되어 쿼리문이 Hash와 같은 형태인 경우 인증 성공

 admin'--

admin 사용자가 존재 시 인증 성공 


SQL Injection의 우회를 잘 정리한 글은 lena04님의 블로그에서 확인 가능 하다(링크)


글이 길어지면 가독성이 떨어지므로 여기까지만 진행하고 다음 글에서 논리적 오류를 이용한 공격 방법을 이어서 설명하도록 하겠다.


+ Recent posts