본문 바로가기
웹 해킹

Ch 04 SQL 인젝션 공격(실습)

by plum06 2023. 1. 25.

실습 1) SQlite 설치

https://www.sqlite.org에 접속해 Latest Release 밑의 Download를 클릭합니다.

다른 페이지로 넘어가게 되는데 스크롤을 내려보면 나오는 Precompiled Binaries for Windows에서 파일 3개 모두 다운로드 합니다. 다운로드 완료되면 압축을 풉니다. Sqlite-tools-win32-x86에 있는 sqlite3.exe를 실행해야 하므로 명령 프롬프트 열고 파일이 있는 폴더로 이동해 sqlite3.exe 입력합니다. 다음 사진은 정상적으로 실행됐을 경우의 화면입니다.

sqlite3.exe가 정상적으로 실행됐을 때의 cmd 화면

참고) transient in-memory database*

In-memory database(IMDB): 메모리에 데이터를 저장. IMDB는 영속성을 보장하지 않아 프로세스가 종료되면 데이터 사라짐(=휘발성 데이터베이스). IMDB와 달리 보조기억장치(디스크)에 데이터를 저장하는 디스크 기반 DB는 필요한 데이터를 곧바로 사용할 수 없어 데이터를 읽고 메모리에 올린 뒤에 사용 가능

 

 

실습2) SQL 쿼리문 실습

명령프롬포트를 사용해 sqlite3.exe를 실행합니다. 아래 사진들은 테스트 데이터베이스를 생성하고 여러 명령어를 연습한 화면 사진입니다. 

  • CREATE TABLE 테이블 생성 시에 사용. 아래는 실습에서 입력한 예시
  • 더보기

     sqlite> CREATE TABLE member (

    no INTEGER PRIMARY KEY,

    id VARCHAR(20),

    pw VARCHAR(20),

    );

  • 더보기

    sqlite> CREATE TABLE member (

    no INTEGER PRIMARY KEY,

    user_id VARCHAR(20),

    name VARCHAR(20),

    user_pw VARCHAR(20),

    email VARCHAR(40),

    date DATE

    );

  • INSERT 테이블에 데이터를 추가할 때 사용
  • 더보기

    sqlite> INSERT INTO member (user_id, name, user_pw, email, date) VALUES(‘wasabimilk’, ‘Rosa’, ‘rosa!@#$’, ‘test@test.com’, DATETIME(‘NOW’, ‘LOCALTIME’)

    );

  • 더보기

    sqlite> INSERT INTO member (user_id, name, user_pw, email, date) VALUES(‘anesra’, ‘KG Kim’, ‘anesra!@#$’, ‘anesra@gmail.com’, DATETIME(‘NOW’, ‘LOCALTIME’)

    );

두 번째 계정 데이터 추가하는 과정에서 잘못 입력한 것인지 데이터가 정상적으로 완료되지 않고 계속 이어졌습니다. ‘;’를 안 입력했는지, 괄호 잘못 닫았는지 싶어서 시도하다가 결국 정상적으로 데이터가 추가되는 문장이 될 수 없게 만들었다 판단해 cmd 종료하고 다시 열어 sqlite3.exe를 실행했습니다.

cmd를 다시 실행했을 때 종료하기 전 만든 테이블과 저장된 데이터는 남은 상태였습니다. 똑같은 테이블을 입력하려 했을 때 오류가 난 걸 보고 알게 됐습니다.

  • SELECT 데이터 조회 시에 사용. 특정 데이터 조회할 때 WHERE와 함께 사용.
  • 더보기

    sqlite> SELECT * FROM member;

  • 더보기

    sqlite> SELECT * FROM member WHERE user_id='anesra';

  • UPDATE 이미 테이블에 존재하는 데이터 수정할 때 WHERE와 함께 사용.
  • 더보기

    sqlite> UPDATE member SET user_pw="!@#$anesra" WHERE user_id='anesra';

  • DELETE 테이블에 존재하는 데이터 삭제할 때 사용
  • 더보기

    sqlite> DELETE * FROM member WHERE user_id='wasabimilk';

  • UNION 여러 테이블의 데이터 한 번에 조회할 때 사용. 단, 테이블에서 조회하려는 칼럼의 수(데이터베이스의 열 수)가 동일해야 함.
  • 더보기

    오류 발생 예시

    sqlite> SELECT * FROM member UNION SELECT * FROM admin;

  • 더보기

    sqlite> SELECT user_id, user_pw FROM member UNION SELECT id, pw FROM admin;

 

참고) 테이블이 정상적으로 생성됐는지 확인하는 명령어 .table

sqlite 종료 명령어 .quit

입력된 데이터를 보기 쉽게 바꾸는 명령어

sqlite> .head on

sqlite> .mode column

입력 후 아래 명령어를 입력하면 바뀐 방식으로 데이터 확인 가능

 

