728x90
반응형

※ SQL Injection

사용자가 입력한 값을 검증하지 않고 데이터베이스 쿼리 일부분으로 포함될 때 발생하는 취약점이다.

쿼리문을 참을 만드는 SQL Injection을 시도하면 데이터가 출력되게 된다.

※ Union SQL Injection

2개 이상의 쿼리를 요청하여 결과를 얻는 UNION 이라는 SQL 연산자를 이용한 SQL Injection 공격을 말하며 이 연산자를 이용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 정보를 얻어낸다.

단, union를 사용할 때에는 컬럼의 갯수가 같아야 하고 데이터 형식도 같아야 한다.

Union select을 이용하여 DB명과 버전 등을 알아낼 수 있다. 관련 시스템 변수 및 함수는 아래와 같다.

database() : DB명을 알려주는 함수

user() : 현재 사용자의 아이디

system_user() : 최고 권한 사용자의 아이디

@@version : DB 서버의 버전

@@datadir : DB 서버가 존재하는 디렉터리

 

0' union select all 1,@@version,database(),user(),@@datadir,6,7#

이번에는 information_schema를 조회해보자.

 

0' union select all 1,table_name,3,4,5,6,7 from information_schema.tables#

이번에는 사용자의 민감 정보들을 가져와보자.

 

0' union select all 1,concat(id,login,password),3,4,concat(email,secret),6,7 from users#

여기서 concat함수는 여러 문자열을 하나로 합쳐주는 역할을 한다.

 

※ SQL Injection 대응방안

mysql_real_escape_string 함수를 사용하여 입력한 데이터를 필터링(특수문제들에 백슬래시를 붙여 SQL 문법으로 인식되지 않게 한다)

 

728x90
반응형

+ Recent posts