[어설픈] webhacking.kr 32번 문제풀이

2019. 2. 28. 10:41Web Hacking/Webhacking.kr

안녕하세요!

오늘은 webhacking.kr에서 150점짜리 문제!

32번 문제를 풀이해보도록 하겠습니다!


문제에 들어가니, 이렇게 

(1)랭킹 (2)사용자 이름 (3)hit 개수

3가지가 적혀있네요!


그런데 상당히 이 리스트가 길더라구요!

밑에 보면 아시겠지만, 787까지 있었어요!

맨 밑에 join 버튼이 있었어요!


근데 아직까지도 잘 뭐하는 건지 

어떻게 풀어야 하는지 

감이 잘 오지 않았습니다!


개발자 도구를 켜서 소스코드롤 보니 

엄청 길게 이 랭킹이 표현되어 있고!

이름 위에 커서를 갖다 대면 click을 할 수 있나봐요!


일단은 클릭하면 어떻게 되나

너무 궁금해서 상위 랭커 이름을 

클릭해보니 


이렇게 알림창이 뜨네요! 

no!



왜 안 된다 하는거지 .......???

어떻게 하면 되는거지.....???


근데 저도 방향을 잘 못 잡다가 

(click 때문에 시간 소요)

일단 다른 거 부터 해보려고


아까 787번째 밑에 있던

join 버튼을 눌러보기로 했어요!


join버튼을 누르니

제 webhacking.kr 아이디인 

terran이 뜨네요!


뭐 저 리스트에 제가 join한다

이렇게 볼 수 있는 건가요?


그래서 ctrl+f을 누르고

terran이라는 단어를 찾아봐라

이렇게 입력하니

제가 298 순위에 있네요!


흠........

이 문제 흐름상

내가 이 랭킹에 조인했으니

문제가 풀릴 수 있는 시나리오는


(1) 내가 1등랭커가 되면 문제가 풀린다?

(2) hit을 100/100으로 맞추고 압도적인 1등랭커가 되야 문제가 풀린다?



그리고 여기서 다시 어떻게 해야

난관에 봉착했습니다!


어떻게 해야 내 hit을 올릴 수 있을까....????

개발자 도구를 다시 키고

terran에 갖다 대보니


아까 제가 지나쳤던 click의 존재 이유를 

드디어 발견했네요!


제 아이디를 클릭하면 hit의 숫자가

올라가나봐요!


자바스크립트가

onclick="location.href='?hit=terran'"

이라고 되어 있어서요!



근데 계속 제 아이디를 클릭해봐도

계속 no!라고 알림창이 뜨는거에요..


그래서 아직 확인 안한 부분이 

뭐가 있을까?


(1) 소스코드 (주석이나 자바스크립트)

(2) parameter

(3) robots.txt, 혹은 숨겨진 다른 페이지(백업파일?)

(4) 쿠키

등등


1번은 했고 


2번 ?hit=가 있길래

hit parameter에 다른 값들을 입력해도

반응이 안와서 패쓰


3번 robots.txt는 이런 webhacking.kr 문제에는 잘 없는데

해봐도 없고, 백업 파일 같은 것도 이 문제 컨셉이랑 안 맞고


4번 쿠키 값에 뭐가 있나?

하고 쿠키에 들어가 보니 vote_check가 있네요!

값이 ok라고 되어 있길래


"아무 값으로 바꾸면 click해도 괜찮나?"해서 

 vote_check 값을 ok에서 1로 바꾼 다음에

 다시 제 아이디 이름 클릭했더니.....

no!라고 뜨네요..


vote_check값을 그냥 지워버리고 

제 아이디 이름을 클릭하니

하나씩 올라가더라구요!




드디어! 어떻게 푸는진 알았습니다!

근데 문제는 이걸 계속 매번 클릭할 때마다

(1) 쿠키에서 vote_check 값을 지우고

(2) 본인 아이디를 클릭한다 


너무 많은 수작업 아닙니까?

물론 장인 정신으로 저렇게 해도 문제가 풀리긴 합니다!


근데 저는 좀 다르게 풀어보도록 하겠습니다!

저도 풀이에서 python으로 exploit하는건

이번이 처음인거 같네요!

저도 잘 못해서 최대한 쉽게 설명해드리겠습니다!


제일 먼저 request라는 파이썬 library를 호출할 겁니다!

파이썬에는 많은 라이브러리가 있죠!

pwnable을 풀때는 

pwntools라는 파이썬 library를 사용하죠!

웹해킹 할때는 requests라는 라이브러리를 자주 사용합니다!


※ python requests 라고 구글에 치면

더 자세하게 정보가 나와있습니다!

웹에 요청보내고, 결과값 받고 이런 거 할때

requests가 편해요!


그래서 requests를 불러오고,

url에는 저희가 실행하고픈 url을 

넣으면 됩니다!


