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
참고하면 좋을 영상)
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 |