SQL Injection이란?
SQL Injection은 1998 년에 phrack에 기법이 소개된 이후로 언제나 owasp 상위권을 차지하고 있으며 수많은 웹사이트에서 수많은 개인정보를 유출하는데 사용된, 사용되고있는 기법
SQL Injection을 쓰는 이유
SQL Injection 의 가장 큰 특징은 데이터베이스를 공격한다는 것이다. 여타의 해킹기법은 서버사이드 언어가 작동하는 서버 혹은 서버에서 데이터를 받는 클라이언트를 공격하는 기법이다. 그러나 데이터베이스는 서버사이드 언어와는 구분되어진 한개의 프로그램이다. 데이터베이스 자체에서 SQL Injection 을 방어하는것은 어렵고 비효율적인 작업이기에 개발자는 데이터베이스에 가해지는 공격을 서버사이드에서 방어해야한다. 이것이 SQL Injection이 십수년간 유용한 공격기법으로 거론되고, 사용된 이유이다.
SQL Injection Filter Bypass
키워드를 필터링할경우가 존재하는데, 이는 대부분 오픈소스를 사용했거나 방화벽이 설치된 경우.
공백문자를 필터링할 경우
%09, %0a, %0b, %0c, %0d, %a0, /**/ 를 사용.
이러한 키워드들이 막혔을 경우에는 ()를 사용할 수 있다.
#, -- 등의 주석이 필터링 되었을 경우
;%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
SQL Injection이 불가능할 경우
Blind SQL Injection 을 사용. Blind SQL Injection 을 하기 위해서는 글자를 잘라내는 과정이 선행되어야 하는데 여기서 substr 함수가 필터링될 경우가 있다.
콤마만을 필터링당했을 경우
select substr('asdf' from 1 for 1)='a' 라는 방법도 존재한다.
함수 자체가 필터링된 경우
substring 함수로 대체할수가 있다.
substring 함수에 substr 라는 문자열이 들어가기에 [substr(] 라는 단어를 필터링하지 않는이상 substr 함수와 함께 필터링될 확률이 높다.
그럴때는 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 를 해주는 역할을 하는 와일드카드이기에 이런 공격이 가능한 것이다.