*웹해킹.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' |
여기서 입맛에 맞고 조건에도 맞는 것을 골라 쓰자. 물론 공백 우회는 이것보다 더 다양하다.
인터넷을 통해 잘 찾아배워두면 인젝션을 막는데 도움이 될 것이다.
[웹해킹] Webhacking.kr 20번 문제 풀이 (0) | 2013.11.13 |
---|---|
[웹해킹] Webhacking.kr 6번 풀이 (0) | 2013.11.07 |
[웹해킹] Webhacking.kr 16번 풀이 (0) | 2013.11.05 |
[웹해킹] Webhacking.kr 17번 풀이 (0) | 2013.11.04 |
[웹해킹] Webhacking.kr 15번 풀이 (0) | 2013.11.04 |