15.Assassin 풀이.
if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_assassin where pw like '{$_GET[pw]}'";
where 절에서 = 대신 like 절을 사용하여 패스워드를 확인하고 있다.
[']을 우회하지 못하게 preg_match로 막아놨다.
만약 eregi라고 하면 우회할 수 있다.
cf) like 사용법.
like %abc => abc로 끝나는 값.
like abc% => abc로 시작하는 값.
like %abc% => abc가 들어가는 값.
if($result['id'] == 'admin') solve("assassin"); id == admin만 만족하면 된다.
일단 비밀번호의 길이를 알기 위해 확인을 시작.
1 ~ 9 까지 하나씩 입력.
비밀번호는 일단 8자리인 것을 확인.
근데 흔히 Hello admin이라고 나오는데 Hello guest라고 나온다.
if($result['id']) echo "<h2>Hello {$result[id]</h2>";
if($result['id'] == 'admin') solve("assassin");
이 구문을 보면 id가 admin이라면 문제가 풀리니까 guest와 admin의 패스워드가 겹치도록 설정해놓은 것을 추측할 수 있다.
한 마디로 Hello guest가 나오는 게 맞다는 뜻.
두번째 자리를 알아보고 위해 0 ~ 9 입력.
두 번째 자리가 3일때 다시 Hello guest라는 문구가 등장.
세 번째 자리도 위와 동일한 방법으로 실행.
세 번째 자리가 2일때 드디어 Hello admin이라는 문구가 등장했다.
아마 세 번째 자리부터는 위에서도 말했듯이 guest와 admin이 안 겹치게 설정해놓은 거 같다.
아마 정확한 비밀번호는 832 ~!~!~ 인 거 같은데 이 문제는 832, 즉 세 번째 자리까지만 해결하면 풀리는 문제.
'# Related site issues > LOS' 카테고리의 다른 글
17.Succubus. (0) | 2018.05.08 |
---|---|
16.zombie_assassin. (0) | 2018.05.08 |
14.Giant. (0) | 2018.05.08 |
13.Bugbear. (0) | 2018.05.08 |
12.Darkknight. (0) | 2018.05.07 |