블라인드 타입의 SQLi는 인밴드 타입 SQLi와 다르게 공격의 결과를 화면에서 직접 확인할 수 없다.
오류 메세지가 비활성화되어 쿼리문이 성공했는지 피드백이 없지만 인젝션 자체는 여전히 작동할 때 일어날 수 있다.
몇 가지 블라인드 인젝션의 시나리오와 함께 종류를 살펴본다.
가장 간단한 블라인드 인젝션은 로그인 양식 같은 인증 방법을 우회하는 것이다.
데이터를 탈취하거나 검색해보는 것이 목적이 아니라 로그인을 통과하는 것이 목적인 셈이다.
데이터베이스와 연결된 양식은 애플리케이션이 이름과 비밀번호의 내용 자체보다 두 값이 테이블에서 일치하는 쌍을 이루는지 여부를 묻는 경우가 많다.
"test 유저와 test1234 비밀번호를 가진 테이블 데이터가 존재하는가?"를 검색한다는 것이다.
그럼 아이디와 비밀번호를 추측하거나 탈취해 맞춰버리는게 아니라 애플리케이션이 True를 뱉도록 쿼리를 주입하면 될 것이다.

로그인 페이지가 존재하는 시나리오에서 쿼리문을 확인할 수 있다.
싱글쿼트 두개로 username과 password 필드는 처음에 비어있다.
그래서 해당 쿼리가 항상 참을 반환한다면 우리는 패스워드를 몰라도 로그인에 성공할 수 있다.

' OR 1=1;--
여러 인젝션용 입력값이 있지만 가장 간단하고 직관적인 공격이다.
' : 앞선 쿼리의 password값이 싱글쿼트로 닫혀있도록 입력 포멧을 유지함OR 1=1 : OR연산자를 사용해서 1=1의 true값을 전체 논리식의 true값으로 적용함;-- : 코드의 끝을 나타내고 다음 코드에 오는 싱글쿼트를 주석처리해 입력오류를 방지함boolean 기반은 참/거짓, 예/아니오, 1/0 혹은 두 가지 결과만 가지는 모든 응답을 확인할 수 있다. 그 응답을 활용하면 공격자는 페이로드가 성공했는지 여부를 알 수 있을 것이고, 제한된 응답 같지만 생각보다 더 큰 데이터를 나타낼 수도 있다.

브라우저의 내용에서 url의 username이 admin값으로 나와있고, boolean타입으로 보이는 taken값이 true인 것으로 보아 admin 계정은 이미 등록된 유저이다.

admin에서 admin123으로 바꿔 쿼리문을 확인했고, admin123을 유지한 채로 인밴드 인젝션때와 같이 column의 수를 확인해보자.
admin123' UNION SELECT 1;--에서 숫자를 늘려가면서 확인한다.

column의 수가 3인 것을 확인했고, 데이터베이스의 이름과 테이블을 확인해보자.

admin123' UNION SELECT 1,2,3 where database() like '%';--
% : 모든 문자 시퀀스와 일치하는 와일드카드물론 와일드카드로 검색했기 때문에 true가 나왔지만 이제 하나하나 대조해봐야 한다.
a%,b%,...처럼 한 글자씩 true, false값을 확인하면서 데이터베이스의 이름을 알아내는 것이다. 물론 _, -같은 데이터베이스 이름에 사용되는 특수문자까지 포함해서..

모든 응답을 다 적을 수는 없으니 고생해서 찾았다고 가정하자, 데이터베이스의 이름은 sqli_three이다 !!
그럼 이제 데이터베이스 내의 테이블을 나열할 수 있을텐데,,

admin123' UNION SELECT 1,2,3 FROM information_schema.tables WHERE table_schema = 'sqli_three' and table_name like 'a%';--
같은 방식으로 테이블 이름도 찾아내야 한다. information_schema를 활용해서 테이블 이름을 찾을 수 있는데, 이 또한 한 글자씩 대조해야한다. (해서)

users 테이블이 일치한다고 나왔다 !
sqli_three 데이터베이스의 users 테이블이 존재한다는 것이다. 그럼 뭐가 남았지?
바로 column 이름이 남았다. 뭔가 익숙하지 않은가?

맞다 COLUMN_NAME을 찾아야한다.
그런데 우리가 찾아야하는 것은 id와 password같은 credential 아닐까??


역시 그렇다.

username도 찾았다. 이것을 하나씩 검사할게 아니라 우리는 테이블에 존재하는 데이터를 보고싶은 것이므로 username 중에 가장 검색하기 쉬운 것을 찾아보자.

admin123' UNION SELECT 1,2,3 from users where username like 'admin
users 테이블에서 username 필드값이 admin인 것이 있는가 했더니 있다.
여기서 페이로드의 마지막에 ;--같은 문자가 빠진 것은 실제로 데이터가 있는지 판별해야하기 때문이다.
admin의 비밀번호인 password 필드값이 뭘까?

같은 탐색방식으로 password는 3845라는 것을 알아냈고 admin의 password값이 3845가 맞는지 확인하려면 like가 아니라 값을 찍어야 한다.