

첫 번째 문제를 번역기로 해석해 보니
SQL이란 무엇인가요?
SQL은 관계형 데이터베이스를 관리하고 데이터에 대한 다양한 작업을 수행하는 데 사용되는 표준화된(ANSI는 1986년, ISO는 1987년) 프로그래밍 언어입니다.
데이터베이스는 데이터의 모음입니다. 데이터는 행, 열, 표로 구성되고 인덱싱되어 관련 정보를 더욱 효율적으로 찾을 수 있습니다.
예제 SQL 테이블에는 직원 데이터가 포함되어 있으며, 테이블의 이름은 '직원'입니다:
직원 테이블 :
| userid | first_name | last_name | department | salary | auth_tan |
|---|---|---|---|---|---|
| 32147 | Paulina | Travers | Accounting | $46.000 | P45JSI |
| 89762 | Tobi | Barnett | Development | $77.000 | TA9LL1 |
| 96134 | Bob | Franco | Marketing | $83.700 | LO9S2V |
| 34477 | Abraham | Holman | Development | $50.000 | UU2ALK |
| 37648 | John | Smith | Marketing | $64.350 | 3SL99A |
회사는 데이터베이스에 다음과 같은 직원 정보를 저장합니다: 고유 직원 번호('userid'), 성, 이름, 부서, 급여 및 거래 인증 번호('auth_tan'). 이러한 각 정보는 별도의 열에 저장되며 각 행은 회사의 한 직원을 나타냅니다.
SQL 질의는 데이터베이스 테이블과 인덱스 구조를 수정하고 데이터 행을 추가, 업데이트 및 삭제하는 데 사용할 수 있습니다.
SQL 명령어에는 세 가지 주요 범주가 있습니다:
데이터 조작 언어(DML)
데이터 정의 언어(DDL)
데이터 제어 언어(DCL)
이러한 각 명령 유형은 공격자가 시스템의 기밀성, 무결성 및/또는 가용성을 손상시키는 데 사용할 수 있습니다. SQL 명령 유형과 보호 목표와의 관계에 대해 자세히 알아보려면 수업을 진행하세요.
SQL 문제로 여전히 어려움을 겪고 있고 더 많은 정보나 실습이 필요하다면, http://www.sqlcourse.com/ 을 방문하여 무료 및 인터랙티브 온라인 교육을 받을 수 있습니다.
요약
1. SQL은 관계형 데이터베이스로 데이터는 행, 열로 구성한 테이블이다.
2. SQL 질의는 이러한 테이블을 수정, 추가, 업데이트, 삭제를 할 수 있다.
3. SQL을 다루는 명령어는 3가지로 데이터 조작 언어(DML), 데이터 정의 언어(DDL), 데이터 제어 언어(DCL) 이렇게 구성된다.
4. 이러한 명령어를 가지고 어떤 공격이 가능한지 알아보자

문제를 확인해 보니
예제 표를 확인해서 직원 Bob Franco의 부서를 질의문을 사용해서 조회하라는 문제입니다. 그리고 전체 관리자 권한이 부여되었으며 인증 없이 모든 데이터에 액세스할 수 있다고 합니다.

실행 순서
1. FROM: 어느 테이블에서?
2. WHERE: 어떤 조건으로 걸러서?
3. GROUP BY: 어떻게 묶어서?
4. HAVING: 묶인 결과 중 무엇을?
5. SELECT: 어떤 컬럼을 보여줄지?
6. ORDER BY: 어떻게 정렬할지?
7. LIMIT: 몇 개나 보여줄지?
Query : select department from Employees where first_name='Bob'
해당 질의문을 해석해 보면
1. FROM(어디서) => 직원 테이블에서
2. WHERE(조건) => 첫 번째 이름이 Bob인 사람
3. SELECT(조회) => 찾아 줘
요약
직원 테이블에서 첫 번째 이름이 Bob인 사람에 부서를 조회해줘
그러면 Bob의 부서는 Marketing(마케팅)이라고 나오면서 문제가 해결됩니다.

