Web/LOS

[LOS] 문제 3. goblin, 따옴표 문자 필터링 우회

__bo0o_ 2018. 10. 26. 18:42

 

 

if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");

preg_match 함수는 PHP 4, 5, 7에서 사용되는 함수이고,

정규표현식 중 하나로 이 함수는 패턴이 일치하는 검색 결과를 반환한다고 한다.

 

3번 문제는 이전 문제들과 같이 필터링을 하지만

한 개의 필터가 더 추가되었다.

if(preg_match('/\'|\'/i', $_GET[no])) exit("No Quotes ~_~");

즉 데이터베이스의 접근을 막기 위해

[ ', ", ' ] 이러한 따옴표 문자들을 필터링한다.

 

 

 

먼저 쿼리문을 살펴보면,

id='guest'로 잡혀 있고, 우리가 입력할 수 있는 변수는 no이다.

 

?no=1을 넣었을 때의 화면 값은

우리가 이 문제를 해결하기 위해서는

if($result['id'] == 'admin') solve("goblin")

id가 admin이 되어야하는데,

지금은 id가 guest이기 때문에 다른 값을 넣어보도록 하자.

 

?no=2를 넣었을 때의 화면 값은 아무것도 뜨지 않아서

?no=2 or id=admin 해봤지만, 해결이 되지 않는다.

왜냐하면 'admin'을 문자열로 받아들여야 하는데,

admin은 문자열이 아닌 다른 것으로 인식되어서 그런 것 같다.

 

 

1. 따옴표(') 필터링 우회, URL 인코딩

 

만약 따옴표를 사용하게 되면,

preg_match 함수로 인해 

No Quotes ~_~ 필터링 글이 나오게 되므로

 

이제 우리는 따옴표 필터링을 우회해볼 것이다.

2번 문제에서 #(주석)을 우회하기 위해 %23이라는 URL 인코딩 값을 사용하였다.

이처럼 일반적으로 어떠한 문자가 막혔을 때, URL 인코딩을 사용하여 우회한다.

 

'을 인코딩하면 %27이고,

?no=2 or id=%27admin 했지만,

마찬가지로 No Quotes ~_~가 뜨면서 되지 않는다.

 

 

2. 스트링 우회 기법, hex(16진수) 값으로 입력

 

그럼 더 깊이 들어가서 admin이라는 문자를 hex(16진수) 값으로 입력해보자.

이 방법은 스트링 우회 기법이라고 하며,

내가 원하는 문자열이 필터링 되었을 경우, 사용하는 방법이다.

 

데이터베이스마다 다를 수도 있지만

아래의 사이트를 이용하여 admin을 16진수로 바꿔보자.

http://dolcevie.com/js/converter.html

 

아스키코드를 hex(16진수)로 바꿨다.

문자 a는 61

문자 d는 64

문자 m은 6D

문자 i는 69

문자 n은 6E

 

따라서 답은 ?no=2 or id=0x61646D696E