whois

Webhacking.kr 18번 본문

Wargame/Webhacking.kr

Webhacking.kr 18번

HongJun Choi 2017. 7. 11. 12:52

[그림 1] 18번


18번을 클릭하게 되면 그림 1과 같은 웹 페이지가 보인다. 큰 제목으로 'SQL INJECTION'이라는 문구를 박아논 걸 보니 SQL 인젝션 공격을 통해 문제를 풀 수 있다는 것을 알 수 있다. 그리고 index.phps를 클릭하게 유도하여 소스까지 힌트로 주고 있다.


[그림 2] 문제 소스


그림 1에서 보이는 index.phps를 클릭하게 되면 그림 2와 같은 문제 소스를 볼 수 있다. 소스 코드의 흐름부터 분석해 보겠다.


① no라는 변수를 GET 메서드로 받는다.

② eregi 함수를 통해 no 변수 값에 /, \, (,\), \t, |, &, union, select, from, 공백이 있다면 no hack이라는 문자열을 출력하고 종료한다.

③ mysql_query를 이용해 쿼리를 전달하고 그에 해당하는 결과 값을 반환하여 q 변수에 담는다.

※ mysql_fetch_array — 연관 색인 및 숫자 색인으로 된 배열로 결과 행을 반환

④ q[0]의 값이 guest이면 hi guest라는 문자열을 출력한다. 여기서 id 변수가 0번째 칼럼이고 no는 또, 다른 칼럼으로 들어가 있음을 추측할 수 있다.

⑤ q[0]의 값이 admin이면 문제를 풀고 hi admin!이라는 문자열을 출력한다.



[그림 3] no 변수 실체 확인


no 변수 값이 근본이 되는데 무엇인지 알기 위해 크롬 개발자 도구를 확인하여 그림 1의 입력란 즉, 텍스트 박스를 클릭해 보니 그림 3과 같은 표시를 보여준다. 이로써, no 변수는 우리가 입력하는 문자열을 담는다.


[그림 4] guest의 no 변수 값 찾기


그림 2의 문제 소스를 봤을 때 hi guest를 띄우기 위해서는 no 변수가 참이어야만 한다. guest의 no 변수의 값을 찾기 위해 0부터 입력하다보니 1이라는 값이 guest의 no 값임을 알 수 있다.


[그림 5] no hack


hi admin! 문자열을 띄우게 위해서는 admin의 no 변수 값을 알아야 한다. 따라서, 뒤에 오는 no=?를 브루트포싱을 해야 한다. 그림 5와 같이 0 or no=2를 넣게 되면 select id from challenge18_table where id='guest' and no='0 or no=2' 쿼리가 만들어진다. no hack이라는 문자열이 출력되는 이유는 공백에서 필터링이 되었기 때문이다.


[그림 6] 성공


그림 5에서 공백 필터링이 걸려 no hack이라는 문자열이 출력 되는 것을 알 수 있었다. 그림 6에 URL을 보면 똑같은 0 or no=2 문자열이 들어가 있지만 %0a라는 Line Feed를 이용해서 %00 공백을 우회할 수 있다. 만약, admin의 no 변수의 값이 2가 아니라면 하나씩 올려가며 찾아야 될 것이다.



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

Webhacking.kr 26번  (0) 2017.07.26
Webhacking.kr 24번  (0) 2017.07.12
Webhacking.kr 14번  (0) 2017.07.10
Webhacking.kr 23번  (0) 2017.07.06
Webhacking.kr 54번  (0) 2017.07.05
Comments