오늘은 드림핵에 있는 강의 내용을 요약하면서, sql injection에 대해서 알아볼 것이다.
1. DATABASE (DBMS)
먼저 sql injection을 배우기 전에 먼저 database지식이 있어야 한다.
Database는 일상생활에서 여러 가지 정보를 컴퓨터에 기록하는 데 사용한다.
그리고 이를 관리하는 것이 DBMS라고 하는 것이다.
Database에 저장된 내용을 이용하여 수정, 삭제, 기록을 하는 것이 DBMS이다.
DBMS는 관계형(Relational), 비관계형(Non-Relational) 으로 크게 나누어진다.
Relational Database : Table 형식, EX. MySQL, MariaDB, PostgreSQL, SQLite
Non-Relational Database : {Key: Value} 형식 EX. MongoDB, CouchDB, Redis
이번에는 관계형 데이터베이스에 초점을 두고 설명을 해볼 것이다.
먼저 관계형 데이터베이스는 "RDBMS"라고 한다.
RDBMS는 Table형식으로 데이터를 관리한다.
그리고 이를 조작할수 있는 SQL이라는 관계연산자를 제공한다.
SQL은 3개로 나뉜다.
DDL : 데이터를 정의한다. 데이터베이스(스키마)를 생성, 삭제, 수정 등을 한다.
DML : 데이터를 조작한다. 데이터베이스 내부의 데이터를 생성, 삭제, 수정 등을 한다.
DCL : 데이터베이스 안의 설정을 위한 것이고, 접근 권한을 주는 행위 등을 한다.
- DDL
CREATE를 이용하여 Database 혹은 Table 생성
Database(schema) 생성
CREATE DATABASE[db_name];
Database(schema) 사용
USE [db_name];
Table 생성
CREATE TABLE [table_name](
idx INT AUTO_INCREMENT,
boardTitle VARCHAR(100) NOT NULL,
boardContent VARCHAR(2000) NOT NULL,
PRIMARY KEY(idx)
);
- DML
데이터 생성 : INSERT
INSERT INTO [Table_Name](boardTitle, boardContent, createdDate) Values( 'Hello', 'World !', Now() );
데이터 조회 : SELECT
SELECT * FROM [Table_Name];
데이터 수정 : UPDATE
UPDATE [Table_Name] SET boardContent='DreamHack!' Where idx=1;
데이터 삭제 : DELETE
DELETE * FROM [Table_Name];
이쯤에서 광고한번 클릭해주세용~~^^
↓
↓
2. SQL injection
이제 본격적으로 sql injection에 대해서 알아보겠다.
SQL injection 이란, 사용자가 SQL 구문에 임의의 문자열을 넣어서 조작하는 것이다.
이를 이용해서 쿼리 인증을 우회하거나, 데이터베이스 내의 정보를 탈취할 수 있다.
예를 들어, 아래와 같은 sql구문이 있다고 가정해보자.
SELECT * FROM accounts WHERE user_id='HHJ' and user_pw='password'
이 뜻은 accounts 테이블에서 user_id가 HHJ이고 user_pw가 password인 정보를 가져온다는 것인데, 이를 쿼리 인증 우회를 하여 user_pw가 뭔지 상관없이, 아래처럼 user_id가 HHJ인지만 확인하고 정보를 가져오게 할 수 있다.
SELECT * FROM accounts WHERE user_id='HHJ'
이제 드림핵 실습을 통해서 예제를 살펴보겠다.
SQL 구문에서 문자열을 나타내는 것이 " , ' 에 따라 다르게 sql injection을 할 수 있다.
드림핵의 예제는 아래와 같다.
위처럼 로그인을 할 수 있는 폼이 있고, 아래에 SQL 구문이 입력에 따라 어떻게 달라지는지 확인할 수 있다.
그리고 SQL 쿼리 실행을 하면 SQL 구문이 실행된 결과를 보여준다.
아래는 예제에서 사용할 user_table이다.
1. 쿼리 인증 우회
첫 번째로 admin계정을 비밀번호 없이 로그인하는 방법에 대해 알아볼 것이다.
일단, 두 가지 방법이 있다.
- admin'or'1
첫 번째 조건은 uid가 “admin”인 데이터, 두 번째 조건은 이전의 식이 참(True)이고, upw가 없는 경우이다.
-admin'--
where를 uid까지만 받고 upw를 받는 부분은 -- 혹은 #을 이용하여 주석 처리한다.
2. admin 비밀번호 획득하기
admin 비밀번호를 알아내기 위해서는 데이터베이스를 다시 조회해야 한다.
그런 기능이 있는 sql구문 중 하나가 union이다. 아래와 같은 형식으로 사용하면 된다.
SELECT[1] ~~~ UNION SELECT[2] ~~~
그러면 앞부분에 uid를 출력하는 첫 번째 select를 아무것도 입력하지 않아서 출력을 막고 뒤에 union구문을 넣어서 공격을 시도하면 된다.
'Web' 카테고리의 다른 글
Dreamhack - Flask-Dev (write-up) (0) | 2022.01.01 |
---|---|
Dreamhack - file-csp-1 (write-up) (0) | 2022.01.01 |
Dreamhack(Wargame.kr) - Login filtering (0) | 2022.01.01 |
Dreamhack - simple-ssti(Write-up) (0) | 2021.12.29 |
JavaScript - HTML과 JS (0) | 2021.10.17 |