Q: 여기서 우리가 url에 넣어서 실행하고픈게 뭔데?

A: 저희 아이디 클릭하는거요!


아까 위에서 클릭하면 

자바스크립트로 onclick으로 ?hit=terran 실행된다 했죠?

저 ?hit terran이 

http://webhacking.kr/challenge/codeing/code5.html <---- 여기에 붙음

(Before)

| |

| |

(After)

http://webhacking.kr/challenge/codeing/code5.html?hit=terran

그래서 url에는 이것을 넣으면 되구요!

이러면 저희가 클릭했을 때랑 똑같아요!


그리고 cookie값은 

저희가 설정해서 보낼 수 있습니다!

여기서는 저희가 cookie에 적은 것만 cookie에 담기게 됩니다!

즉 "야, 내가 쿠키에 적은 거만 쿠키 값으로 보내!"


vote_check은 저희가 cookie 내용에 적지 않았으니

vote_check이 삭제된 것과 같겠죠?


그리고 쿠키에 넣을 때 양식은

괄호 안에

'쿠키 이름' : '쿠키 내용'

이건 약속이라 익숙해지셔야해요!


ex) 이런 식으로 입력하셔야 해요! 

'ZERG' : 'zerglings'

'Terran':'Marines'

'PHPSESSID' : '1f3sdvlgeo23gdagadaf'


물론 cookie값에 저희 PHPSESSID값을 넣어야 합니다!

왜?라고 물으시면

저희가 로그인할 때 PHP SESSION ID를 부여하는데

이 쿠키 없이 저희 url 내용을 실행시키면 

로그인 하라고 메시지가 뜹니다!


그래서 "terran의 아이디로 로그인해서 

해당 url을 실행시켜!"

하려면 PHPSESSID를 넣어주어야 합니다!


그리고 제일 중요한 requests.get( ) 이 형태로

저희가 requests를 보냅니다!

요청 보낼 사항들을 get( )인자로 보내는 거에요!


ex) requests.get(어떤 url?, 어떤 쿠키? , 어떤 데이터?, 계속 추가 가능함)

requests.get(url,cookies=★★ ,data=★★ )

★★부분에 데이터 입력하면 됩니다!


근데 여기서는 url과 쿠키만 보내면 되니

requests.get(url, cookies=★★) 

이 형태입니다!


★★에는 저희가 설정한 쿠키 값 

cookies={

'phpsessid' : 'da19ac694.....'

}

 cookies 넣으면 되요!


만약 이름을 바꿔서 

이렇게 했다면 

bullshit={

'phpsessid' : 'da19ac694.....'

}


requests.get(url,cookies=bullshit)

이렇게 하면 되요!


그리고 마지막으로 requests.get(url,cookies=cookies)값을

편하게 하기 위해서 res라는 변수에 그냥 담았습니다!

굳이 담기 싫으면 안담아도 돼요!


그리고 이 과정이 잘 됐나 

확인하기 위해서 print(i)를 넣었습니다!

(이따가 for문에서 설명 더 할게요!)


그 다음에 저는 for문(반복문)을 통해서

클릭을 100번 하게 강제 시켰습니다!


기본적인 사용 방법 

for i in range("숫자"):

| |

i가 "숫자" 만큼 반복 되는거에요!


그래서 for i in range(100): 하게 되면

100번 반복하게 되는거죠!


근데 파이썬은 들여쓰기를 잘해줘야해서

반복할 내용 url,cookies,res,print들을

 for문보다 안쪽에 위치 해야해요!

제가 한 것 처럼요!


결과적으로 i가 0부터 99까지 총 100번 실행되면서

얼마나 완료됐나?

실행 상황을 파악하고 싶으면

제가 앞에서 말한 print(i)를 통해 

 육안으로 확인이 되겠죠?


i가 0일때 커맨드 실행되고 

마지막에 i값 0 출력!

i가 1일때 커맨드 실행되고

마지막에 i 값 1 출력! 

이후 반복

(이하 생략)


저는 sublime text로 했는데!

이렇게 코드 짜시고

실행시키시려면 ctrl+shift+b 누르시면

바로 실행되요!


PHPSESSID는 공개해도 크게 상관없습니다: 왜냐면 로그아웃했다가 다시 로그인하면 바뀌어요 :)


물론 이 파일 저장하시고 

파이썬 키신다음에 

이 파일 open해서 f5 눌러도 되요!

그러면 아래와 같이 실행되면서 

출력 값이 떠요!


0~99까지 모두 캡쳐하기는 너무 길어서 

끝 부분만 캡쳐했습니다!

잘 실행됐죠?


그리고 32번 문제도 새로고침하면 이렇게

제 점수가 올라가네요!


좀 이따가 다시 새로고침하니 

97로 1등했죠?




결국에 완료하고

새로고침하면 congratulation이라고

뜨고 문제가 풀립니다!


문제풀이가 매우 길었는데

고생많으셨습니다!