난이도가 좀 올라간 느낌
<?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 |