두 번째 문제를 번역기로 해석해 보니
데이터 조작 언어(DML)
이름에서 알 수 있듯이 데이터 조작 언어는 데이터 조작을 다룹니다. SELECT, INSERT, UPDATE, DELETE 등 가장 일반적인 SQL 문 중 상당수는 DML 문으로 분류될 수 있습니다. DML 문은 레코드 요청(SELECT), 레코드 추가(INSERT), 레코드 삭제(DELETE), 기존 레코드 수정(UPDATE)에 사용할 수 있습니다.
공격자가 SQL 데이터베이스에 DML 문을 "주입"하는 데 성공하면 시스템의 기밀성(SELECT 문 사용), 무결성(UPDATE 문 사용), 가용성(DEETE 문 또는 UPDATE 문 사용)을 위반할 수 있습니다.
DML 명령어는 데이터를 저장, 검색, 수정 및 삭제하는 데 사용됩니다.
SELECT - 데이터베이스에서 데이터 검색
INSERT - 데이터베이스에 데이터 삽입
UPDATE - 데이터베이스 내 기존 데이터 업데이트
DELETE - 데이터베이스에서 레코드 삭제
Example:
데이터 검색:
전화 선택
직원들로부터
사용자 ID = 96134;
이 문장은 사용자 ID 96134를 가진 직원의 전화번호를 가져옵니다.
요약
1. SQL 문 중 상당수는 DML 문으로 분류된다.
2. DML 문은 요청(SELECT), 레코드 추가(INSERT), 레코드 삭제(DELETE), 기존 레코드 수정(UPDATE)에 사용된다.
3. 해커가 해당 DML 문을 사용하는 데 성공하면 시스템의 기밀성(SELECT 문 사용), 무결성(UPDATE 문 사용), 가용성(DEETE 문 또는 UPDATE 문 사용)을 위반된다.

두 번째 문제를 확인해 보니
전체 관리자 권한이 부여되어 있으니 Tobi Barnett의 부서를 Sales로 변경해 보라는 문제입니다.

Query : update Employees set department='Sales' where first_name='Tobi'
해당 질의문을 해석해 보면
1. FROM (대상 테이블 확인) => 직원 테이블에서
2. WHERE (필터링) => 첫 번째 이름이 Tobi인 사람
3. SET (UPDATE) => 부서를 Sales로 수정할게.
요약
직원 테이블에서 첫 번째 이름이 Tobi인 사람에 부서를 Sales로 수정할게.
그러면 Tobi의 부서는 Sales(영업)로 변경이 되면서 문제가 해결됩니다.

세 번째 문제를 번역기로 해석해 보니
데이터 정의 언어(DDL)
데이터 정의 언어에는 데이터 구조를 정의하는 명령어가 포함되어 있습니다. DDL 명령어는 일반적으로 데이터베이스의 스키마를 정의하는 데 사용됩니다. 스키마는 데이터베이스의 전체 구조 또는 조직을 의미하며 SQL 데이터베이스에서는 테이블, 인덱스, 보기, 관계, 트리거 등과 같은 객체를 포함합니다.
공격자가 데이터베이스에 DDL 유형의 SQL 명령을 성공적으로 "주입"하면 시스템의 무결성(ALTER 및 DROP 문 사용)과 가용성(DROP 문 사용)을 위반할 수 있습니다.
DDL 명령어는 데이터베이스 객체의 구조를 생성, 수정 및 삭제하는 데 사용됩니다.
CREATE - 테이블 및 보기와 같은 데이터베이스 객체 생성
ALTER - 기존 데이터베이스의 구조를 변경합니다
DROP - 데이터베이스에서 객체 삭제
Example:
요약
1. DDL은 DB의 스키마를 정의한다. 스키마=데이터베이스 설계도 라고, 생각하면 좋을 거 같습니다.
2. 해커가 해당 DDL 문을 사용하는 데 성공하면 시스템의 무결성(ALTER 및 DROP 문 사용)과 가용성(DROP 문 사용)이 위반된다.

세 번째 문제를 확인해 보니
"직원" 테이블에 "전화"(varchar(20)) 열을 추가하여 스키마를 수정해 보라는 문제입니다.

Query : alter table employees add column phone varchar(20)
해당 질의문을 해석해 보면
1. FROM (대상 테이블 확인) => 직원 테이블에서
2. WHERE (필터링) => 첫 번째 이름이 Tobi인 사람
3. SET (UPDATE) => 부서를 Sales로 수정할게.
요약
직원 테이블에서 첫 번째 이름이 Tobi인 사람에 부서를 Sales로 수정할게.
Tobi의 부서는 Sales(영업)로 변경이 되면서 문제가 해결됩니다.

