※ 선행 학습 필요 개념
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의 계정으로 로그인 되는 것을 확인할 수 있다.
'모의해킹 > 웹해킹' 카테고리의 다른 글
[Web Hacking] XML 외부개체(XXE Injection) (0) | 2020.03.22 |
---|---|
[Web Hacking] WebGoat SQL Injection(mitigation) 문제풀이 (0) | 2020.02.25 |
[Web Hacking] WebGoat SQL Injection(advanced) 3 문제풀이 (0) | 2020.02.22 |
[Web Hacking] WebGoat SQL Injection 문제풀이 (0) | 2020.02.21 |
[Web Hacking] OWASP A1 인젝션 종류 (0) | 2020.02.14 |