본문 바로가기
[웹해킹]/[Webhacking.kr]

[Webhacking.kr] 60번

by Hevton 2020. 11. 29.
반응형

레이스 컨디션(Race Condition)과 세션에 관한 문제

 

 

소스보기

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
  login_chk();
  echo "Your idx is {$_SESSION['idx']}<hr>";
  if(!is_numeric($_COOKIE['PHPSESSID'])) exit("Access Denied<br><a href=./?view_source=1>view-source</a>");
  sleep(1);
  if($_GET['mode']=="auth"){
    echo("Auth~<br>");
    $result = file_get_contents("./readme/{$_SESSION['idx']}.txt");
    if(preg_match("/{$_SESSION['idx']}/",$result)){
      echo("Done!");
      unlink("./readme/{$_SESSION['idx']}.txt");
      solve(60);
      exit();
    }
  }
  $p = fopen("./readme/{$_SESSION['idx']}.txt","w");
  fwrite($p,$_SESSION['idx']);
  fclose($p);
  if($_SERVER['REMOTE_ADDR']!="127.0.0.1"){
    sleep(1);
    unlink("./readme/{$_SESSION['idx']}.txt");
  }
?>
<html><head><title>Challenge 60</title></head><body><a href=./?view_source=1>view-source</a></body></html>


일단 PHPSESSID를 변경해봐야겠다.

 

1.
아예 코드를 우회해보고자
123"))exit("hello");//
로 변경해보니 다시 값이 초기화됌

2.
숫자값으로는 재설정이 됌
(다시 로그인 필요)

 

 

레이스 컨디션 기법을 이용해, 하나는 '생성' 요청, 하나는 '확인' 요청을 통해 두 요청의 시간을 적절히 구상하여 문제를 풀 수 있을 것 같다.

 

세션이 같으면 같은 프로세스로 인식되므로(서버에서 하나의 유저로 인식) 두 요청의 세션값을 달리 해줘야한다.

한 계정으로도 세션값 쿠키가 여러개 존재할 수 있다는 걸 알게 됐다. (세션은 ‘연결 상태’니까 어찌보면 당연한.. 다른 곳곳에서 로그인될 때 각자 같은 프로세스를 가지면 안되니까..!)

다만 세션에 대해 주의할 점이 있다.
‘연결 상태’를 뜻한다는게, Session Hijacking이란 무서운 공격이 있듯이, A 계정으로 로그인된 상태의 Session 쿠키값 1 이 있고 B 상태의 계정으로 로그인된 Session 쿠키값 2가 있을 때, B의 Session 쿠키값을 A의 Session 쿠키값인 1로 바꿔주면 A로 바로 로그인되는 Session Hijacking 공격의 위험성을 알고 있어야 함..

 

 

이 문제를 풀기 위해 계정은 같고 세션값은 다른 두 개의 연결이 필요하므로 두 브라우저를 사용했다.

 

1. 크롬 브라우저

크롬 브라우저에서 기존 계정으로 로그인한 뒤, 세션 쿠키값을 임의의 숫자로 만들어준다.

(그리고 새로고침한 뒤 재로그인해주면 세션 쿠키값이 숫자값으로 잘 적용되어 있을 것이다.)

 

2. 파이어 폭스 브라우저

파이어 폭스 브라우저에서 기존 계정으로 로그인하면, 세션값이 당연히 1과는 다른 임의의 값으로 설정되어 있을 것이다.

이 값 또한 마찬가지로 숫자값으로 변경해준 뒤에 재로그인해주면 세션 쿠키값이 숫자값으로 잘 적용되어 있을 것이다.

참고로 1번 2번의 세션 쿠키값이 다르게 설정되어야만한다..!

 

 

그리고 1번에서는 일반 요청, 2번에서는 mode=auth를 적용하여 1번을 새로고침하자마 2번을 새로고침해준다.

 

반응형

'[웹해킹] > [Webhacking.kr]' 카테고리의 다른 글

[Webhacking.kr] 웹케알을 끝내며  (0) 2020.11.29
[Webhacking.kr] 61번  (0) 2020.11.29
[Webhacking.kr] 59번 + 멀티 바이트 취약점 정리  (0) 2020.11.28
[Webhacking.kr] 58번  (0) 2020.11.27
[Webhacking.kr] 57번  (0) 2020.11.26