본문 바로가기

web document

웹 취약점/공격기법 정리

웹 해킹을 공부하다 보니 여러 취약점들과 공격 기법들이 머릿속에서 뒤죽박죽 섞여있는 느낌이 들어 알고 있는 것들을 한 번 정리해보는 시간을 가져야겠다 생각해서 이 글을 쓰게 됐다. 그렇기에 다소 내용이 부족한 내용이 있을 수 있다.

정리할 때 dreamhack.io을 주로 참고하고 구글링도 많이 해봤다. 

 

해커들의 놀이터, DreamHack

해킹과 보안에 대한 공부를 하고 싶은 학생, 안전한 코드를 작성하고 싶은 개발자, 보안 지식과 실력을 업그레이드 시키고 싶은 보안 전문가까지 함께 공부하고 연습하며 지식을 나누고 실력 향

dreamhack.io

dreamhack.io에서 정말 많은 것들을 배웠다.

(이 글은 mysql을 기준으로 설명하고 있다.)

 

우선 웹 해킹에서는 Client-side Attack과 Server-side Attack으로 크게 분류할 수 있다. 

Client-side Attack은 서비스 사용자에 대한 공격을 말하는데 웹 서버가 제공해주는 데이터가 변조되어 웹 브라우저에서 랜더 되는 과정에서 취약점이 발생한다.  공격 기법에는 xss, csrf 등이 있다. 

 

Server-side Attack은 서베에 직접적으로 공격하는 것을 의미한다. 주로 db에 있는 데이터를 변조하거나 탈취한다.

공격 기법에는 sql injection, ssti, ssrf, path travelsal, file upload/download 등이 있다.

 

1. XSS

xss는 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 말한다. 자바스크립트를 사용하여 공격하는 경우가 많고, 단순하고 기초적인 것에 비해 많은 웹사이트들에서 xss가 발생한다. 공격에 성공하면 사이트에 접속한 사용자가 삽입된 코드를 실행시키게 되고, 보통 의도치 않은 행동을 수행시키거나, 쿠키나 세션 토큰등을 탈취한다.

 

xss는 공격 방법에 따라 Stored XSS와 Reflect XSS로 나뉜다. 

 

-Stored XSS

Stored XSS는 악성 스크립트가 서버 내에 db, 파일 등의 형태로 저장되어 있다 사용자가 저장된 악성 스크립트를 조회 하면서 발생하는 형태의 xss다. 예를 들어 게시판 서비스에서 작성된 게시글을 확인 할 때 그 게시물에 악성 스크립트가 포함되어 있으면 xss공격이 실행되는 것이다.

 

-Reflect XSS

Reflect XSS는 악성 스크립트가 사용자의 요청에 의해 전송되는 형태이다. 보통 url 파라미터에 스크립트를 넣어 서버에 저장하지 않고 그 즉시 스크립트를 만드는 방식이다. 그렇게 만든 스크립트가 사용자의 요청데이터에 포함되어 있을 때 서버의 응답에 요청 데이터가 포함되는데 그 때 악성스크립트가 그대로 출력면서 발생한다. 대표적인 예시로는 사용자가 게시물 조회를 요청 할 때 서버가 해당 요청에 대하여 조회 한 결과를 응답에 출력하며, 편의를 위해 사용자가 조회한 내용을 응답에 포함시키며, 웹브라우저에서 페이지를 출력 시 반영되는 결과로 인해 Reflect XSS로 이어질 수 있다. 우리가 보통 ctf에서 xss를 사용한다면 Reflect XSS를 많이 사용한다.

 

2.  CSRF

csrf 공격은 웹 어플리케이션 취약점 중 하나로 인터넷 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하여 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격이다. csrf 공격을 통해 공격자가 얻을 수 있는 이득은 해당 세션 쿠키를 가진 사람만 사용할 수 있는 기능을 요청할 수 있다는 것이다. 예를 들어, 공격자에게 임의 금액을 송금하게 명령하거나, 사용자의 패스워드를 공격자가 임의로 바꾸어 계정을 탈취하거나, 관리자 권한을 탈취하여 특정 사이트를 마음대로 수정 할 수도 있다. 

 

