Web Hacking/SQL

Blind SQL Injection Attack

seungwon9201 2024. 6. 25. 12:10

Bline SQL Injection

결과를 직접적으로 알 수는 없어도, 참과 거짓일 때의 결과 차이를 분석해서 정보를 알아내는 해킹 기법

 

이번에는 일반 SQL injection과 Blind SQl injection의 차이를 알아보자.

 

 

실습 페이지로 가보자.

앞에서 실습했던 SQL injection 페이지와 동일한 화면이 나온다. 

 

앞에서 했던것 처럼 1을 입력해 보자.

기존의 SQL injection에서는 ID 1에 대한 정보가 나왔었는데 이제는 유저 ID가 존재한다는 내용만 출력이 된다.

 

이번에는 ' 를 입력해보자.

앞에서 했던 실습에서는 ' 를 입력했을 때 SQL syntax error가 발생했었지만 이번에는 유저 ID가 존재하지 않는다는 메시지가 뜬다.(여기서 에러가 발생하지 않도록 처리하는 루틴이 구현되어 있다는 사실을 알 수 있다!)

 

추가로 몇 가지 테스트를 해보자.

5를 입력했더니 역시나 유저 ID가 존재한다는 메세지가 뜬다.

 

이번에는 6을 입력했더니 유저ID가 존재하지 않는다고 뜬다.

 

여기서 우리는 데이터베이스에 ID가 1~5번까지인 사용자가 있다는 사실을 알 수 있고 데이터베이스에 없거나 비정상적인 값을 입력했을 경우에 유저ID가 없다는 사실을 알게 되었다!

 

그러나 별다른 에러가 발생하지 않아서 여기서 SQl 쿼리문이 사용되는지 알 수가 없다. 또한 SQL 쿼리문이 사용되고 있다고 하더라도 일반 SQL injection처럼 웹페이지에 출력값이 나오는 것이 아니기 때문에 정보를 쉽게 빼낼 수도 없다..

하지만, 만약 SQL 쿼리문이 실행된다는 것을 알아낼 수 있고 입력값에 따라서 유저의 존재 유무로 나타나는 결과값이 달라지게 된다면, SQL injection attack을 시도할 수 있다!

 

그럼 추가적인 테스트를 해보자.

1' AND 1=1#

위의 코드를 입력해 보자.

(이러한 코드를 입력한 이유 : 입력값을 처리할 때 SQL 쿼리문이 실행이 된다면 AND 조건이 같이 처리되기 때문에 SQL쿼리문인지 아닌지 파악하기 위하여)

항상 참이 되는 조건을 추가하여 결과값을 보니 유저 ID가 존재한다고 뜬다.

 

이번에는 다르게 입력해 보자.

1' AND 1=2#

이번에는 유저가 없다고 출력되었다.

-여기서 알 수 있는 점-
AND 이후의 조건에 따라서 결과가 바뀐다. 즉, 우리가 입력하는 값이 SQL 쿼리문을 통해서 처리된다!

 

즉, 여기서는 일반적인 SQL injection처럼 결과값이 모두 출력되는 것이 아니지만, "문자열의 첫 번째 값이 a인가?" 를 의미하는 쿼리문을 입력하면서 참과 거짓값을 분석하여 하나하나씩 알아내고자 하는 정보를 찾을 수 있게 된다..

 

출력값이 참과 거짓임을 분석하는 방법 말고 시간의 차이를 이용하여서 참과 거짓을 구별해 내는 방법도 있다.

 

1' AND SLEEP(5)#

이 처럼 sleep 함수로 참일 경우에 5초 뒤에 결과값이 나오고 거짓일 경우에 바로 리턴이 되도록 해보자.

응답시간을 확인하기 위하여 F12를 눌러서 개발자 툴 창을 확인해 보자.

빨간 원 확인

이 처럼 참일 경우에 약 5초(5012ms) 정도의 시간이 걸린 것을 확인할 수 있다.

 

이번엔 거짓일 경우를 입력해 보자.

6' AND SLEEP(5)#

빨간 원 확인

이처럼 7ms로 바로 응답이 되었다.

 

이러한 방식으로 참과 거짓에 따른 결과의 차이가 나타나기만 한다면 SQL injection 공격을 통해서 원하는 정보를 알아낼 수 있다. 그러나 일일이 쿼리문을 만들어야 하고 수많은 쿼리문을 실행해야 하는 문제가 있어서 시간이 오래 걸린다는 단점이 있다. 

 

이를 보완하기 위해서 자동화 프로그램을 많이 사용하기도 한다.

다음 글에서는 SQL injection 자동화 프로그램을 사용한 공격을 해보자.

'Web Hacking > SQL' 카테고리의 다른 글

Automated SQLMap Attack(sqlmap 자동화 공격)  (0) 2024.06.25
SQL Injection Attack  (0) 2024.06.21