본문 바로가기

IT/웹 해킹(Web Hacking)

webhacking.kr [문제 9번]



중간에 알바면접이 있어서


포스팅을 못했다.


미루고 미루던 웹해킹 9번 문제를 풀어보겠다.







9번문제 무려 900point로 


전체 문제 중 두번째로 점수 배점이 높다.



해당 문제를 풀면 대략적인 다른 문제들의 난이도를 예상할 수 있을 것으로 예상된다.






문제 클릭시 다음과 같은 페이지를 보여준다.


소스코드를 확인해보자.







별다른 정보는 없지만


각 페이지가 no=1, no=2, no=3로 하이퍼링크 되어 있는 것을 확인할 수 있다.


실제 각각의 페이지를 확인해보자.



1번 페이지



2번 페이지


3번 페이지



다음과 같은 페이지를 분석해보니.


데이터베이스에서 no일때의 각각의 id값을 가져와


화면에 뿌려주는 것으로 확인된다.


또한 no=3일때의 id값의 길이는 11로 힌트가 주어졌다.



과연 해당 가설이 맞는지


no=4일때의 데이터를 가져와보자.







no=4일때의 데이터는 없는것으로 확인된다.


그러므로 해당 no값을 통해 id를 가져와 화면에 뿌려주는 것으로 확인되고


그것이 no=3일때의 id값이 해당 password로 예상된다.



그렇다면 어떻게해야 no=3일떄의 id값을 알아낼 수 있을까?



해당 데이터베이스를 이용하는 것이니


SQL injection을 활용하면 될것 같다.


일단 테스트용으로 쿼리문을 하나 날려보겠다.





앗 해당 결과로 보아하니 특정 문자열들은 필터링하는 것으로 확인된다.




삽질하다 찾아본 결과(죄송합니다 더열심히 공부하겠습니다 (__))



해당 문제는 Blind sql injection을 통해 풀 수 있다고 한다.





다음과 같은 쿼리문을 날리게 되면.


해당 쿼리를 문법적으로 해석해보자.





빨간색 네모 : 몇번째 문자를 가져올 것인가?


파란색 네모 : 어떤 문자와 비교할 것인가?


초록색 네모 : 해당 조건이 참일 경우 대입할 값


노란색 네모 : 해당 조건이 거짓일 경우 대입할 값



이를 기반으로 쿼리를 종합해보면


id값(문자열)의 첫번째 글자 하나를 가져와 해당 글자의 문자가 '0x26'인지 비교하여 


참이면 no=3번 페이지를 출력하고 


거짓이면 no=0 페이지를 출력하게 되는 것


으로 확인할 수 있다.






1) 일 경우의 쿼리





2) 거짓일 경우의 쿼리




해당 페이지의 "Secret"이라는 문자열을 가지고 왔느냐 가지고 오지 않았느냐를 통해 


우리는 해당 문자가 어떤 문자인지 파악할 수 있다.




그렇다면 파이썬 코드를 이용하여


반복문을 통해 해당 쿼리를 지속적으로 날려서


해당 페이지를 가져와 어떤 문자열이 있는지 비교하여


무엇이 참이고 무엇이 거짓인지 체크하면 되는 것이다.




파이썬 코드를 작성해보자. 


구글링하던 도중 좋은 소스코드를 발견했다. 


원활한 해석을 위해 구체적으로 주석을 덧붙히겠다.







해당 프로그램을 실행한 결과








어려웠다. 8ㅅ9









'IT > 웹 해킹(Web Hacking)' 카테고리의 다른 글

webhacking.kr [문제 11번]  (0) 2018.03.07
webhacking.kr [문제 10번]  (0) 2018.03.06
webhacking.kr [문제 8번]  (0) 2018.02.27
webhacking.kr [문제 7번]  (0) 2018.02.25
webhacking.kr [문제 6번]  (0) 2018.02.24