반응형
SMALL

이번에는 Blind SQL 인젝션에 대해 포스팅 해보려고 한다. Blind SQL 인젝션 공격 역시 활용도가 매우 높고 많이 사용하는 공격이기 때문에 취약점을 잘 찾아서 대비하는게 중요하다. 악의적인 쿼리를 삽입해서 사용자 id password를 알아낼수 있기 때문에 대비책이 어떤것이 있을지에 대해 고민해 봐야 할 것 같다.


1.  Blind SQL 인젝션이란?


- 쿼리의 결과를 참과 거짓으로만 판별시켜서 웹페이지를 공격하는 기법

- 출력내용이 참 아니면 거짓만 존재하기 때문에 데이터베이스의 내용들을 조작해서 공격하는 점이 가능하다는게 특징이다.


2. Blind SQL 인젝션 공격플로우


<사진출저: 보안프로젝트>


사용자 DB정보를 알아낼때 처음에는 참과 거짓으로만 판단해서 알아보고 해커가 어느정도의 길이가 필요한지 쿼리를 써서 알아내고 마지막에 최종적으로 아스키코드 쿼리를 대입시켜서 비밀번호를 찾아낸다. 이런 취약점이 발생하지 않도록 사전에 예방하는 것이 중요하다. 악의적인 쿼리가 어떤 것이 있는지, 어떻게 알아내는지 알아보자.



* 공격 실습*


(1) Blind SQL 인젝션 공격으로 쓰는 쿼리들



이런식으로 information_schema 데이터베이스를 사용하겠다고 명령문을 주고 테이블을 조회해보면 여러가지 정보들이 나오게 된다.



테이블의 table_name을 조회해보기 위해 select table_name from tables limit 0,1 명령어를 주면 table_name에 테이블이 있다고 표시되게 된다. 그리고 length명령어를 줘서 테이블이름의 길이를 조회해보면 14라는 결과값이 나오게 된다. 악의적인 해커들이 이런식으로 자신이 어느정도의 길이가 되는 정보를 알고싶은지 조회할 때 이런 쿼리를 쓰게 된다. 하나 더 추가로 아래 구문과 같이 = 1이라는 숫자를 붙여줬는데 이게 table_name안에 있는 테이블이 길이가 1이 맞는지 확인해보기 위해서 쓴다. 하지만 결과는 0(거짓)으로 나오게 된다. 




반면에 14라는 값을 주게 되면 1이 출력이 되게 되는데 이것은 참이라는 뜻이다. 아까도 봤지만 길이는 14였기 때문이다.



이제 길이를 알았기 때문에 암호화된 이름을 어떤식으로 푸는지 알아보자.



substr이라는 쿼리문을 썼는데 문자열 시작 위치에서부터 개수만큼의 글자를 가져오는 쿼리문이다. 

substr(문자열, 시작위치, 개수) 이런식으로 쿼리문을 구성해주면 된다. 주로 Blind SQL 인젝션 공격할 때 쓰는 대표적인 쿼리이다. 사진에서 보면 table_name에서 어떤 글자인지 알아보기 위해 조건문을 줬는데 뒤에 1,1이라고 썼는데 첫번째 글자부터 1개를 출력해서 C가 나온 것이고 2,1은 두번째 글자부터 1개를 출력해 H를 출력하는 형식으로 해서 테이블 이름을 알아내는 구조이다.



또 하나의 공격 쿼리가 있는데 참인지 거짓인지 알아보는 형식으로 푸는 쿼리이다.



이런형식으로 아까와 비슷한 쿼리문을 썼지만 맨 뒤에 A,B,C와 같은 문자가 붙었다는 것이 특징이다. 3번째 글자부터 1개를 출력해서 그게 A인지 B인지 C인지 판별해서 맞으면 1 틀리면 0을 출력시켜 테이블 이름을 알아내는 공격 쿼리이다. 이 또한 많이 쓰이고 있는 공격쿼리 중 하나이다.




