본문 바로가기
[보안]/[LOS]

[LOS] ASSASSIN

by Hevton 2020. 12. 18.
반응형

난이도가 좀 올라간 느낌

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_assassin where pw like '{$_GET[pw]}'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("assassin"); 
  highlight_file(__FILE__); 
?>

머리를 써야 하는 문제다.

 

 

일단 like의 와일드문자 % _ 둘을 사용한다.

 

% 하나 입력했더니 guest로 로그인, 이로써 admin보다 guest가 먼저 데이터에 추가되어 있다는 사실을 알 수 있다.

 

_ 를 하나씩 늘려보면서, 로그인이 될때까지 시도했다.

 

-> ________ 즉. 8개일 때 guest로 로그인이 된다.

 

admin의 비밀번호는 그럼 이 이후 자리수일까.

 

_________% 즉. _ 9개와 % 1개를 통해 8자리수를 초과하는 모든 비밀번호 경우를 찾아봤더니 로그인이 안된다.

이로써 얻을 수 있는 결과는, admin과 guest 모두 비밀번호가 8자리라는것.

 

일단 앞자리를 알아내보고자 모든 경우의 수를 통해 admin으로 로그인 되는 경우를 찾아봤더니, 결과가 없다.

이를 통해 알 수 있는 건, admin과 guest의 비밀번호가 앞자리에 겹치는 부분이 있다는 것.

 

그럼, guest로 먼저 로그인되려는 이 상황에서 어떻게 admin의 데이터를 뽑아올 수 있을까?

하나하나 대입해주는 수 밖에 없다.

 

우선 guest의 비밀번호부터 프로그램을 통해 알아냈다.

 

90D2FE10

 

그리고 admin 또한 이 비밀번호와 앞에서부터 겹치는 부분이 꽤 있을테니 (이전에 8자리 검색으로 admin 로그인이 안됐으므로)

 

어디까지 겹치는지는 한자리씩 대입해봐야한다.

 

________ 를 guest의 비밀번호로 앞에서부터 한자리씩 차례로 대체해주고, 대체한 다음자리를 브루트포싱하면서 admin으로 로그인이 되는 경우를 찾는다. (admin으로 로그인이 되지 않는다면 브루트포싱하는자리까지도 guest와 비밀번호가 같다는 것이다. =  guest로 로그인 되었을 것이다)

 

그러다 보면 admin으로 로그인이 되기 시작하는 부분을 찾을 수 있고, 그 전까지 guest와 비밀번호가 같다는 걸 깨닫게 된다.

그리고 계속해서 admin 비밀번호의 남은 자리까지 브루트포싱하면 완성.

 

query : select id from prob_assassin where pw like '902EFD10'

 

 

 

반응형

'[보안] > [LOS]' 카테고리의 다른 글

[LOS] ZOMBIE_ASSASSIN  (1) 2020.12.22
[LOS] SUCCUBUS  (0) 2020.12.19
[LOS] GIANT  (0) 2020.12.17
[LOS] BUGBEAR  (0) 2020.12.16
[LOS] DARKKNIGHT  (0) 2020.12.15