whois

Webhacking.kr 27번 본문

Wargame/Webhacking.kr

Webhacking.kr 27번

HongJun Choi 2017. 9. 7. 22:30

[그림 1] 27번 페이지


27번을 클릭하게 되면 그림 1과 같은 웹페이지 모습을 볼 수 있다. SQL INJECTION이라는 문구를 보여주는 것으로 보아하니 텍스트 박스에 SQL Injection 공격 구문을 넣어 제출하면 문제를 해결할 수 있을 것으로 보인다.


[그림 2] 27번 소스


그림 1 웹페이지에서 우클릭을 통해 소스 보기를 하면 그림 2와 같은 소스를 볼 수 있다. 실수인 척 하면서 index.phps를 주석 처리 해놓음으로 힌트를 제공하고 있다.


[그림 3] index.phps 소스


그림 2에서 얻은 index.phps 소스를 보게 되면 총 3가지의 중요 요소들을 캐치 할 수 있다.



① eregi 함수로 필터링 하는 문자들

② 제출 양식(공격 벡터)

③ 문제 해결 조건



먼저, eregi 함수로 union, from, challenge, select 문자열과 (, \t, /, limit, =, 0x와 같은 SQL Injection 공격에 자주 사용하는 특수한 것들도 필터링 하고 있다. 두 번째로 그림 1 텍스트 박스에 값을 넣고 제출 버튼을 눌리게 되면 제출 양식 부분에 값이 들어가게 된다. 특이한 것은 $_GET[no]로 값을 받는데 그 값을 괄호로 감싸고 있다는 것이다. 만약, 123이라는 값을 제출하게 되면 select id from challenge27_table where id='guest' and no=(123) 이런 SQL 쿼리문이 만들어진다. 마지막으로 id 값이 admin이면 문제를 해결하게 되는데 mysql_query를 보면 기본적으로 id가 guest로 설정되어 있다. 제출을 통해 쿼리문을 만들어 id 값을 admin으로 만들어줘야 한다.


[그림 4] 0을 넣었을 때


테스트 하기 위해 0이라는 값을 적고 제출해 보았더니 아무 반응도 일어나지 않았다. no가 0일 때 매칭되는 값이 없거나 있어도 숨기고 있는 것으로 유추할 수 있다.


[그림 5] 1을 넣었을 때


좀 더 많은 정보가 필요하여 1을 넣고 제출해 보았더니 guest라는 문자열을 출력해주고 있다. no. 1에 guest라는 계정이 들어 있는 것으로 알 수 있다.


[그림 6] 2를 넣었을 때


2를 넣고 제출해 보니 query error라는 문자열을 출력해준다. 이것을 보고 Error Based SQL Injection이라는 것을 파악할 수 있다. Error Based SQL Injection이란 에러 기반으로 참, 거짓을 통해 SQL Injection 공격을 하는 일종의 한 종류라고 보면 된다. no. 2에 admin 계정이 있음을 어느정도 유추할 수 있다.


[그림 7] no 변수 이용


다른 방법들도 많겠지만 풀이에는 크게 두 가지가 있다고 볼 수 있다. 첫 번째는, no 변수를 이용하여 no=2가 참이 되어 정상적으로 돌아가게 하는 법. 두 번째는, id 변수를 이용하여 id=admin 쿼리를 넣어 직접적으로 접근하는 방법이 있겠다. 그림 7은 no 변수를 이용한 쿼리문을 텍스트 박스에 넣은 것이다. 0 대신 다른 숫자를 사용해도 상관 없다. 괄호로 먼저 닫아 select id from challenge27_table where id='guest' and no=(0)이라는 쿼리문을 만들면 and 연산으로 거짓이 된다. 그 후 no like 2-- 구문을 통해 no=2--라는 쿼리문이 만들어진다. like를 사용한 이유는 그림 3 소스 필터링 문자 부분에서 =을 필터링 하고 있어 대체한 것이고 --는 뒤의 나머지 구문을 주석으로 처리하기 위함이다. 이 때, 빠져 먹지 말아야 할 것은 --하고 공백을 주어야 되는 것이다. 그렇지 않으면 query error가 뜨게 된다.


[그림 8] id 변수 이용


두 번째 방법으로 id 변수를 이용하는 것이다. no 변수를 이용하는 것과 같이 나머지는 동일하고 변수명과 값만 다르게 넣어주면 된다. 0x를 필터링 하고 있기에 admin을 바이너리 형태로 바꿔서 넣어주면 동작하게 된다. 이 과정은 그림 9를 참조하면 된다.


[그림 9] admin to binary


간단한 text to binary 변환기를 이용하여 admin 값을 변환 시켰더니 그림 9와 같은 결과 값을 얻을 수 있었다. 위의 바이너리 값이 그림 8에 들어가 있는 값과 동일하다.


[그림 10] 클리어

'Wargame > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 38번  (0) 2018.07.18
Webhacking.kr 32번  (0) 2018.07.17
Webhacking.kr 25번  (0) 2017.09.01
Webhacking.kr 26번  (0) 2017.07.26
Webhacking.kr 24번  (0) 2017.07.12
Comments