[웹해킹] SQL 인젝션 공격 실습 - 블라인드 SQL 인젝션

이번에는 블라인드 SQL 인젝션에 대해서 알아보자. DVWA의 블라인드 SQL 인젝션 페이지에 들어가서 1이라는 id를 입력해보자.

 

 

사용자 1에 대한 정보가 나오는 대신에 이 페이지에는 ID 1인 사용자가 존재한다는 것만 알려준다.

 

 


이번에는 지난번에 SQL 인젝션 공격을 할 때 했던 것 처럼 한 번 작은 따옴표를 입력해본다.

 

특별한 에러가 발생하는 대신 사용자가 존재하지 않는다는 메시지를 보여준다. 에러가 발생하지 않기 때문에 이 폼 뒤에 SQL 쿼리문이 사용되고 있는지, 또 우리가 조작할 수 있는지 쉽게 알기 어렵다. 만약 조작한다고 하더라도 데이터의 내용을 출력하지 않기 때문에 쉽게 정보를 빼내기도 어렵다.

 

 


이번에는 1'AND 1=1# 을 입력해본다.

ID가 존재한다고 나온다.

 

 

 

1' AND 1=2# 을 입력해본다.

이번에는 사용자가 존재하지 않는다고 나온다.
이 사실을 통해 1=1이나 1=2와 같은 조건이 실행되고 있다는 것을 알 수 있다. 만약 백그라운드에서 sql 쿼리문이 실행되고 있다고 한다면 형태는 아래 그림과 같을 것이다.

 

 

AND 1=1과 같은 조건을 주게 되면 전체가 참이 되므로 사용자가 있다고 나오고 AND 1=2와 같이 입력을 하면 조건문이 거짓이 되어 사용자가 없다고 나온다. 이렇게 어떤 폼 뒤에 AND 같은 연산이 실행되고 있다는 것은 SQL 쿼리문이 뒤에 있다는 것을 알려주는 중요한 힌트가 된다. 이걸로 무엇을 할 수 있냐하면 일반 sql 인젝션 공격 처럼 비록 결과를 직접적으로 얻어낼 수는 없지만 'admin이라는 사용자가 존재하느냐' 라는 식으로 어떤 명제를 제시하고 뒤에 AND 1=1이나 AND 1=2와 같이 다르게 조건을 줌으로써 그 명제가 참인지, 거짓인지는 알 수 있다. 이를 이용하면 시간은 비록 오래 걸리겠지만 원하는 정보가 있는지 없는지 알아 낼 수 있는 것이다.

이와 같이 결과를 직접적으로는 알 수 없어도 참, 거짓의 차이를 보고 어떤 정보를 알아 내는 기법을 블라인드 인젝션 공격이라고 한다. 한 가지 같이 알아두면 좋은 것은 참, 거짓 조건에 따라 dvwa 처럼 응답 메시지가 달라지는 경우도 있지만 어떨 때에는 표시되는 메시지가 완전히 같은 경우도 있다. 이럴 때에는 응답시간에 차이를 두는 것을 시도해 볼 수 있다.

예를 들면, 참일 경우 sleep 이나 wait for 같은 키워드를 이용하여 응답을 몇 초정도 늦게 오게 만드는 것이다. 응답 시간을 확인하기 위해 브라우저에서 F12를 누른다. F12를 누르면 developer 창이 뜨는데 여기서 network탭을 띄워 둔다. 그러고 나서 user ID에


1' AND sleep(5)#을 입력한다.

GET에 대한 요청이 6705ms 정도가 지난 것을 알 수 있다.

 

 

만약 존재하지 않는 사용자의 ID 6을 넣고 6'AND sleep(5)# 구문을 입력했을 때 어떻게 되는지 확인해보자.

1730ms로 응답이 바로 되었다. 이것을 통해 ID가 1이라는 사용자는 존재하고 6이라는 사용자는 존재하지 않는다는 것을 알 수 있다.


이러한 방식으로 블라인드 SQL 인젝션 공격을 통해 원하는 정보를 알아 낼 수 있다. 방금 우리는 손수 직접 공격을 했지만 사실 많은 정보를 찾아 내기에는 일일이 쿼리문을 만들어야 하고 또 어떤 경우에는 sleep 함수를 써야 하기 때문에 시간이 많이 걸린다. 따라서 이럴 때에는 프로그램을 사용하는 것이 유용하다.

 


다음 시간에는 SQL map이라는 자동화 프로그램을 이용하여 블라인드 sql 인젝션 공격을 실습해보겠다.

 

댓글

Designed by JB FACTORY