마지막으로 아스키코드 방식으로 공격하는 쿼리가 있는데 어떤형식인지 알아보자.




이런형식을 띠고 있는데 ascii라는 쿼리문이 추가된 화면이 보일 것이다. 뒤에 65, 66은 아스키코드 번호인데 이런형식으로 참인지 거짓인지 판별해서 아스키코드 값을 해독해내서 알아내는 방식이 있다. 아스키코드를 잘 모른다면 구글에 아스키코드표가 있으니 그걸 참고해보면서 공부하면 될 것 같다.


(2) Blind SQL 인젝션 Boolean-Based 실습


이번에는 비박스를 활용해서 Blind SQL인젝션에 대해 실습해 보려고 한다. Boolean-Based라는 것을 선택하고 핵을 눌러준다.





이게 참인지 거짓인지 확인해보기 위해 'or 1=1 #이라는 명령어를 주고 탐색을 눌러보면 정상적으로 데이터베이스가 있다고 결과가 나오게 된다.(참)



반대로 'or 1=2 #이라는 명령어를 주고 탐색을 누르면 데이터베이스가 존재하지 않는다는 결과가 나오게 된다.(거짓)





이제 movie라는 테이블에서 id=1이고 첫번째 시작글자가 G가 맞는지 확인해보는 실습이다. 'or id=1 and substr(title,1,1) = "G" #이라는 쿼리를 입력하고 탐색을 누르면 결과가 참이라는 화면이 나오게 된다. 이런 기초 실습이 되어 있어야 후에 응용도 할 수 있으니 잘 알아두면 좋다.




반대로 타이틀 뒤에 2라는 것을 넣어주고 G가 맞는지 보면 데이터베이스가 없다고 거짓이 나오게 된다. 실제로 테이블을 확인해봐도 2번째에서 첫번째값은 G가 아님을 확인할 수 있다.



(3) Blind SQL인젝션 (WS/SOAP) 실습




이것도 아까 했던 실습과 큰 차이는 없다. 이번엔 웹페이지 URL을 바꿔서 알아보는 방법인데 이 역시도 title 취약점을 이용해서 해킹해보는 실습이다. 타이틀은 아무거나 주고 뒤에 or 'a'=a라고 입력하면 화면에 100movie~라는게 출력됨을 볼 수 있다. 해커들이 주로 이 방식을 이용해 공격한다.




반면 b라는 값을 넣어주면 화면에서와 같이 movie테이블에서 확인할 수 없다는 거짓판별을 내린다.



(4) sqlmap 테스트 실습


이번에는 sqlmap으로 배너를 알아보기 위한 실습이다. 지난번 포스팅에서도 한번 한거라 크게 어려움은 없을 것이다. 



칼리리눅스를 실행시키고 위와 같은 명령어를 입력해준다. 자신이 사용하고 있는 URL 주소와 프록시를 걸어서 알아낸 쿠키값을 넣어주고 실행시킨다.



그리고 몇분동안 실행이 진행되다 보면 banner가 실행되어 현재 시스템 정보들을 알아낼 수 있다. 지난 포스팅에서도 이야기 했지만 Sleep함수는 절대 함부로 쓰면 안되는 함수이다! 



Blind SQL인젝션 실습에 대해 간단히 포스팅 해봤는데 생각보다 노가다성도 강한 공격이다. 계속 바꿔주고 바꿔주는 형식으로 해서 공격해야 하는 방식이기도 하지만 해커들이 많이 사용하는 공격이기도 하기 때문에 잘 알아두면 대응책을 생각해 볼 수도 있을 것이다. 본인도 계속 알아가는 과정이며 많은 공부를 한다고 생각한다. 

반응형
LIST

'웹해킹 > Bee-box' 카테고리의 다른 글

인증결함  (0) 2017.12.29
XML/XPath 인젝션  (0) 2017.12.28
메타스플로잇(기초)  (0) 2017.12.28
sqlmap 활용법  (0) 2017.12.28
SQL 인젝션 기초  (0) 2017.12.26
블로그 이미지

만년필석사

,