webhacking.kr 27번, 32번 풀이

julia·2021년 3월 24일
0

원래 31번도 풀어야되는데 아직 방법을 못찾았다ㅜㅜ 내일 친구들한테 배워야지..ㅎㅁㅎ

💡 27번 문제 풀이

<?php
  if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
  $r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
  if($r['id']=="guest") echo("guest");
  if($r['id']=="admin") solve(27); // admin's no = 2
}
?>

일단 sql injection 문제이고
본격적으로 코드를 보면 admin의 no가 2이므로 no=({$_GET['no']})")) 이 부분을 조작해야 한다. 이 때 쿼터가 아닌 괄호로 묶여 있기 때문에 일단 no=0)으로 닫아주고 or no like 2로 no값을 조작해준다. (or로 연결되어있으므로 앞의 값이 거짓이어도 뒤의 값이 true가 되어 로그인이 되는 형태)
그러나 이게 끝이 아니라, preg_match로 값들을 우회하고 있기 때문에 띄어쓰기를 %09로 대체해주어야 하며, 주석(--)으로 뒤의 문장들을 지워줘야 한다. 그리고 찾아보니 --다음에 공백을 한 칸 입력해줘야한다고 한다. (왜인지 모르겠다ㅜㅜ 이것도 알게 되면 기록할 것)
따라서 =0%29%09or%09no%09like%092--%09 을 입력!!

💡 32번 문제 풀이


여기에 엄청 많은 사람들의 아이디가 있고 컨트롤f 해서 검색해보니 내 아이디도 찾을 수 있었다. 내 아이디를 클릭하니까 0/100 -> 1/100이 되었고, 또 클릭하니까 이미 투표했다는 알림이 떴다. 그래서 목표는 내 투표수를 100으로 만들기겠구나! 싶었고 쿠키값을 확인해보니

vote_check라는 이름의 쿠키가 있었다. (뭔가 내가 투표를 하면 저 값이 ok가 되는 것 같은..?) 그래서 처음에는 ok라는 값만 지우고 새로고침해서 투표를 해봤는데 투표가 다시 되길래 이렇게 하면 되는 거네~ 생각했는데 100번 ok 지우고 투표하는건 좀,, 너무 심한 노가다여서 금방 포기했다ㅋㅋㅋㅋ 결국 쿠키를 차단시키는게 답이겠다 싶어서 저 빨간 금지 표시를 눌렀러 ok라는 값을 블럭시켰다.

그래도 내 아이디를 100번 찾아서 눌러줘야되는건 똑같아서 결국 파이썬 돌리기로 했다ㅜㅜ

import requests

for i in range(100):
    url = "https://webhacking.kr/challenge/code-5/?hit=juliachoi"
    cookies={
        'PHPSESSID': '072ch7h9irj2gi2l9roqu78unk',  # 세션 아이디는 시간이 지나면 바뀜
    }
    res = requests.get(url, cookies=cookies)

이 코드를 돌리면, 100번 저 url로 진입하게 되므로 투표수가 자동으로 올라가는 것이다. (로그인했다는걸 알려주기 위해 cookies 에 세션아이디를 입력해주어야 한다.)
(늘어나는중.. )
드디어 1등을 했고 포인트 겟!!

😎 느낀점

난 아직 배울게 산더미다. 쿠키 필터적용도 처음해봤고 31번 풀어보겠다고 네트워크 관련 도구들 이것저것 깔아보고(아직 못풀었지만ㅋㅋ) 정말 이 워게임 풀면서 많은 도구들을 접해보게 되는 것 같다. 아직 새발의 피만큼 알지만, 앞으로는 더 익숙해져서 문제만 봐도 어떻게 접근해야할지 알 수 있게되는 그런 날을 기대해본다ㅎㅎ

profile
Move Forward

0개의 댓글