csrf 공격을 하기 위해서는 다믕과 같은 조건을 충족해야 한다.

  • 해당 웹 사이트가 쿠키를 이용한 인증 방식을 사용해야 합니다.
    - 모든 HTTP 전송에는 쿠키가 함께 전송되기 때문에 쿠키에 저장된 세션 아이디도 전송된다.
  • 공격자가 사전에 알 수 없는 파라미터가 존재해서는 안됩니다.
    - 자동입력 방지 문자를 넣어야 하는 요청은 공격자가 미리 알 수 없다.
    - 패스워드 변경 기능에서 기존 패스워드를 입력 받는 다면 이 또한 공격자가 미리 알 수 없다.

이렇게 보면 csrf와 xss의 차이가 없다고 느낄 수 있다.

 

xss는 공격대상이 Client이고, csrf는 공격대상이 Server다.

또한, xss는 사이트 변조나 백도어를 통해 클라이언트에 대한 악성공격을 하지만

csrf는 요청을 위조하여 사용자의 권한을 이용해 서버에 대한 악성공격을 한다.

 

Server-side Attack

 

1. SQL Injection

sql injection이란 악의적인 사용자가 보안상의 취약점을 이요하여, 임의의 sql 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위이다. sqli의 목적으로는 

  • 인증 우회
  • db 데이터 조작 및 유출
  • 시스템 명령어 실행

등이 있다.

 

slqi를 하기 위한 최소한의 조건은

  • 웹 애플리케이션이 db와 연동하고 있다.
  • 외부 입력값이 db 쿼리문으로 사용된다.

이다.

웹에서 위 두 조건 중, 하나라도 충족하지 않는다면 sqli는 쓸모가 없다.

 

sqli의 종류는 다음 가지 정도가 있다.

  • 기본적인 논리연산을 이용한 sqli
  • blind sql injection
  • union sql injection
  • time based sql injection
  • error based sql injection

- 논리연산을 이용한 sqli

대표적인 논리 연산자로는 and 연산과 or 연산이 있다.

A B A and B (A && B)  A or B (A || B)
0 0 0 0
1 0 0 1
0 1 0 1
1 1 1 1

위의 연산표를 보면 and 연산은 모든 조건이 참인 경우에만 결과가 참이 되고, or 연산은 모든 조건이 거짓인 경우에만 거짓이 된다.

select id from user where uname="admin" and upw="admin";

예를 들어 위와 같은 쿼리문을 실행하면 uname과 upw 모두 admin인 id를 반환한다.- 

select id from user where uname="admin" or upw=1;

하지만 위와 같은 or 연산을 사용한다면 db내에 있는 모든 id값을 반환한다.

 

이를 이용해서 sqli을 발생 시킬 수 있다.

 

- blind sql injection

bsqli는 db 조회 후 결과를 직접적으로 확인할 수 없는 경우 사용할 수 있는 공격 기법이다.

bsqli을 하기 위해서는 다응과 같은 조건이 만족되어야 한다.

  • 데이터를 비교해 참/거짓을 구분
  • 참/거짓의 결과에 따른 특별한 응답 생성

bsqli을 할 때 주로 사용하는 것들에 대해 알아보겠다.

 

  • substr, mid, left, right
    이 함수들은 문자열을 자를 때 사용하는 함수이다.
    substr의 사용법은 substr(pw, 1, 4)일 경우 변수 pw의 1번째 부터 4개의 문자가 잘린다.
  • ascii, ord
    이 함수는 문자의 아스키 코드 값을 변환해 주는 함수이다.
  • chr
    아스키 코드를 문자로 변환해 주는 함수
  • order by(sql 문법)
    뒤에 asc, desc를 붙여 각각 오름차순, 내림차순으로 정렬할 수 있다. (아무것도 안쓰면 오름차순으로 정리된다.)
    보통 sqli를 할 때는 컬럼의 수를 확인하기 위해서 사용한다.

bsqli는 다른 sqli 기법들과 섞여서 자주 쓰이곤 한다.

 

- union sql injection

select 구문의 union절을 이용한 공격 기법이다. 

