SQL Injection에 대해서 알아보자.
일단 Injection의 뜻은 뭘까? '삽입'이다.
그러면 SQL Injection의 뜻은? 'SQL을 삽입하여 공격을 한다는 뜻이다.
다시 말해서, 웹 어플리케이션의 Database에 질의(쿼리)를 하는 과정 사이에 일반적인 값 외에 악의적인 의도를 갖는 구문을 함께 삽입하여 공격자가 원하는 SQL 쿼리문을 실행하는 대표적인 웹해킹기법이다.
OWASP에서 발표한 보안 취약점 TOP 10에도 XSS와 함께 들었다.
참고로 그 다음 멘토링 주제는 XSS이다 ㅎㅎ
OWASP(The Open Web Application Security Project)란, 웹 어플리케이션 보안 관련 문서를 배포, 보안 취약점 진단 기준과 표준을 수립, 보안 취약점 관련 툴을 개발하는 비영리 단체이다.
본격적으로 SQL Injection에 대해 알아보기에 앞서서 먼저 Database에 대하여 알아보겠다.
(여기선 SQL Injection에 대한 이해를 위해 최소한의 지식만 적어놓았다. 더 자세하게 알기 위해서는 따로 공부해야 한다. 나중에 기회가 된다면 Database에 대해 포스트를 작성해보겠다.)
데이터베이스는 컴퓨터 내부에 Data를 테이블 형식으로 저장하는 것이다.
데이터베이스는 엑셀과 참 많이 닮았다. (엑셀도 데이터베이스다.)
하지만 다른 점이 있다면 데이터베이스는 Query를 이용하여 데이터를 추가,삭제,변경,조회하는 일들을 할 수 있다.
참고로 Query란 명령어라고 생각하면 되는데,
query라는 것을 이용하여 data를 추가,삭제,변경,조회하는 작업을 할 수 있다.
아 참고로 sql문 = query문이라고 생각하면 편하다.
방금 내가 query를 가지고 추가,삭제,변경,조회를 할 수 있다고 했다.
SQL Injection을 하기 위해서는 저기중에서 조회, 즉 select문에 대하여 알아야 한다.
(난 mysql을 사용하겠다. sql 종류에는 mysql 말고도 많다.)
나중에 sql injection 관련 문제들을 많이 풀어보면 언어의 종류에 따라 풀이가 달라지는 경우가 있다. (왜냐면 문법이 조금씩 다르니깐)
예를들면 mysql을 사용한 문제, mssql을 사용한 문제...
하지만 안타깝게도 작성자는 mysql도 겨우(?) 할 줄 알기 때문에 일!단!은! mysql 관련문제만 다음포스팅에서 다뤄볼려고 한다.
mysql> SELECT '칼럼명' FROM '테이블명' WHERE '조건문';
mysql> SELECT * FROM list;
*은 모든 칼럼을 가져온다는 뜻이다.
저 명령을 해석해보면 'list 테이블에서 모든 칼럼을 가져와라!'가 된다.
mysql> SELECT name FROM list;
이번에는 name 칼럼만 가져와봤다.
mysql> SELECT name FROM list WHERE studentID=1111;
조건문(WHERE)을 달아서 studentID가 1111인 학생의 name칼럼만 가져와봤다.
이렇게 WHERE문을 적음으로 '어떤 조건'을 충족시키는 칼럼을 가져올 수 있다.
자!!!! 이제 진짜 본격적으로 SQL Injection에 대하여 알아보자!!!
위에서 SQL Injcetion이란 웹 어플리케이션의 Database에 질의(쿼리)를 하는 과정 사이에 일반적인 값 외에 악의적인 의도를 갖는 구문을 함께 삽입하여 공격자가 원하는 SQL 쿼리문을 실행하는 대표적인 웹해킹기법이라고 했다.
주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우에 발생한다.
요즘의 거의 모든 데이터베이스 엔진은 유저 입력이 의도치 않은 동작을 하는 것을 방지하기 위해 escape 함수와 prepared statement라는 것을 제공한다.
공격유형
<Error based SQL Injection>
1. 논리적 에러를 이용한 SQL Injection
가장 대중적인 공격 기법이다. 보통 아디이와 패스워드를 입력하는 로그인 페이지를 타켓으로 행해지는 공격이다.
②악의적인 사용자가 임의의 SQL 구문을 주입하였는 것을 확인 할 수 있다.
주입된 내용은 ' OR 1=1 -- 라는 구문인데 '은 WHERE절의 싱글쿼터를 닫아주기 위해서 사용했고, OR 1=1 은 WHERE절을 모두 참으로 만들고, -- 을 넣어줌으로 뒤의 구문을 모두 주석 처리를 하였다.
③매우 간단한 구문이다. 하지만 이 구문으로 Useres에 있는 모든 칼럼들을 조회하게 됨으로써 가장 먼저 만들어진 계정으로 로그인에 성공하게 된다. 보통 관리자(admin)의 계정을 맨 처음 만들기 때문에 관리자 계정에 로그인 할 수 있게 된다.
관리자 계정을 탈취한 악의적인 사용자는 관리자의 권한을 이용해 또 다른 피해를 발생할 수 있게 한다.
이 외에도 Union based SQL Injection, Blind SQL Injection, Stored Procedure SQL Injection, Mass SQL Injection 등등이 있다. 관심있으면 직접 찾아보기 바람...
그냥 사담...
멘토링 취지가 흥미유발이기 때문에... 그냥 흔하고 가볍게 썼음 ㅎㅎ... 나중에 시간되면 따로 포스팅 해보겠당... Blind SQL Injectin은 특히 꼭 포스팅해보고싶다. ctf문제에 많이 나왔는데 하나도 못품ㅋ
방어방법
1. 대부분의 SQL Injection의 경우 값을 입력받을 때 특수문자 여부를 검사하여 방어한다.
2. Error Message의 노출을 금지해야한다.
3. 웹 방화벽을 사용한다.
4. Statement 대신 preparestantement를 사용하자
-mysql의 Preparedstatement 구문을 상요하면 특수문자를 자동으로 escaping해준다.
일단 이정도로 sql injection 개념은 간단하게 써보고 다음 포스팅엔 관련 예제문제를 풀어보겠다!
'BOSS > 웹 멘토링' 카테고리의 다른 글
[20 BOSS] URI, URL의 구조 (0) | 2020.04.25 |
---|---|
[20 BOSS] 웹 멘토링(1) - 웹개요 (0) | 2020.04.25 |
[금오공대 BOSS] 웹 멘토링(5)-XSS와 CSRF (1) | 2019.10.06 |
[금오공대 BOSS] 웹 멘토링(3)-쿠키와 세션 (0) | 2019.10.05 |