SQL 인젝션은 DB에 접근하는 폼에서 입력값을 검증하지 않을 경우, 악의적인 SQL 쿼리를 입력하여 DB 정보를 탈취하는 것이다. 시나리오를 살펴보자!
영화를 검색하는 폼이 나온다. 작은따옴표를 입력해서 취약점이 있는지 확인한다.
작은따옴표를 입력한 이유는 DB에서 작은따옴표로 문자 데이터를 구분하기 때문이다. 위와 같이 오류가 발생했으므로 쿼리 결과를 항상 참으로 만들고 나머지는 주석 처리하여 검색해보자.
모든 영화 목록들이 검색된 것을 볼 수 있다. 취약점을 확인했으니 다른 정보들도 알아보자.
SQL 질의어 중 SELECT는 특정 Column을 불러올 수 있는데 시나리오 사이트에 있는 영화 검색기도 select로 검색된 거다. 영화 검색기를 이용해서 select문으로 다른 정보들도 탈취를 할 수 있다. UNION을 사용하면 가능하다. union은 영어 단어 그대로 조합인데 두 개의 select문을 합칠 수 있다. 단 제약조건이 있는데 두 개의 select문의 컬럼 개수가 동일해야 한다.
union select 1# 로 시작해서 select 1,2# ... 점차늘려서 필드가 생성될때까지 검색해보자. 컬럼의 수가 같아야 한다는 제약조건을 이용한 방법이다. 2, 3, 4, 5에 sql구문을 넣어 원하는 정보를 나타낼수있다.
@@version 입력해 sql버전을 확인했다. 테이블 명도 확인할 수 있다.
'union select all 1,table_name,3,4,5,6,7 from information_schema.tables#
해석하자면 information_schema(데이터베이스)의 tables 테이블의 테이블 이름을 두번째 컬럼에 출력.
information_schema에는 데이터베이스에 속한 데이터들의 정보를 저장되어있는데 tables 테이블은 DB에 존재하는 테이블에 대한 정보를 제공한다.
users라는 테이블에 계정 정보가 있다고 추측할 수 있다. 이번에는 users 테이블의 컬럼 이름을 검색해보자.
'union select 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users'#
이제 컬럼의 이름도 알았으니 조합해서 사용자 계정 정보를 탈취해보자.
'union select 1,id,login,password,email,6,7 from users#
대응 방안으로는 mysql_real_escape_string 함수가 있다.
'공부 > bWAPP' 카테고리의 다른 글
SQL Injection (POST/Search, Select) (0) | 2020.02.24 |
---|---|
SQL Injection (GET/Select) (0) | 2020.02.23 |
Server-Side Includes (SSI) Injection (0) | 2020.02.20 |
PHP Code Injection (0) | 2020.02.19 |
OS Command Injection (0) | 2020.02.19 |