union은 기본적으로 다수의 select 구문의 결과를 결합시키는 역할을 한다.

이를 통해 원하는 다른 테이블에 접근하거나 원하는 쿼리 결과 데이터를 생성하여 어플리케이션에서 처리되는 데이터를 조작할 수 있다.

 

union 절을 사용하기 위해서 다음과 같은 조건이 요구된다.

  • 이전 select 구문과 union select 구문의 겨로가 컬럼의 수가 같아야 한다.
  • 특정 dbms에서 사용 시 이전 컬럼과 union select 구문의 컬럼의 타입이 같아야 한다.

union 절은 db에 원하는 값이 없을 때 어플리케이션에서 처리되는 데이터를 조작하여(db에 있는 데이터는 바뀌지 않는다) 원하는 값을 생성할 수 있다.

 

-time based sql injection

time based sqli는 시간 지연을 이용해 참/거짓을 판단한다.

시간지연을 발생시키는 방법으로는 sleep()이나 benchmark()같은 dbms에서 제공하는 함수를 이용하거나, 무거운 연산과정을 발생시켜 쿼리 처리 시간을 지연시키는 방법등이 있다.

 

사용방법은 select if(1=1, sleep(3), 0); 이와 같은 쿼리를 실행시키면 1=1은 참이니 sleep(3)을 실행시켜 3초의 지연시간이 발생한다. 

 

혹은, information_schema.tables 테이블과 같이 많은 데이터가 포함되어 있는 테이블을 연산 과정에 포함시켜 연산 시간을 느리게 만들면 된다.

 

time bases sqli는 특별한 필터링만 없다면 거의 모든 상황에서 사용될 수 있다는 장점이 있다.

 

-error based sql injection 

말 그대로 사용자가 임의적으로 에러를 발생시켜 정보를 획득하는 공격 기법이다.

공격자가 원하는 에러메시지가 출력되도록 유도하거나, 에러메시지에 공격자가 원하는 정보를 직접 덧붙여 확인한다.

이 기법을 사용하기 위해서는 syntax error와 같은 dbms에서 해당 쿼리가 실행되기 전에 검증 가능한 에러가 아닌, runtime 중에 발생하는 에러가 필요하다.

 

mysql 에서 사용 가능한 에러들을 알아보면

SELECT updatexml(null,concat(0x0a,version()),null);
/*
ERROR 1105 (HY000): XPATH syntax error: '
5.7.29-0ubuntu0.16.04.1-log'
*/
SELECT extractvalue(1,concat(0x3a,version()));
/*
ERROR 1105 (HY000): XPATH syntax error: ':5.7.29-0ubuntu0.16.04.1-log'
*/
SELECT COUNT(*), CONCAT((SELECT version()),0x3a,FLOOR(RAND(0)*2)) x FROM information_schema.tables GROUP BY x;
/*
ERROR 1062 (23000): Duplicate entry '5.7.29-0ubuntu0.16.04.1-log:1' for key '<group_key>'
*/

#출처 : dreamhack.io

등이 있다.

 

www.lanian.co.kr/entry/Error-Based-SQL-Injection (참고 사이트)

 

Error Based SQL Injection

출처 : http://hellsonic.tistory.com/entry/Error-Based-MYSQL-Injection Error Based MYSQL Injection mysql> select 1 from dual where 1=1 and row(1,1)>(select count(*),concat(version(),floor(rand(0)*2))..

www.lanian.co.kr

2. SSTI

(portswigger.net/research/server-side-template-injection 참고 사이트)

-템블릿 사용이유

html로 동적 페이지를 만들게되면 관리가 어렵고, 코드가 길어집니다. 그렇기에 템플릿을 사용하여 보다 간단하게 코드를 작성하는 것이다.

ssti는 사용자의 입력 데이터가 템플릿에 직접 사용될 경우 템플릿 엔진이 해석하여 실행하는 문법을 사용할 수 있어 취약점이 발생한다.

 

ssti를 하기 위해서는 먼저 문제에서 사용하는 템플릿의 종류를 파악해야하는데 그 과정에서 밑 그림을 참고하면 된다.

-----------------------------------------------

나중에 더 추가하겠다