ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. SQL 인젝션 취약점
    웹 취약점 분석 2019. 4. 6. 00:52

    SQL 인젝션 취약점이란?

     

    코드

    SI

    점검항목

    SQL 인젝션

    개요

    데이터 베이스와 연동된 웹 어플리케이션에서 SQL 질의문에 대한 필터링이 제대로 이루어지지 않을 경우 공격자가 입력이 가능한 폼(웹 브라우저 주소입력창 또는 로그인 폼 등)에 조작된 질의문을 삽입하여 웹 서버의 데이터베이스 정보를 열람 또는 조작을 할 수 있는 취약점

    SQL인젝션 [Structured Query Language Injection]이란 영문을 그대로를 번역해 보면 구조화된 질의 언어를 끼워 넣는다는 의미 입니다.

     

    SQL Injection 공격의 종류에는 크게 세가지 유형이 있습니다. 

     

    1. 인증 우회 (AB : Auth Bypass)

    2. 데이터 노출 (DD : Data Disclisure)

    3. 원격명령 실행 (RCE : Remote Command Excute)

     

    1) 인증 우회

    보통 아이디와 패스워드를 입력하는 로그인 페이지를 타겟으로 행해지는 공격이다. SQL 쿼리문의 true/false의 논리적 연산 오류를 이용하여 로그인 인증 쿼리문이 무조건 true값이 나오게 하여 인증을 무력화 하는 원리이다. 

    대부분 처음 공부할때 가장 많이 쓰는 방법이다.

     

    2) 데이터 노출

    타겟 시스템의 주요 데이터 절취를 목적으로 하는 방식입니다. 

    대표적으로 여러가지가 있는데 Error based, Union based. Blind based, Time based 등등 여러 방법이 있습니다.

    시스템의 에러는 실제로 시각적으로 보여주면 안되는 부분이며, 개발자에게는 버그를 수정할수 있는 면에서는 매우 많은 도움을 주는 것이지만 역으로 생각하면 공격자가 악용을 할수도 있다는 점을 생각 하게 할수 있다.

    악의 적인 구문을 이용해서 삽입하여 에러를 유발 시키는 것입니다.

     

    get방식으로 동작하는 url에 공격자는 query string을 이용해서 추가적인 에러와 공격을 할수 있게 됩니다.

     

    1=1 이라는 '참'인 값을 삽입하여 로그인 성공! 으로 SQL 인젝션 공격원리 익히기!

     

    Select * from user where id ='admin' and password='1234' 인 값이 있다고 햇을때 공격자 입장에서는 id는 알지만 password를 알수는 없습니다. 

     

    그래서 이런식으로 sql인젝션 공격을 합니다. 

    Select * from user where id='admin' and password='' or '1=1' 이런식으로 말입니다.

    입력을 해줄때에는 다음과 같이 해줍니다.

     

    ?id='admin'&pw=' or '1=1 

     

    왜 이렇게 입력을 하는지 확인해 보겠습니다.

     

     

    이렇게 싱글쿼터가 열리고 닫히는데 처음 싱글쿼터는 열려있는 싱글쿼터를 닫는 역할을 합니다.

     

    그리고 or 를 작성한 뒤에 닫힐 싱글쿼터를 생각해서 하나를 열어주고 1=1인 참값을 적는 것입니다. 

     

    이렇게 되면 pw 는 1=1이라는 참값이 들어가게되어서 로그인이 뚤리게 되는 것입니다.

     

    대표적인 sql injection 진단 방법으로는 다양합니다 아주...

     

    1. ' or '1=1

    2. ' or '1=1--

    3. ' or '1=1#

     

    등등 같은 역할을 하는 문자에도 여러가지가 있습니다. 

     

    예를 들어 주석을 의미하는 문자열인 #이 있는데 해당 사이트에서 #이라는 문자열을 쓸수 없게 필터링을 해두는 경우가 있습니다. 그럴때 -- 나 /**/ 등등 다른 주석 문자를 쓰게 되는 것입니다.

     

    ★ 주석 #은 MYSQL 에서 주로 사용합니다.

     

    SQL 인젝션 취약점을 진단 하는데에 있어서 실습을 할수 있는 사이트가 있습니다.

    http://testphp.vulnweb.com

     

    사이트에 들어가서 왼쪽 카테고리에 sign up을 누르면 로그인 창이 뜹니다.

    Username : admin

    Password : ' or '1=1

    을 입력해 보겠습니다.

     

    Password가 참이여서 로그인이 됬지만 admin이 아닌 test로 로그인이 됬습니다.

    이는 Username 마저도 확인을 안하고 전송을 하는 것 같습니다.

     

    해당 사이트가 아니여도 취약점 실습 사이트인 DVWA에서도 가능합니다.

    전시간에 실습한 운영체제 명령실행 취약점 처럼 이용하시면 될거 같습니다.

     

    이렇게 ' or '1=1 구문으로 실제로 뚤리는 사이트는 거의 없다고 봐도 무방합니다.

    물론 더욱 세밀하고 긴 sql이면 될지도 모르겠지만 blind sql injection이라는 더 어렵고 강력한 공격기법이 있습니다.

     

    blind sql injection이란 말그대로 가려져있는 sql injection으로도 인식을 해도 무방합니다.

    실제 비밀번호는 모르지만 쿼리문을 이용해서 sql injection을 하는 것입니다.

     

    UNION 이나 SELECT를 이용해서도 칼럼수를 찾을수도 있습니다.

     

    블라인드 SQL Injection을 예시로 보여드릴텐데 하는 방법 보다는 실제 ctf 워게임 사이트에서 사용되는 코드를 보여드리겠습니다.

     

    [Lord of SQL_injection] #4 orc 에서 사용된 코드입니다.

     

    이렇게 대부분 파이썬 코드를 작성해서 blind sql injection을 하게 됩니다.

     

    우리눈으로 보이는 것은 참일때의 화면과 거짓일때의 화면입니다.

     

    해당 쿼리를 저렇게 작성을 하고 URL과 함께 GET방식으로 보내게 되면 쿼리의 내용처럼

    length(pw)는 pw의 길이가 몇인지는 알아봐주는 쿼리인데 for문을 돌림으로서 우리가 pw의 길이를 구하게 됩니다.

     

    그리고 아래에서는 그길이에 해당하는 진짜 pw를 찾는 역할을 하는 코드를 작성하게 되는 것 입니다.

     

    여기서는 완벽하게 전부 다 알려드리지는 못하지만  https://los.rubiya.kr/ 여기 워게임사이트가 sql injection 만 다루어져 있는 사이트입니다.

     

    그래서 여기 문제를 전부 풀어 보시고 all clear하시면 sql injection에 대한 감을 익히실수 있습니다.!

     

    또한 sql injection을 우리 손으로 하지 않고 자동화 툴이 있습니다. sqlmap 이라고 해서 sql 쿼리문을 url 만 적어서 넣으면 자동으로 돌려줍니다. 이러한 툴을 이용해서 sql injection을 하는 경우도 있습니다.

     

     - Blind SQL Injection

     - 타임기반 Blind SQL Injection

     - UNION SQL Injection

     - 에러기반 SQL Injection

     - 연산자 기호를 이용한 SQL Injection

     - SQL Injection + XSS 공격 구문삽입 공격

     

    등등 있습니다.

     

    SQL Injection 공격 대응 방안으로는 다음과 같은 대응이 있습니다.

     

    Prepared Statement 객체 (class) 를 통한 방어

     

    SQL 쿼리를 선 처리 해서 컴파일 한 후, 이후에 받는 변수 값을 전부 문자열 처리 해서 다루기 때문에 공격자가 악의적인 SQL 구문을 변수에 삽입 해도 SQL 구문에 영향을 미치지 않습니다.

     

    1. 데이터 베이스와 연동되는 스크립트의 모든 파라미터를 확인후 사용자의 입력값에 sql 쿼리문이 입력되지 않도록 필터링 해야 한다.

    2. 데이터 베이스의 에러 메세지를 사용자에게 보여주면 안된다.

    3. 동적쿼리 보다는 정적 쿼리를 지향한다.

     - 정적 쿼리란? 외부의 입력값에 의해서 쿼리문의 구조가 변하지 않는 쿼리

     

     

    '웹 취약점 분석' 카테고리의 다른 글

    6. 악성컨텐츠 삽입 취약점  (0) 2019.04.13
    5. 정보노출 취약점  (0) 2019.04.13
    4. 디렉토리 인덱싱 취약점  (1) 2019.04.07
    3. XPath 인젝션 취약점  (2) 2019.04.06
    1. 운영체제 명령 실행 취약점  (0) 2019.03.02

    댓글

Designed by Tistory.