※코드를 짤 때 당연하지만 철자 하나 하나 신경쓰기!※ 실습에서 철자 여러 번 잘못 입력해서 오류남...

 

 

실습 3) 기본 SQL 인젝션 공격 연습하기

[Injection Flaws]-[LAB:SQL Injection]-[Stage 1: String SQL Injection] 메뉴를 클릭합니다. 해당 문제는 인증을 우회하여 관리자로 로그인 하는 것입니다. 관리자 계정으로 로그인을 시도하는데 아무 패스워드나 입력하면 로그인되지 않습니다.

해당 페이지에서 어떻게 패스워드 입력값을 처리하는지에 대한 코드는 다음과 같습니다. 이는 WebGoat가 설치된 곳에 있는 LoginSqlInjection.java 파일을 확인하면 알 수 있습니다.

String query = "SELECT * FROM employee WHERE userid = " + userid + " and password = '" + password + "'";

비밀번호를 모르는 채로 관리자 계정에 로그인 하려면 어떻게 해야 할까요? 로그인 할 때 입력한 아이디와 비밀번호가 데이터베이스에 저장된 값과 정확히 일치해야 합니다. 즉, 참을 반환해야 로그인 할 수 있습니다. 이 문제에서는 반드시 참을 반환하게 만드는 값을 추가해야 합니다. 그래서 이 실습에서 'or'='를 패스워드에 입력합니다.

아래는 ‘or’=’를 입력했을 때 생성되는 쿼리문입니다.

SELECT * FROM employee WHERE userid='Nevile Bartholomew(admin)' and password=''or''=''

‘’or’’=’’는 패스워드가 NULL이거나 NULLNULL이 같을 경우를 의미합니다. NULL=NULL은 항상 참이기 때문에 이 쿼리문은 참을 반환하게 되어 관리자 계정으로 정상적으로 로그인을 할 수 있습니다.

 

<왼쪽> 관리자 계정 로그인 실패 화면 / <오른쪽> 패스워드에 'or'=' 입력했을 때의 화면

 

 

실습 4) 문자열 SQL 인젝션 공격 연습하기

[Injection Flaws]-[String SQL Injection] 메뉴로 들어갑니다. 입력한 이름과 일치한 계정의 데이터를 볼 수 있는데 여기서 Smith를 입력해보았습니다. 그러면 Smith란 이름을 가진 사용자의 데이터만 볼 수 있습니다.

만약 ‘or’’=’를 입력하게 된다면 결과가 참이므로 저장되어 있는 모든 데이터를 볼 수 있게 됩니다.

<왼쪽> Smith를 입력했을 경우 / <오른쪽> 'or''=' 입력했을 경우

 

 

실습 5) SQL 인젝션 공격으로 데이터 수정하기

[Injection Flaws]-[Database Backdoor] 메뉴로 들어갑니다. 해당 문제는 입력한 아이디를 가진 사용자의 정보를 확인할 수 있습니다. 이 실습에서는 101인 아이디를 가진 사용자의 급여 정보를 수정하는 것입니다.

정보를 수정하기 위해서 바꾸려는 대상의 아이디를 지정하고 대상의 특정 데이터를 원하는 값으로 바꿉니다. 아이디가 101인 사용자의 초기 급여는 55000이었으나 100000로 바꾸려 합니다.

101; UPDATE employee SET Salary=100000 WHERE userid=101를 입력합니다. 그러면 급여 정보가 의도한 값으로 바뀐 것을 알 수 있습니다.

다음은 위와 같이 입력했을 때 생성되는 SQL 구문입니다.

SELECT userid, password, ssn, salary, email FROM employee WHERE userid=101; UPDATE employee SET Salary=100000 WHERE userid=101

 

 

<왼쪽> 급여 정보 변경 전 / <오른쪽> 급여 정보 변경 후

참고) 백도어(Backdoor): 프로그램, 장치, 포털 또는 서비스의 보안 기능을 피하는 데에 사용할 수 있는 기능 혹은 프로그램을 의미

 

 

실습 6) XPath 인젝션 연습하기

[Injection Flaws]-[XPATH Injection] 메뉴로 이동합니다. 해당 문제에서는 사용자 이름과 패스워드를 입력하여 사용자의 정보를 볼 수 있습니다. 오른쪽 사진의 경우 이름에 Mike'or''='를, 패스워드에 'or''='를 입력하면 나오는 화면으로 XPath 삽입 공격이 성공한 것입니다.

<왼쪽> Mike의 계정 정보 / <오른쪽> 모든 사용자의 계정 정보

'웹 해킹' 카테고리의 다른 글

Ch 05 XSS 공격(실습)  (0) 2023.02.01
Ch 05 XSS 공격  (0) 2023.02.01
Ch 04 SQL 인젝션 공격  (0) 2023.01.25
Ch03 인증 기술과 접근 통제(실습)  (0) 2023.01.18
Ch 03 인증 기술과 접근 통제  (0) 2023.01.18