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
'Web > LOS' 카테고리의 다른 글
[LOS] 문제 5. wolfman, 스페이스(빈칸) 우회 기법 이용 (0) | 2018.10.26 |
---|---|
[LOS] 문제 4. orc, 함수 이용하여 패스워드 알아내기 (0) | 2018.10.26 |
[LOS] 문제 2. cobolt, 주석 URL 인코딩 (0) | 2018.10.26 |
[LOS] 문제 1. gremlin, URL 인자로 넘겨주는 GET 방식 (0) | 2018.10.26 |
SQL Injection 개념 (0) | 2018.10.26 |