webhacking.kr 55(브루트 포스)

Sirius·2023년 3월 28일


접속하면 데이터를 서치할 수 있는 화면이 나타난다.

1. 몇가지 실험

1. 게스트 데이터 이용


게스트 데이터에 들어가면 hello~라는 문자열이 출력된다.

1. 'h'검색

admin과 guest 둘다 데이터가 존재했다.

2. 'H' 검색

재밌는 사실을 하나 발견하였다. 바로 'H'를 검색해도 'h'와 결과가 똑같다는 사실이다.
이 논리가 설명되는 이유는 처음에 guest데이터는 분명'hello~'였는데 'H'를 쿼리문으로 요청해도 검색이 된다는 것이다.

3. 'Ell' 검색

데이터에 있는 'hello~' 중 Ell만 잘라서 검색을 해본다.

결과가 출력된다. 이를통해 확실히 일반적인 쿼리문은 아닌것을 추측해 볼 수 있다.
일반적인 select문이라면 정확한 그 데이터 'hello~'를 입력해야 검색이 될 것이다.

2. 쿼리문 예측

검색관련 쿼리문에서 주의해야할 2가지 문자가 있다.
바로 '%'와 '_' 이다.

1. '%'

select * from users where id Like '%apple%'

쿼리문 앞뒤에 %를 삽입하면, 위의 형식대로라면 apple이 들어가면 무조건 참을 반환한다.즉
ex> banapple, meloapplena, applelemon
위 3가지 모두 출력될 수 있다.

아까 우리가 본 guest 데이터('hello~')에서
1. 'a'
2. 'ell'
이렇게 2개 모두 결과가 출력 되었다. 즉 앞뒤로 %가 삽입되어 있어서 내가 입력한 값이 안에 있기만 하면 결과가 출력되는 것이다.

2. '_'

'_'는 '%'와 역할은 똑같지만 한자릿수를 차지한다는 큰 차이점이 있다.
이 두가지는 어떤 차이점이 있을까?

3. '%' vs '_'

위 2개의 차이점은 '%'는 불명확한 자리를 차지하지만 '_'는 명확한 한개의 자리를 차지한다는 점이다.

위의 그림으로 이 의문을 해결할 수 있다.

만약 아직까지 이해가 안간다면 밑의 논리로 이해를 해보자!

  1. '_'는 딱 한글자를 꼼수 쓸 수 있는 찬스를 가진다.
  2. '%'는 그 길이의 제한이 없어서 맘대로 꼼수를 쓸 수 있다.

따라서 admin에서 d는 '_' 한글자로 꼼수를 썼고, in은 %하나로 길이 제한 없이 꼼수를 써서 쿼리문이 작동했다.

이해한 것이 맞는지 확인하기 위해 '%'를 '_'로 바꿔보자.
역시 '_'는 하나당 한글자 꼼수가 가능한 것이기 때문에

3. 공격

아마 flag를 찾는 것일 것이고 그 flag는 admin의 데이터에 있을 것이다.
searching 을 통해 계속 대입하는 브루트 포스어택으로 푸는 문제일 것이다.

1. 자릿수 체크

브루트 포스를 하기전에 조사해야할 것은 그 자릿수가 얼마나 되는지의 여부이다.

한자릿수를 차지하는 치트키값은 바로 '_'이므로 '_'를 몇개까지 삽입해야 계속 admin이 출력되는지 체크하면 된다.

결과는 44글자이다.

2. 브루트 포스 어택

1. '_'와 '%'

기존의 문제풀이들을 보면 무논리로 그냥 뒷자리에 '_'을 빼고 '}' 을 삽입했다.

Q 그렇다면 '_'가 '}'대신 삽입이 된 이유는 무엇일까?
A 그 이유는 아스키 코드의 순서이다.

대부분의 사람들이 for문을 돌리면서 글자를 하나씩'FLAG{' 뒤에 삽입해 그 response에 admin이 있으면 그 상태로 for문을 빠져나갔다.

이 논리대로라면 만약 '_'가 다른 문자보다 먼저나오면 뒤에 아스키코드 문자는 체크해보지도 않은 채로 for문을 빠져나가게 되는 것이다. 즉 아스키 코드 순서상 '_'가 '}' 보다 먼저 나오기 때문에 '_'를 삽입하고 for문을 빠져 나오는 것이다.

Q: 그러면 '%'와 '_'는 고려할것도 없이 빼고 시작하면 되겠네요!
A: 아니다

정확히 표현하면 '_'가 실제로 데이터의 문자로 포함이 된 경우와 어떤 기능을 하는 문자인 경우를 구분해야 한다는 것이다. '%'역시도 그렇게 쓰일 수 있지만 치트키와 같은 값이므로 제외하고 생각할 것이다. 따라서 마지막값까지 response에 admin이 없다면 '_'를 뒤에 붙여 주는 것이다.

2. 공격방법 정리

1. '_'를 삽입하여 자릿수를 체크한다.(얼마나 반복할지)

-> 44번

2. 반복하면서 'FLAG{' 뒤에 계속 글자를 삽입해 나간다.

만약 response에 'admin'이 있으면 반복문을 빠져 나간다.

3. 마지막까지 response가 없다면 '_'를 글자 뒤에 삽입해준다.

3. 공격코드

https://github.com/S-SIRIUS/WEB_SECURITY/blob/main/bruitforce.py

0개의 댓글