네 번째 문제를 번역기로 해석해 보니
데이터 제어 언어(DCL)
데이터 제어 언어는 데이터베이스에서 액세스 제어 로직을 구현하는 데 사용됩니다. DCL은 테이블, 보기, 함수와 같은 데이터베이스 객체에 대한 사용자 권한을 취소하고 부여하는 데 사용할 수 있습니다.
공격자가 데이터베이스에 DCL 유형의 SQL 명령을 성공적으로 "주입"하면 시스템의 기밀성(GRANT 명령 사용)과 가용성(REVECORE 명령 사용)을 위반할 수 있습니다. 예를 들어, 공격자는 데이터베이스에 대한 관리자 권한을 스스로 부여하거나 실제 관리자의 권한을 취소할 수 있습니다.
DCL 명령어는 데이터베이스 객체에 대한 접근 제어를 구현하는 데 사용됩니다.
GRANT - 데이터베이스 객체에 대한 사용자 액세스 권한 부여
REVOKE - 이전에 GRANT를 사용하여 부여된 사용자 권한 철회
요약
1. DCL은 DB 객체에 대한 사용자 권한을 부여, 취소할 수 있다.
2. 해커는 스스로에게 권한을 부여하여 관리자 권한을 획득하여 실제 관리자의 권한을 취소할 수 있다.

네 번째 문제를 확인해 보니
grant_rights 테이블을 이용할 수 있게 unauthorized_user 사용자에게 권한을 부여하라는 문제입니다.

Query : grant all privileges on grant_rights to unauthorized_user
해당 질의문을 해석해 보면
1. ON (해당 테이블) => grant_rights 테이블에서
2. TO (권한을 부여받을 사용자) => unauthorized_user 사용자에게
3. SET (UPDATE) => 모든 권한을 부여한다.
요약
grant_rights 테이블에서 unauthorized_user 사용자에게 모든 권한을 부여한다.
unauthorized_user 사용자에게 모든 권한을 부여하게 되면 문제가 해결됩니다.

다섯 번째 문제를 번역기로 해석해 보니
문자열 SQL 인젝션을 시도해 보라는 거 같습니다.

문제를 확인해 보니
문자열 SQL 인젝션을 하기 위한 기본 세팅이 되어있네요. 하나하나 맞춰 나가보겠습니다.

첫 번째 드롭박스를 열어보니 5개의 선택지가 존재합니다.
1. Smith
2. 'Smith
3. '
4. 'Smith'
5. Smith'
여기서 정답은 3번과 5번이 모두 정답입니다. 3번은 앞에 구문은 싱글 쿼터의 문법만 맞춰주면 되기 때문에 어떠한 값을 넣어도 상관없으므로 싱글 쿼터 하나만 있어도 문법적 오류는 생기지 않기 때문에 사용할 수 있습니다. 5번도 마찬가지로 문법적 오류가 해결하면 되기 때문에 알맞은 문자열로는 Smith' 이겠죠? 왜냐하면 앞에 'John'처럼 싱글 쿼터 안에 문자열을 넣어줘야 합니다. first_name = 'John' AND last_name = 'Smith' 이렇게 해줘야 " ' "(싱글 쿼터)에 문법적 오류가 나질 않습니다.

두 번째 드롭박스를 열어보니 3개의 선택지가 존재합니다.
1. or
2. and
3. and not
여기서 정답은 1번째 or 이겠죠? 설령 앞에 값이 false 값이어도 뒤에서 or 구문 덕분에 뒤가 참이면 결괏값은 true 값이 반환되기 때문입니다.

세 번째 드롭박스를 열어보니 6개의 선택지가 존재합니다.
1. 1=1
2. 1=2
3. 1'='2
4. '1'='1
5. '1'='2
6. Last_Name='Smith
여기서 정답은 4번째 '1'='1 이겠죠? 여기서 '1'='2도 맞지 않을까? 라고 생각하시는 분들도 계실 거로 생각합니다. 우리가 보통 코딩할 때는 '='(부등호)는 대입의 의미를 지니지만 SQL에서는 '=='(같다) 라는 의미로 사용됩니다. 그래서 여기서는 '1'='1값이 즉, 1=1은 같은가? 서로 같은지 물어보는 거니 당연히 맞을 것이고 '1'='2값은 1이 2와 같은가?라고 해석되기 때문에 거짓인 false 값은 반환되기 때문에 틀렸습니다.

