728x90
반응형

선행 학습 필요 개념

 

Blind SQL Injection

Blind SQL injection은 데이터베이스에 참 또는 거짓 질문을하고 응용 프로그램 응답에 따라 답을 결정하는 SQL 주입 공격 유형입니다. 이 공격은 웹 응용 프로그램이 일반적인 오류 메시지를 표시하도록 구성되었지만 SQL 삽입에 취약한 코드를 완화하지 않은 경우에 종종 사용됩니다.

 

공격 유형

1) Boolean based Blind SQL Injection

[ 외부 입력값 ]
제목검색: hello' AND 1=1-- (유효한 검색단어와 항상 참이되는 조건 부여)

[결과]
게시판 검색됨  --> 참(true)이으로 간주


[ 외부 입력값 ]
제목검색: hello' AND 1=2--  (유효한 검색단어와 항상 거짓이 되는 조건 부여)

[결과]
게시물 검색 안됨 --> 거짓(false)으로 간주

 

2) Time based Blind SQL Injection

MS SQL Server 환경

[ 외부 입력값 ]
(DB의 시스템 계정이 sa 인지 판별하는 구문 삽입. 여기에서 검색어(hello)는 중요하지 않음)
제목검색: hello' ;  IF SYSTEM_USER='sa' WAITFOR DELAY '00:00:5'-- 

[실행되는 쿼리]
SELECT * FROM TB_Boards WHERE Title = 'hello' ;  IF SYSTEM_USER='sa' WAITFOR DELAY '00:00:2'

[결과]
1) 응답이 5초간 지연됨 -> 참(true) --> 시스템 계정이 sa임
2) 응답이 즉시 이뤄짐 -> 거짓(false) --> 시스템 계정이 sa가 아님

 

My SQL 환경

[ 외부 입력값 ]
(DB의 시스템 계정이 sa 인지 판별하는 구문 삽입. 여기에서 검색어(hello)는 중요하지 않음)
제목검색: hello AND sleep(5)#

[실행되는 쿼리]
SELECT * FROM TB_Boards WHERE Title = 'hello' AND sleep(5)

[결과]
1) 응답이 5초간 지연됨 -> 참(true) --> hello 검색어가 존재함
2) 응답이 즉시 이뤄짐 -> 거짓(false) --> hello 검색어가 존재하지 않음

 

※ WebGoat 문제풀이

 

Question : Can you login as Tom?

(하지만 여기서 tom이 계정이였다 대문자Tom이 아니라)

로그인 페이지에 쿼리를 참으로 만들어 주입해봐도 통하지 않는 걸 확인했다.

그럼 REGISTER 부분으로 들어가 살펴보도록 하자.

참인 조건을 주입하면 already exists 결과 값을 보여준다.

거짓인 조건을 주입하면 created 결과 값을 보여준다.

여기에서 정리해보면

참 -> exists

거짓 -> created

참, 거짓 결과에 따라 추측이 가능한 Blind SQL Injection이 가능한 것을 확인했다.

 

버프 스위트를 이용하여 Register에서 요청 패킷을 확인해보자

PUT 메소드를 이용하고, username_reg, email_reg, password_reg, confirm_password_reg 인자값을 이용해서 전달하는 것을 확인할 수 있다.

이제 파이썬 코드를 이용해서 패스워드의 길이를 구한 다음, 패스워드를 구해보도록 하자

프로그램을 돌리고 난 결과는

패스워드 길이 : 23

패스워드 : thisisasecretfortomonly

 

이 값을 로그인 페이지에 제출하게 되면 정상적으로 tom의 계정으로 로그인 되는 것을 확인할 수 있다.

728x90
반응형

+ Recent posts