본문 바로가기
보안

SQL Injection 이란? - (1)

qbang 2018. 4. 27.

SQL Injection : 공격자에게 어플리케이션 데이터베이스에 전달하는 구조화된 쿼리 언어, 즉 sql에 영향을 미치게 만들어 생긴 현상

데이터베이스에 전달되는 내용에 영향을 미침으로써 공격자는 권한 상승을 이루게 되고, 데이터베이스에서 제공하는 함수와 데이터베이스에서 사용할 수 있는 시스템 함수를 이용해 시스템 권한과 유연성을 갖게 됨


웹어플리케이션 동작 방식의 이해

웹어플리케이션이 갖는 공통적인 특징 한 가지는 사용된 언어와 관계없이 모두 클라이언트-서버가 서로 데이터를 주고받는 데이터베이스 기반이라는 것이다. 사용자가 입력한 내용에 따라 다양한 데이터를 서버 사이드 스크립트 언어를 이용해 데이터를 데이터베이스에서 가져온다.

웹어플리케이션의 3계층

사용자인터페이스, 비즈니스 로직, 데이터베이스 계층

웹브라우저는 중간계층(비즈니스 로직)으로 요청을 보내고, 해당 요청은 데이터베이스에서 SQL쿼리를 수행하고 데이터베이스를 업데이트한다. 


단순 어플리케이션 구조

사용자 인터페이스는 어플리켕션의 최상위 계층이다.

ex) 상품이나 물품구입, 장바구니와 같이 서비스와 관련된 정보를 제공, 출력결과를 이용해 네트워크 상에 존재하는 모든 계층과 소통함

비즈니스 로직은 사용자인터페이스로부터 연결되며 비즈니스 로직의 개별 프로세스를 통해 어플리케이션 함수를 제어하는 계층임

데이터베이스 계층은 데이터베이스 서버로 구성됨, 정보가 저장되고 배포되는 곳




복잡한 형태의 구조

3계층에서 모든 통신과정은 중간 계층(비즈니스 로직)을 통해 이루어져야 함. 또한 확장이 불가능한 구조이기 때문에 새로운 개념의 확장 가능하고 유지보수가 가능한 모델이 만들어짐 --> N-계층 어플리케이션 개발 패러다임 : 새로운 개념의 4개층 솔루션은 어플리케이션 서버라 불리는 미들웨어를 추가해 웹 서버와 DB사이에 포함시키는 구조로 되어있다.



뒤에 나오는 예제를 웹사이트나 시스템에 절대 시도해서는 안됩니다!

SQL Injection의 이해

SQL Injection은 어플리케이션의 사용자 입력 값에 sql코드를 삽입 또는 추가하고, 해당 sql 구문을 가장 마지막의 sql 서버에서 전달하여 해석 및 실행하는 과정에서 발생하는 공격이다.

가장 일반적인 형태는 파라미터 값(매개변수 값)에 sql 명령을 삽입하고 실행하는 형태로 이뤄진다. 간접공격은 악의적인 목적의 코드를 테이블이나 메타데이터로 저장될 문자열을 감염시킨다. 해당구문이 동적으로 sql 명령으로 생성되면 악성코드가 실행되게 된다.

ex) 100달러 미만의 모든 쇼핑몰 상품을 확인하기 위해 다음과 같은 URL을 요청한다

  http://www.victim.com/products.php?val=100 

이번엔 파라미터에 SQL 명령을 덧붙여 입력 값을 조작해보자

  http://www.victim.com/products.php?val=100' OR '1'='1


OR 연산은 "1의 값이 1과 같은지"에 대해 결과를 앞쪽의 조건과 OR 연산을 수행하게 되는데, 그 결과는 항상 TRUE가 된다. 따라서 가격가 상관없이 모든 상품정보를 반환한다.

위의 예제는 개발자나 어플리케이션에서 예측 또는 예측하지 못한 입력 값에 대해 검증이 이뤄지지 않아 공격자가 그 값을 조작하는 예제이다.


만약 동일한 어플리케이션이 원격 컨텐츠관리시스템(CMS, content management system)으로 사용되고 있다면 어떨까?

CMS : HTML 코드에 대한 깊은 지식이 없어도 웹사이트의 컨텐츠를 수정하고, 생성하고, 관리하고, 배포할 수 있는 웹 어플리케이션

다음 URL은 CMS 어플리케이션에 접속하는 URL

 http://www.victim.com/cms/login.php?username=foo$password=bar 

CMS 어플리케이션은 사용자 계정과 패스워드 인증을 필요로 한다. URL로 접속하게 되면 "사용자 이름이 잘못되었습니다. 다시 시도하시기 바랍니다."라는 에러를 발생시킴

login.php 코드는 SQL 구문을 생성하여 사용자 정보를 확인하고 ID/PASSWD 인증 결과를 반환함. 다음의 쿼리는 사용자가 입력한 ID/PASSWD를 데이터베이스에 저장된 CMS 사용자 테이블 내용과 비교해 결과 값이 일치할 경우 userid를 반환함

 SELECT userid

 FROM CMSUsers

 WHERE user = 'foo' AND password = 'bar'; 

이 코드는 어플리케이션 개발자가 실행 결과 값이 항상 0 또는 1일거라는 생각때문에 문제 발생

http://www.victim.com/cms/login.php?username==foo$password=bar OR '1'='1'

OR '1'='1' 구문을 붙이면 모든 사용자 정보를 반환하게 함

 SELECT userid

 FROM CMSUsers

 WHERE user = 'foo' AND password = 'password' OR '1' = '1';

CMS 어플리케이션의 인증 구조는 데이터베이스에서 0보다 큰 레코드를 반환할 경우 입력한 인증정보가 일치하는지 확인 후, 일치할 경우 admin.php 페이지로 리다이렉트시켜 사용자에게 접근 권한을 제공한다. 따라서 SQL Injection 취약점을 이용하면 이러한 어플리케이션의 동작 방식을 조작하거나 손상시킬 수 있다.




참고 : http://hack4profit.tistory.com


'보안' 카테고리의 다른 글

Chapter 05. 정보 수집  (0) 2019.02.27
Chapter 04. 버프 수트  (0) 2019.02.26
Chapter 02. 웹 보안  (0) 2019.02.26
Chapter 01. 웹과 HTTP 기초  (0) 2019.02.25
SQL Injection 이란? - (2)  (0) 2018.04.30

댓글