일반적인 쉬운 SQL인젝션은 정상적이지 않은 입력에 대해
사용자에게 쿼리문 오류를 출력한다던지
쿼리 조작문에 대한 결과가 나와 정보를 캐낼 수 있는 반면, !!!
비정상적인 입력에 대해 별다른 오류도 나지 않고
어짜다 SQL 쿼리문을 사용함을 알게되어 조작하여도
사용자의 정보를 화면상으로 출력하지 않기 때문에
일반적인 SQL 인젝션으로는 정보를 캐낼 수가 없는 경우가 있다.
이럴때, SQL 쿼리문을 사용하고
입력값에 따라 id의 존재 유무를 알려주는 결과가 달라짐을 확인할 수 있다면
블라인드 SQL 인젝션 공격을 실행한다.
실습을 통해 알아보자.
우선 실습 환경 준비!
dvwa에 들어가서 보안레벨을 low로 설정한 뒤 블라인드 SQL 창으로 들어가자.
우선 블라인드SQL인젝션 실습에 들어가기 앞서
일반적인 SQL과 블라인드 SQL의 차이를 알아보자.
임의의 수 1을 입력한다. ( 존재하는 id를 입력했을 때 )
(이전의 SQL 인젝션을 통해 1은 존재한다는 걸 알고 있찌 )
일반적인 SQL인젝션이 가능한 오른쪽은 사용자의 정보를 페이지에 출력하지만
불가능한 왼쪽은 id의 데이터베이스의 존재 여부만 나올 뿐 정보는 출력되지 않는다.
비정상적인 값을 입력한다.
(쿼리문에 에러를 일으킬만한 ' 와 같은 것들 밑의 사진은 ' 를 입력했다.)
일반적인 SQL인젝션이 가능한 오른쪽은 SQL형식에러가 발생했음을 사용자에게 알려주지만
불가능한 왼쪽은 id가 존재하지 않는다고 출력될 뿐 에러의 여부는 출력되지 않는다
여기까지 둘의 차이를 알아봤으니 우리는 본격적으로 블라인드 SQL인젝션을 실습해보자.
위에서 SQL쿼리문을 사용하는지는 이미 알아냈지만 잊자
먼저 알아낼 정보는 입력값에 따른 결과가 다르게 출력되는지이다.
다음과 같이 임의의 수 5 와 6을 넣었더니
DB에 존재하는 id, 5과 존재하지 않는 id, 6의
출력된 결과값이 다름을 알 수 있다.
∴ 이 페이지는 입력값에 따라 결과가 다르게 출력된다.
다음으로 알아낼 정보는 이 폼이 SQL 쿼리문을 사용하는지이다.
위에서 입력값에 따라 출력되는 정보가 다름을 확인했으니
이 조건과 SQL쿼리 조작문을 활용하여 알아보자.
입력값 : 1’ AND 1=1# 인데
만일 이 폼이 SQL 쿼리문을 사용한다면 id=‘1’ 과 1=1이 모두 참이므로
사용자 가 존재한다고 출력할 것이며
SQL 쿼리문을 사용하지 않는다면 1’ AND 1=1#이
하나의 id로 인식되어 사용자가 없다고 출력될 것이다.
입력하니 결과로 다음과 같이 나온다.
이것으로 이미 SQL쿼리문으로 작동함을 대강 알 수 있지만
확실하게 하기 위해 한번 더 확인해보자.
거짓을 포함하는 입력문 : 1’ AND 1=2# 를 입력
그 결과로
id=‘1’ 은 참이지만 1=2가 거짓이므로 사용자가 없다고 출력된다
∴ SQL쿼리문을 통해 폼이 처리되고 있음이 확실
∴ 블라인드 SQL 인젝션을 실행 !!
그냥 참고 사항으로 Low 소스코드를 열어 SQL 쿼리문 여부 확인해보자
요 페이지의 우측 하단에 View Source를 누르면 소스 코드를 확인 할 수 있다.
하지만 어떤 웹사이트는 참 거짓에 따른 메시지가 같은 메시지로 응답된다
이럴 때 SQL 쿼리문을 활용하는지만 확인된다면
쿼리문의 SLEEP()과 같은 함수를 이용한다.
SLEEP() : 이 함수가 실행되면 페이지의 요청을 잠시 대기한 후에 보내도록 한다.
따라서 연산자를 이용하여 입력값의 참 거짓에 따라 SLEEP()함수를 실행하도록 하면
출력되는 결과가 같아도 참일 때와 거짓일 때의 응답시간이 달라지며
이를 통해 id의 존재 유무를 판별할 수 있다.
( 페이지의 응답시간을 확인해야 하므로 F12를 눌러 개발자 도구를 연 뒤 )
( Network 창을 열어야 한다. )
입력값 : 1’ AND SLEEP(5)#
입력했을 때 1이 DB에 존재한다면 SLEEP(5)가 실행되어
응답시간이 5초 정도 지연될 것이다.
(존재하지 않는다면 지연없이 곧바로 응답하겠지?!?!)
약 5초 정도 늦게 응답됬음을 확인할 수 있고
즉, id = 1이 존재한다는 것이다.!
그럼 6’ AND SLEEP(5)# 를 입력하여 보자
( 아까 6이 존재하지 않음을 확인했으므로 존재하지 않을 때는 어떤 결과가 나오는지 본다는 너낌으로 )
바로 응답이 온 것으로 보아 id=‘6’ 이 거짓이기 때문에
AND 다음 문장 인 sleep(5)이 수행되지 않았음을 알 수 있다.
'about Security > 웹보안과 해킹' 카테고리의 다른 글
[웹해킹문제풀이] # webhacking.kr 워게임 18번 (0) | 2020.10.04 |
---|---|
[웹해킹] # sqlmap 자동화 공격 (0) | 2020.10.03 |
[웹해킹] # SQL 인젝션 (0) | 2020.10.03 |
[웹해킹문제풀이] # webhacking.kr 워게임 26번 (0) | 2020.10.02 |
[웹해킹문제풀이] # webhacking.kr 워게임 4번 (0) | 2020.10.02 |
댓글