효투의 세상 로딩중...
효투의 세상 로딩중...
반응형

SQL 인젝션

SQL 인젝션은 DB에서 사용하는 언어 SQL을 이용하여 데이터를 뽑아낼 때

SQL 쿼리문이 다른 결과를 가져오도록 검색 파라미터나 로그인파라미터 등에 SQL쿼리를 삽입하는 공격이다.

SQL인젝션 공격은 크게 3가지로 나뉜다

  • Error Based SQL injection
  • Blind SQL injection
  • Union SQL injection

실제 SQL injection 공격 가능성이 높은건 블라인드 SQL 인젝션이다.

블라인드 인젝션은 에러가 예외처리되어 에러가 발생하여도 웹서버의 반응이

그냥 데이터를 입력했을 때와 똑같을 때

select ( ) from ( ) where ( ) 쿼리에서 where절이 참값 또는 거짓값이 되도록하여

그 결과값의 차이로 데이터를 추출할 수 있다.

SELECT * FROM 게시판 WHERE 글유무 = 1 AND 글제목 LIKE '%" + result + "%' ORDER BY 글번호 DESC

위 쿼리는 아래 내 웹서버의 게시판 검색기능 쿼리이다.

 

초록색 result는 검색창의 파라미터를 가져오는 것이다 

만약 검색창에 숫자 1을 검색한다면 쿼리는 아래처럼 된다.

SELECT * FROM 게시판 WHERE 글유무 = 1 AND 글제목 LIKE '%" + 1 + "%' ORDER BY 글번호 DESC

%1% 앞뒤 어디든 1이 포함되어 있는 제목의 글을 다 검색하는 것이다.

이곳에 블라인드 SQL 인젝션 공격쿼리를 삽입하게되면 쿼리는 아래와같다

SELECT * FROM 게시판 WHERE 글유무 = 1 AND 글제목 LIKE '%" + 1' and 1=1 -- + "%' ORDER BY 글번호 DESC

글제목 LIKE '%1' and 1=1 까지만 where절이 완성되며 뒤에는 어떤 쿼리가 있든 주석처리가 되며 조건절은

1=1 즉 참이 된다. 조건이 true라 당연히 게시글이 검색된다.

1=2 false 거짓값을 삽입하게되면 아래와같이 게시글이 검색되지않는다.

글제목 LIKE '%1' and 1=2 로 and절 뒤가 거짓이기 때문에 조건이 성립되지않는다.

 

이런 방법으로 DB의 모든 테이블, 컬럼, 데이터 다 추출할 수 있다.

DB의 이름 글자수를 1부터 n번 숫자까지 true인지 false인지 하나씩 삽입해보며 알 수 있고

ASCII 코드로 대조하여 DB의 이름까지 추출할 수 있다.

1부터 7까지 1' and length((select user from dual))=7-- 을 삽입했을 때 게시글이 검색되지 않지만

1' and length((select user from dual))=8-- 을 삽입하게되면 게시글이 검색된다

DB유저명이 8글자로 되어있다.

DB유저의 문자를 확인하고 싶다면

ascii와 substr 기능을 이용하여 추출할 수 있다.

substr으로 1번째로 시작하는 문자를 잘라낸 뒤 ascii코드로 변환하여 그 값을 다른 아스키코드와 비교하여

true인지 false인지 확인하는 방식이다.

1' and ascii(substr((select user from dual),1,1))=84--

84를 입력했을 때 true가 반환되어 게시글이 검색되었다.

아래 아스키 코드표를 참고해보면 84는 'T' 이며 

DB 유저명의 첫글자가 T인것을 알 수있다.

아스키 코드 표

 

이런 방법으로 true가 반환되는지 false가 반환되는지 확인하여 true의 결과값들만 모아서

DB의 모든 데이터를 빼내는 것이다.

하지만 sql 인젝션에 취약하다 하더라도

사람이 하나하나 직접 모든값을 확인하기 힘들다.

보통 자동화도구를 python을 이용하여 직접 개발하여 사용하거나 깃허브에 공개된 자동화도구가 몇개있고

대표적으로는 칼리 리눅스의 sqlmap 툴을 사용하여 데이터를 추출한다.

실제로 공격이 가장 많이 발생하는 SQL 인젝션의 방법이며, 단순 필터링으로 시큐어 코딩을 한 서비스들도 존재하기에우회 구문또한 많이 존재한다.

 

 

반응형
  • hyotwo7658@gmail.com

복사 완료 👍