[Normaltic's CTF] SQL Injection Blind Practice

2024. 6. 5. 15:21정보보안 및 해킹/CTF

이상한 웃음

플래그를 찾아봅시다. 블라인드입니다. 아무것도 보이지 않는 상태에서 참과 거짓만을 이용하여 판별해야 한다는 것이죠.

우선 normaltic을 검색해보면, 쿼리문이 저렇게 되는군요.

그럼 일부러 틀린 닉네임을 검색해볼까요?

노말틱 여러명.. 분신술입니다. 복수형이 되었습니다.

보시다시피 쿼리문이 참일 경우에는 존재하는 아이디입니다, 쿼리문이 틀린 경우에는 존재하지 않는아이디입니다. 라는 문구를 도출합니다.

select문이 필터링 되는지 확인 여부와, 참인 조건을 넣었을 때 같은 결과가 나오는지 확인 절차를 거칩니다.

필터링 되고있지도 않고, 참인 조건을 넣었을 때

(select 'test') = 'test'

제대로 쿼리문이 참 으로 읽혀지고 있습니다.

그럼 본격적으로 Database부터 확인해보겠습니다

우선 Database의 첫 번째 글자의 아스키코드부터 확인해봅시다.

일단 Database의 글자 수를 모르기 때문에 편한 환경에서 작업하기 위해  Repeater로 보내줍니다.

그 이후에 URL Encoding되어있는 입력값을 다시 Decoding 해줍니다.

그래야 사람이 보기 편하니까요.

원래도 보기 편하시면 안바꿔도 상관은 없습니다.

훨씬 보기 편해졌습니다.

그럼 첫 번째 글자부터 시작해보겠습니다.

아스키코드의 숫자를 넣을 예정이기 때문에

이 표에 따라서 하면 됩니다.

저는 보통 70부터 시작하고, 쿼리문이 참일 경우에는 숫자를 증가, 거짓을 경우에는 감소시켜서 범위를 좁힙니다.

 

첫 번째 글자에서 97보다 크다 라는 질문에서 참이 나옵니다. 98을 넣어볼까요?

98은 거짓이네요?

이 이야기는 Database의 첫 글자는 97보다는 크고 98보다는 크지 않다 라는 이야기입니다.

크지 않다 라는 이야기는 작거나 같다 라는 이야기와도 일맥상통 하므로, 97보다는 크되, 98보다는 작거나 같다.

즉, Database의 첫 글자는 98입니다.

아스키코드에서 해당 글자의 넘버를 찾으면, b가 됩니다.

 

두 번째 글자는 108에서 걸리고

세 번째 글자는 105에서

네 번째 글자는 110에서

다섯 번째 글자는 100에서

여섯 번째 글자는 83에서

일곱 번째 글자는 113에서

여덟 번째 글자는 108에서

아홉 번째 글자는 105에서 걸렸고.

열 번째 글자는 존재하지 않았습니다.

존재하는지 않았는지 확인하는 것은, 지금까지 바꿨던 숫자 대신 0을 넣어보면 알 수 있습니다.

Database의 이름은 blindSqli 네요

그럼 테이블 이름을 검색해볼까요?

같은 절차를 거칩니다.

Repeater로 보내고

Decoding 한 후에

첫 글자부터 하나씩 확인합니다.

 

첫 번째 글자는 102에서

두 번째 글자는 108에서

세 번째 글자는 97에서

네 번째 글자는 103에서

다섯 번째 글자는 84에서

여섯 번째 글자는 97에서

일곱 번째 글자는 98에서

여덟 번째 글자는 108에서

아홉 번째 글자는 101에서 걸립니다.

열 번째 글자는 존재하지 않습니다.

테이블 이름은 flagTable이네요.

다음으로 컬럼 이름을 찾겠습니다.

지치지 마세요! 거의 다 왔습니다!

Repeater로 보내고

Decoding 하고

첫 번째 글자는..105

두 번째 글자는 100

세 번째 글자는 120... idx... 인덱스네요?

Limit를 잘못 설정했나봅니다.

다른건가봅니다.

Limit를 1번 인덱스로 늘려주고 다시 시작합니다.

첫 번째 글자는 102

두 번째 글자는 108

세 번째 글자는 97

네 번째 글자는 103.. flag! 제대로 찾았습니다.

마지막으로 데이터를 뽑을 차례입니다.

마지막으로 Repeater로 보내주고..

Decoding을 하고...

이건 제가 얘기할수가 없네요!

직접 풀어보세요!

이미 번호는 다 나와있지만 여러분이라면 직접 다시 풀어 볼 것으로 믿어 의심치 않습니다.

플래그가 직접적으로 나와있거든요..!