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

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

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

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

결과가 출력된다. 이를통해 확실히 일반적인 쿼리문은 아닌것을 추측해 볼 수 있다.
일반적인 select문이라면 정확한 그 데이터 'hello~'를 입력해야 검색이 될 것이다.
검색관련 쿼리문에서 주의해야할 2가지 문자가 있다.
바로 '%'와 '_' 이다.
select * from users where id Like '%apple%'
쿼리문 앞뒤에 %를 삽입하면, 위의 형식대로라면 apple이 들어가면 무조건 참을 반환한다.즉
ex> banapple, meloapplena, applelemon
위 3가지 모두 출력될 수 있다.
아까 우리가 본 guest 데이터('hello~')에서
1. 'a'
2. 'ell'
이렇게 2개 모두 결과가 출력 되었다. 즉 앞뒤로 %가 삽입되어 있어서 내가 입력한 값이 안에 있기만 하면 결과가 출력되는 것이다.
'_'는 '%'와 역할은 똑같지만 한자릿수를 차지한다는 큰 차이점이 있다.
이 두가지는 어떤 차이점이 있을까?
위 2개의 차이점은 '%'는 불명확한 자리를 차지하지만 '_'는 명확한 한개의 자리를 차지한다는 점이다.

위의 그림으로 이 의문을 해결할 수 있다.
만약 아직까지 이해가 안간다면 밑의 논리로 이해를 해보자!
따라서 admin에서 d는 '_' 한글자로 꼼수를 썼고, in은 %하나로 길이 제한 없이 꼼수를 써서 쿼리문이 작동했다.
이해한 것이 맞는지 확인하기 위해 '%'를 '_'로 바꿔보자.
역시 '_'는 하나당 한글자 꼼수가 가능한 것이기 때문에

아마 flag를 찾는 것일 것이고 그 flag는 admin의 데이터에 있을 것이다.
searching 을 통해 계속 대입하는 브루트 포스어택으로 푸는 문제일 것이다.
브루트 포스를 하기전에 조사해야할 것은 그 자릿수가 얼마나 되는지의 여부이다.
한자릿수를 차지하는 치트키값은 바로 '_'이므로 '_'를 몇개까지 삽입해야 계속 admin이 출력되는지 체크하면 된다.
결과는 44글자이다.
기존의 문제풀이들을 보면 무논리로 그냥 뒷자리에 '_'을 빼고 '}' 을 삽입했다.
Q 그렇다면 '_'가 '}'대신 삽입이 된 이유는 무엇일까?
A 그 이유는 아스키 코드의 순서이다.

대부분의 사람들이 for문을 돌리면서 글자를 하나씩'FLAG{' 뒤에 삽입해 그 response에 admin이 있으면 그 상태로 for문을 빠져나갔다.
이 논리대로라면 만약 '_'가 다른 문자보다 먼저나오면 뒤에 아스키코드 문자는 체크해보지도 않은 채로 for문을 빠져나가게 되는 것이다. 즉 아스키 코드 순서상 '_'가 '}' 보다 먼저 나오기 때문에 '_'를 삽입하고 for문을 빠져 나오는 것이다.
Q: 그러면 '%'와 '_'는 고려할것도 없이 빼고 시작하면 되겠네요!
A: 아니다
정확히 표현하면 '_'가 실제로 데이터의 문자로 포함이 된 경우와 어떤 기능을 하는 문자인 경우를 구분해야 한다는 것이다. '%'역시도 그렇게 쓰일 수 있지만 치트키와 같은 값이므로 제외하고 생각할 것이다. 따라서 마지막값까지 response에 admin이 없다면 '_'를 뒤에 붙여 주는 것이다.
-> 44번
만약 response에 'admin'이 있으면 반복문을 빠져 나간다.
https://github.com/S-SIRIUS/WEB_SECURITY/blob/main/bruitforce.py