본문 바로가기

Game/webhacking.kr

[250] prob21

250점 21번 문제이다.

대문짝 만하게 BLIND SQL INJECTION이라고 쓰여져 있다 ..;

SQL INJECTION문제는 정말 풀기 싫다 ㅠㅠㅜㅜㅜ..

어쨌든 풀어야 하니.. 


Blind SQL은 그냥 SQL Injection과는 다르게 내가 보내준 쿼리가 참이냐, 거짓이냐 만을 가지고 판단해야하는데,

참, 거짓일때의 서버의 반응만을 보고 정보를 얻어내야한다.


문제에 2\을 제출하면 Result에는 True라고 뜨는데, URL을 살펴보면 id와 pw를 같이 GET방식으로 보내주는 것을 볼 수 있다. 

1과 2를 제출했을 때에만 Result가 true가 나왔으므로 우선 테이블이 어떻게 생겼는지를 추측할 수 있다.

 no

id 

pw 

 1

 

 

 2

 

 


이때 id와 pw가 무엇인지 어떻게 알 수 있을까..


우선 각 넘버의 id와 pw의 길이부터 알면 더 찾기 쉬울 것이다.

no 1의 id의 길이를 알고 싶을땐 length함수를 이용하면 된다.

no=1&&length(id)라고 보내주었을때 no1의 id의 길이가 4일경우에는 Result가 true가 될것이고,

4가 아닐경우에는 false가 될 것이다 .

blind sql은 이런식으로 쿼리의 참, 거짓을 따져가며 정보를 얻는 방식!


실제로 수행해보면 false이므로 id의 length는 4가 아니다.

( &기호는 url인코딩한 값인 %26을 넣어줌, 그냥 &를 넣어주면 매개변수를 구분하는 &로 인식한다고함 )

이번에는 5를 넣어보았다.

이번에는 결과값이 true가 나왔으므로 no 1의 id의 길이는 5인것을 알 수 있다.

같은 방식으로 no 1의 패스워드의 길이, no 2의 id,pw의 길이를 알아내보았다.



 no

 id

pw 

 *****

 *****

 *****

 19자리..


추측을 하다가 좀 길다 싶으면 

http://webhacking.kr/challenge/bonus/bonus-1/index.php?no=1%26%26length(pw)<20

이러한 방식으로도 판단할 수 있다.


얼추 표는 완성이 되었고 이제는 정확한 문자를 알 차례이다.

이런 경우에는 subsrt함수와ascii함수를 사용하여서 각각의 문자들이 무엇인지 알아낼 수 있다.


substr( 문자열, 가져오기 시작할  문자열 인덱스, 가져올 문자의 개수 ) 와 같이 사용하고,

ascii(x)는 파라미터로 받은 값의 ascii코드를 리턴한다.


이를 이용해서 

ascii( substr( id, 1,1 ) ) = 97같이 사용하는데, 이를 통해 id의 첫글자가 'a'인지 확인할 수 있다.

a이면 true, 아닐경우는 false


이렇게 한땀한땀 아스키값을 바꾸어가며 id와 pw를 알아낼 수도 있지만 

코딩해서 풀면 더욱!!!편리하므로 난 코딩해서 풀었다...

직접 짜보고 싶었는데 소켓프로그래밍을 제대로 못해서 

돌아다니는 python코드를 참고해서 짜보았다 ㅠ^ㅠ..


그렇게 해서 알아낸 표를 완성해보자면


no 

id 

pw 

guest 

필요 없어서 안 알아냄.. 

admin 

19자리의 비밀번호! 


알아낸 admin의 패스워드를 auth에 인증!


21번 문제도 힘들게 클리어 !


'Game > webhacking.kr' 카테고리의 다른 글

[200] prob52  (0) 2015.05.26
[250] prob51  (0) 2015.05.26
[250] prob12  (0) 2015.05.21
[200] prob23  (0) 2015.05.18
[300] prob11  (0) 2015.05.18