Query : SELECT * FROM user_data WHERE first_name = 'John' and last_name = 'Smith' or '1' = '1'
이렇게 형식에 맞게 넣음으로써 앞에 'John' 과 'Smith'는 결괏값과 상관없이 뒤에 '1'='1'이 무조건 성립하기 때문에 user_data 테이블에서 모든 정보를 조회할 수 있게 되었습니다.

여섯 번째 문제를 번역기로 해석해 보니
이번에는 문자열이 아닌 숫자로 SQL 인젝션을 시도해 보라는 문제 같습니다.

문제를 확인해 보니
2개의 필드중에 하나만 SQL 인젝션이 가능하다고 알려주고 있습니다. 모든 데이터를 성공적으로 검색하려면 어느 필드를 공격해서 찾아야 하는지에 대한 문제입니다.

주어진 질의문을 살펴보니 싱글 쿼터가 없는 거로 보아 아마 숫자 형태의 SQL 인젝션으로 공격해 보라는 거 같습니다.

문자열 형태의 SQL 인젝션은 싱글 쿼터('John'), 더블 쿼터("Smith")를 사용하여 문자열의 범위를 구분하고 숫자 형태의 SQL 인젝션은 문자열 형태와 다르게 숫자의 범위를, 공백을 기준으로 합니다. 그래서 공백과 특수문자를 포함해 봤습니다. 하지만 첫 번째 필드에서는 숫자 형태만 가능하다고 합니다. 그렇다면 두 번째 필드가 공격이 가능한 필드라는 걸 알 수 있습니다.

두 번째 필드가 공격대 상인 걸 확인했으니 바로 123 or 1=1 공격을 시도해 봤습니다. 앞에 and 구문과 관계없이 뒤에 or 구문에서 true 값을 반환하기에 해당 질의가 실행되어 모든 사용자의 정보를 조회할 수 있게 되었습니다.

일곱 번째 문제를 번역기로 해석해 보니
String SQL 인젝션을 통한 기밀성 저하
시스템이 SQL 주입에 취약한 경우, 해당 시스템의 CIA 트라이어드 측면이 쉽게 손상될 수 있습니다(CIA 트라이어드에 익숙하지 않은 경우 일반 카테고리의 CIA 트라이어드 수업을 확인하세요). 다음 세 가지 수업에서는 SQL 문자열 주입이나 쿼리 체인과 같은 기술을 사용하여 CIA 트라이어드의 각 측면을 손상시키는 방법을 배우게 됩니다.
이 수업에서는 기밀성에 대해 살펴보겠습니다. 공격자는 SQL 주입을 사용하여 기밀성을 쉽게 손상시킬 수 있습니다. 예를 들어, 성공적인 SQL 주입은 공격자가 데이터베이스에서 신용카드 번호와 같은 민감한 데이터를 읽을 수 있게 해줍니다.
문자열 SQL 주입이란 무엇인가요?
애플리케이션이 사용자가 제공한 문자열을 쿼리에 단순히 연결하여 SQL 쿼리를 구축하는 경우, 해당 애플리케이션은 문자열 SQL 삽입에 매우 취약할 가능성이 높습니다.
보다 구체적으로, 사용자가 제공한 문자열을 SQL 쿼리에 단순히 연결하거나 준비하지 않고 연결하면 입력 필드에 따옴표를 삽입하기만 하면 쿼리의 동작을 수정할 수 있습니다. 예를 들어 문자열 매개변수를 따옴표로 끝내고 그 후에 자신의 SQL을 입력할 수 있습니다.
당신 차례입니다!
귀하는 대기업에서 근무하는 존 스미스라는 직원입니다. 회사에는 모든 직원이 근무하는 부서와 급여와 같은 내부 데이터를 확인할 수 있는 내부 시스템이 있습니다.
시스템은 직원들이 자신의 데이터를 보기 위해 고유 인증 TAN을 사용하도록 요구합니다.
현재 TAN은 3SL99A입니다.
항상 가장 높은 연봉을 받는 직원이 되고 싶은 충동이 있기 때문에, 시스템을 악용하여 자신의 내부 데이터를 보는 대신 모든 동료의 현재 급여를 확인하고자 합니다.
아래 양식을 사용하여 직원 테이블에서 모든 직원 데이터를 검색하세요. 필요한 정보를 얻기 위해 특정 이름이나 TAN을 알 필요는 없습니다.
이미 요청을 수행하는 쿼리가 다음과 같다는 것을 알게 되었습니다:

