문제

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의 사용법이 잘못 된 부분이 있나보다 일단 값을 얻었으니 사용해보자

 

 

빙고

 

문제

Admin is Mine

50

admin 계정으로 로그인하자!

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

 


SQL Injection을 테스트하기 위해 ID = doldol' #  PW=dol1234로 요청을 보내보니 아래와 같은 결과를 볼 수 있었다.

 

보낸 #이후의 값이 없다.

 

예상으로는 #* 와같은 정규식으로 SQL 보내기 전 replace를 한다면 발생 할 수 있을 것 같다.

그렇다면 or는 동작할가?

 

일단 전송하는 단에서는 replace가 안되는 것으로 보인다.

 

그렇다면 doldol' or '1'='1로 전송을 보내보자 

실행되는 쿼리는 id='doldol' or '1'='1' and pw='dol1234'로 예상된다.

 

실패하는 것을보니 다른 방법으로 SQL Injection을 막는것 같다.

 

history를 찾아보자 

 

찾다보니 login.js 라는 파일을 찾았다.

응답 값으로부터 resultData가 'ok'라면 로그인 성공이라고 한다. 

응닶으로 오는 값을 ok로 바꿔보자

Action > Do intercept > response to this request

클릭해주고 forward를 누르면 해당 리퀘스트에 대한 response를 인터셉트 할 수 있다.

 

요청이 fail로 들어왔다. 이를 ok로 변조하여 전달해보

 

 

 

정답을 찾을 수 있었다.

문제

PIN CODE Bypass

50

핵미사일 시스템 접근 권한을 획득했다! 발사만 남았다! 가자!!!

 

step1.php
step2.php

 

아무 입력을 넣으면 step2.php?admin_pass=123 로 이동 하며 "비밀번호가 일치히 않습니다." 라고 나온다.

 

그런데 첫 페이지가 step1.php, step2.php이다. 그렇다면 다음 페이지는 step3.php로 직접 이동 하면 될 것 같다.

 

step3.php

발사 버튼을 누르면 정답이 나온다.

문제

Get Admin

50

admin 계정으로 접속하자!

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


SQL Injection Test

ID를 알고있으니 SQL Injection이가능한지 테스트 해보자

로그인 쿼리는 ID = '' and PW ='' 라고 한다면

  • id='doldol' #' : SQL Injection이 가능하고 #이 제거되지 않는다면 가능
  • id='doldol' or '1'='1' and pw='dol1234' :  and 연산이 우선되기에 해당 구문은 
    id='doldol' or ('1'='1' and pw = 'dol1234')와 같다 즉 pw가 틀려도 id가 일치하면 된다.
  • id='doldol' || '1'='1' && pw='dol1234' :
    만약  쿼리에 들어가기전에 and, or가 모두 삭제된다면?
  • id='doldol' -- 주석은 #뿐만 아니라 -- 도 있다고한다 

모두실패하는 것을 보니 SQL Injection은 불가능해 보인다.

 


쿠키 분석

로그인 성공 시 html과 쿠키 세션등 데이터를 확인해보자

 

loginUser라는 항목이 doldol로 보인다. admin으로 수정후 새로고침 해보자

 

 

로그인 여부를 쿠키의 아이디를 사용하여 체크하는 로직인듯 하다.

 

+ Recent posts