상세 컨텐츠

본문 제목

[웹해킹] Webhacking.kr 18번 풀이

기타 정보/Webhacking.kr

by Mathgongyoo 2013. 11. 7. 22:09

본문

*웹해킹.kr 18번 풀이


문제 페이지에 접속하면 대문짝만하게 SQL INJECTION이라는 말과 함께 값을 제출할 수 있는 텍스트박스가 놓여있다. 시험삼아 숫자 1을 입력하고 제출 버튼을 눌렀더니 get메서드를 사용하는지 주소 뒤에 ?no=1이 추가되면서 텍스트박스 아랫쪽으로 'hi guest'라는 문구가 뜬다.


그 밑에는 친절하게도 index.phps가 있다는 사실을 알려준다. 출제자의 힌트를 날름 집어먹으면서 들어가면 PHP가 포함된 소스파일을 볼 수 있다.





eregi는 검색함수이다.(웹해킹 1번 풀이(>>링크)에서 설명한 적 있다.)


첫 번째 줄의 요지는 GET메서드나 SQL에서 장난칠만한 것들을 막겠다는 내용이다.

exit함수는 남은 php 스크립트를 무시하고 그대로 끝내는 명령어이기 때문이다.


두번째 줄은 SQL 구문이 포함되어 있다. mysql_fetch_array와 mysql_query가 무엇인지는 검색을 통해 알아보도록 하자.

두번째 줄의 요지는 id가 guest이고 no의 값이 get메서드로 받은 no의 값과 같은 challenge18_table의 id를 받아오라는 것이다.


마지막으로 두 줄의 if문은 $q[0]로 받은 id값으로 결과를 분기하는 것이다. admin이라는 id값을 받아야 패스워드를 받을 수 있다.


테이블도 가르쳐주다니 무지막지한 힌트다. admin은 no=2인 칼럼이란다.

이렇게 되면 q[0]는 guest가 나오거나 false라서 아무값도 출력되지 않게 된다.

이제 이 틈을 비집고 들어가야 한다.


※ sql에서 연산자의 우선순위

괄호 > not > and > or


주어진 SQL구문안에서 우리가 조작할 수 있는 값은 $_GET[no]뿐이다. 다행히 숫자가 들어갈 공간이라 따옴표는 필요없다.

or연산자와 and의 우선순위를 이용해 우리가 원하는 admin이라는 녀석을 잡아내 보자.


A and B or C 의 풀이순서 >> and 다음 or을 계산!


즉 and에서 A, B 중 하나 이상이 거짓이라 FALSE라는 결과가 나왔다 해도 C라는 값이 참이면 TRUE가 되는 것이다.

결론을 말하면 no의 값에 일단 1이 아닌 값을 넣어 and 연산결과가 FALSE가 되도록 하고, 그 다음 no=2를 or로 연결시켜 2번 TABLE이 조건을 만족하도록 하면 된다. 예컨대 ?no=2 or no=2 와 같이 쓰면 된다.


하지만 eregi를 통해 공백을 사용하지 못하도록 해두었다. 공백 우회에 대한 자료가 있어 퍼왔다.


※ 공백 우회가 가능한 문자의 종류


1. Tab : %09

  - no=1%09or%09id='admin'

 

2. Line Feed (\n): %0a

  - no=1%0aor%0aid='admin'

 

3. Carrage Return(\r) : %0d

  - no=1%0dor%0did='admin'

 

4. 주석 : /**/

  - no=1/**/or/**/id='admin'

 

5. 괄호 : ()

  - no=(1)or(id='admin')

 

6. 더하기 : +

  - no=1+or+id='admin'


*출처 : http://binaryu.tistory.com/31



여기서 입맛에 맞고 조건에도 맞는 것을 골라 쓰자. 물론 공백 우회는 이것보다 더 다양하다.

인터넷을 통해 잘 찾아배워두면 인젝션을 막는데 도움이 될 것이다.

관련글 더보기