요약
1. SQL인젝션이 가능한 곳은 기밀성, 무결성, 가용성을 해칠 수 있다.
2. 사용자 입력을 그대로 사용하는 것은 위험하다. 왜냐하면 따옴표를 추가하기만 하면 질의를 수정할 수 있기 때문이다.

문제를 확인해 보니
모든 동료를 조회해서 급여를 알아내라고 하는 문제입니다.

"SELECT * FROM employees WHERE last_name = '" + 123' or 1=1-- + "' AND auth_tan = '" + auth_tan + "'";
이번 문제는 첫 번째 필드, 두 번째 필드 상관없이 아무 곳에서 공격할 수 있습니다. 123' or 1=1-- 공격을 시도해서 --뒤에 오는 모든 질의문을 무효화시켜서 간단히 모든 동료의 급여를 확인할 수 있었습니다.

여덣 번째 문제를 번역기로 해석해 보니
쿼리 체인을 통한 무결성 저하
이전 수업에서 데이터의 기밀성을 침해한 후, 이번에는 SQL 쿼리 체인을 사용하여 데이터의 무결성을 침해하려고 합니다.
심각한 취약점이 존재하는 경우 SQL 인젝션을 사용하여 데이터베이스에 있는 모든 데이터의 무결성을 손상시킬 수 있습니다. SQL 인젝션이 성공하면 공격자는 접근할 수도 없는 정보를 변경할 수 있습니다.
SQL 쿼리 체인이란 무엇인가요?
쿼리 체이닝은 정확히 그런 느낌입니다. 쿼리 체이닝을 사용하면 실제 쿼리의 끝에 하나 이상의 쿼리를 추가하려고 합니다. 메타문자를 사용하여 이 작업을 수행할 수 있습니다. A는 SQL 문의 끝을 나타내며, 새 줄을 시작할 필요 없이 초기 쿼리 직후에 다른 쿼리를 시작할 수 있습니다.
요약
1. 무결성을 침해하면 접근할 수 없는 정보를 변경할 수 있다.
2. 쿼리 체인(Query chaining)은 질의 끝에 다른 질의를 추가해서 연쇄적으로 실행하는 것을 의미한다.

문제를 확인해 보니
본인은 존 스미스(John Smith)이고 토비(Tobi)와 밥(Bob)보다 급여를 높게 수정하라는 문제입니다.

123';update Employees set salary=99999 where first_name='John'--
싱글 쿼터(')를 사용하여 문자열 범위를 벗어난 다음 세미콜론(;)을 입력하여 다음으로 실행할 update 질의를 사용해 존 스미스의 급여를 가장 높게 설정하였고, 마지막에 --(주석)을 달아서 뒤에 오는 질의문을 무효화시켜서 문제를 해결하였습니다.

아홉 번째 문제를 번역기로 해석해 보니
가용성 저하
이전 수업에서 기밀성과 무결성을 성공적으로 타협한 후, 이제 CIA 삼부작의 세 번째 요소인 가용성을 타협할 것입니다.
가용성을 위반하는 방법에는 여러 가지가 있습니다. 계정이 삭제되거나 비밀번호가 변경되면 실제 소유자는 더 이상 이 계정에 액세스할 수 없습니다. 또한 공격자는 데이터베이스의 일부를 삭제하거나 전체 데이터베이스를 삭제하여 데이터에 액세스할 수 없게 만들 수도 있습니다. 관리자나 다른 사용자의 액세스 권한을 취소하는 것도 가용성을 저해하는 또 다른 방법이며, 이는 이러한 사용자가 데이터베이스의 특정 부분이나 전체 데이터베이스에 액세스하는 것을 방해할 수 있습니다.
요약
1. 가용성을 침해하면 계정 삭제, 비밀번호 변경, 권한 취소 등이 일어나 계정을 제대로 사용할 수 없다.
2. 해커가 DB 일부, 전체 DB를 삭제하여 이용할 수 없게 만든다.

문제를 확인해 보니
회사에서 가장 높은 수익을 올렸지만. 모든 작업이 기록이 된 access_log 테이블이 있어서 누군가 눈치채기 전에 해당 테이블의 내용을 삭제하고 사용하지 못하게 해서 가용성을 해치는 게 이번 문제 같습니다.

123'truncate from access_log;drop table access_log--
질의 체인을 사용하여 해당 테이블 안에 데이터를 모두 비우고, 테이블을 삭제 함으로써 이번 문제를 해결하였습니다.
이번 실습에서는 SQL인젝션을 이용한 기초 공격 방법들에 대해서 알아보았습니다.