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
https://www.youtube.com/watch?v=bIoGQ04biDg
'Web hacking > Nomaltic) 웹 해킹 수업 노트 👩💻' 카테고리의 다른 글
로그인 페이지 만들기를 위한 심폐소생 사이트 (1) (우분투에 SQL 실행, Sublime 실행법, 우분투 Chrome 열기, var/www/html 등) (0) | 2021.10.23 |
---|---|
[2주차]식별과 인증 (0) | 2021.10.20 |
Ubuntn 20.04에 APM 설치하기 (Apache2, Mysql. PHP) (0) | 2021.10.19 |
VirtualBox를 이용하여 Ubuntu 20.04 가상 머신 설치하기, 계속하기 버튼 설치 오류 해결법 (0) | 2021.10.19 |
APM? PHP란? (0) | 2021.10.16 |