WEB1

SQL injection(7) - WAF bypass

이번 토픽에서는 sql injection공격을 수행할 때 유용한 웹 방화벽 우회 방법들에 대해 알아보도록 하겠습니다. 

 

1. url encoding

우리가 url에 sql injection 공격을 수행한다고 가정했을 때 url encoding은 우리가 사용할 수 있는 유용한 웹 방화벽 우회법입니다. 

우리가 ..... union select ..... 라는 구문을 활용하여 sql injection을 할 때 union이라는 키워드가 필터링 당한 경우를 종종 경험할 수 있습니다. 그 때 우리는 union이라는 키워드를 url인코딩하여 표현할 수 있습니다. 우리가 보낸 쿼리가 웹 방화벽을 지날 때에는 그저 의미없는 문자열로 보이지만, url encoding이 풀리고 난 뒤에는 sql 쿼리문으로 데이터베이스에 영향을 미치게 됩니다.

 

2. 주석

우리가 sql injection공격을 수행할 때 우리는 sql 문법에서 오류가 발생하지 않도록 하기 위해 주석을 사용합니다. sql 에서의 주석의 종류로는 크게 4가지가 있습니다.

1) %23 (#을 의미함. url에서 사용할 때는 %23으로 사용합니다)

2) -- -

3) ; (세미콜론 뒤 널바이트를 넣게 되면 주석으로 사용할 수 있습니다.

4) /*(주석처리할 내용)*/

 

3. 대소문자를 이용한 필터링 우회

앞에서 언급했던 것 처럼 union이나 select 등 특정한 키워드가 금지되어있는 경우들이 있습니다. 그 때 우리는 대소문자를 섞어서 사용하는 방법을 통해 웹 방화벽 우회를 노려볼 수 있습니다.

예를 들어 우리에게 필터링이 된 문자는 union이라고 가정해 봅시다. 이 때 우리는 대문자와 소문자를 섞어 사용하여 union을 UNion이나 UnioN등 여러가지로 표현할 수 있습니다. 이것이 가능한 이유는 데이터베이스 단에서는 union이나 UNIon등을 모두 같은 union으로 보고 처리를 하지만 우리에게 union이라는 문자를 필터링한 방화벽에서는 UNION이나 UnIoN을 필터링하지 않았을 가능성이 있기 때문입니다.

 

4. str_replace()함수가 있을 때의 우회법

str_replace()함수는 이름에서부터 알 수 있듯이 특정한 문자열을 치환해 주는 역할을 합니다.

str_replace('원래 문자열', '치환할 문자열')

이때 union이라는 문자가 str_replace()함수를 거쳐 공백('')이 되어 나온다고 가정해 봅시다. 이때 우리는 다음과 같은 방식으로 필터링을 우회할 수 있습니다

'uniunionon'

바로 union이라는 문자의 중간에 union을 삽입하는 방법입니다. str_replace()함수는 union이라는 문자열을 공백으로 대체할 것이기 때문에 중간에 있던 union이 사라지면서 자연스럽게 union이라는 문자열을 만들 수 있게 됩니다.

 

5. 공백 우회방법

sql injection과 관련된 여러가지 문제를 풀다 보면 우리는 공백(%20)을 사용하지 못하는 경우가 있습니다. 이때 우리는 다음과 같은 방법을 사용하여 공백을 우화할 수 있습니다.

1. %0a

2.

3.

4. %0d

5. %09

6. /**/

 

6. 특정한 문자열이 필터링 당했을 때 우리는 +연산을 사용하여 우회할 수 있습니다. 

예를 들어 'union'이라는 문자열이 필터링 되어 있을 때  'un + ion' 과 같은 방식으로 우회할 수 있습니다.

 

7. 주석 안에서의 실행

/*!(임의의 5자리의 숫자)(우리가 실행할 쿼리의 일부)*/와 같은 방식으로 쿼리문을 실행할 수 있습니다.

예를 들어 

select id, passwd from user /*!50000union*/ select 1, table_name from information_schema.table

과 같은 방법으로 사용할 수 있습니다.

 

이번 토픽에서는 웹 방화벽을 우회할 때 유용하게 사용할 수 있는 우회 방법들에 대해 알아보았습니다.

댓글

댓글 본문