webhacking.kr challenge 18
들어갔더니 sql injection이라고 뜬다. 하나도 모르지만 일단 index.phps을 눌러 코드를 확인했다.
form 태그를 보면 method=get라고 써있는데 get방식은 입력 데이터를 url에 붙여 전송한다. 아마 이 부분을 이용해서 문제를 해결해야 할 것 같다.
php로 작성된 부분을 보면 if문이3개가 있는데 이 중 마지막 if($q[0]=="admin")으로 만들어줘야 문제를 풀 수 있다.
먼저 첫번째 if 문은 공백,/, (, ), 탭, |, &, union, select, from, 0x라는 문자열들이 입력되면 exit("no hack"); 이 실행된다.
두번째 if문은 $q가 "geust" 일때, 세번째 if문은 $q가 "admin" 일때 실행된다.
그럼 $q를 살펴보자. $q는 mysql_fetch_array의 반환값인데 이는 테이블에서 가져온 값이 저장된다. 여기서 중요한 부분은 id='guest' and no=$_GET[no]이다.
다시 처음으로 돌아가서 첫 화면에서 1을 입력하고 제출을 누르면 hi guest라고 뜬다. url을 보면 no=1이라고 써진걸 확인할 수 있다. 그러면 아마도 admin은 2일것 같은데 막상 입력하면 아무것도 바뀌지 않는다. 그 이유는 바로 위에서 중요한 부분이라고써놓은 코드 때문에 그러는데 이 부분을 조금 수정하면 된다.
and 연산자는 or 보다 우선순위가 더 높기때문에 (A and B) or C 괄호씌운 순서대로 계산한다. 그러면 and쪽을 거짓으로 만들고 or 뒤부분을 진실로 만들면 성공할 수 있다. 아까 admin이 2라고 추측했으니까 이걸 토대로 url에 추가한다.(get 방식이기때문에)
여기서 주의할 점은 공백과 탭이 모두 걸리기 때문에 이걸 제외하고 사용해야 한다. 그래서 %0a를 사용했다.(공백을 의미한다. 이 외에도 줄 바꿈 등 개행문자를 사용해도 된다. )
이렇게 치고 엔터를 누루면
성공!
참고:
http://introfor.tistory.com/7
http://sbumseo.tistory.com/84
https://m.blog.naver.com/PostView.nhn?blogId=meigoya&logNo=220619494587&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F
댓글
댓글 쓰기