본문 바로가기

Hacking & Security/Web

웹 취약점 점검기준 - Injection

웹 취약점 점검기준 - 1


이번에는 웹 취약점을 실제로 분석하기 위해 반드시 알고 있어야 할 점검 기준 및 사례를 공부한다.

우선 OWASP Top 10 2017 항목의 주요 포인트에 대해 살펴보도록 한다.

image

A1 - Injection


Injection에 관련된 취약점 유형은 다음과 같다.

유형 설명
SQL Injection 쿼리 등에 SQL 쿼리를 삽입하여 DB 조회,변조 및 삭제 등의 공격을 의미한다.
CRLF Injection CRLF(%0d%0a) 패턴 삽입을 통한 악의적 공격을 의미한다.
Command Injection 쿼리 등에 운영체제 명령어를 삽입하여, 명령어 실해애 및 시스템 권한 획득 공격을 의미한다.

1. SQL Injection

1) Error based SQL Injection

GET, POST 요청필드, HTTP Header, 쿠키값 등에 특수문자( `, ; ) 등을 삽입하여 SQL 관련 에러를 통해 DB 정보를 예상해 볼 수 있다.

SQL의 종속성에 따라 출력되는 에러는 다양하다.

Point) 웹 취약점 분석도구에서 취약점 여부 판단 기준

  • 특수문자 삽입 이후 응답 코드가 500번이거나, 응답 페이지에 SQL 관련 에러 발생시 취약점으로 판단하고 있다.
2) Union based SQL Injection

Union 이란 2개 이상의 쿼리를 요청하여 결과를 얻는 SQL 연산자이며, 공격자는 이를 악용하여 원래의 요청에 추가 쿼리를 삽입하여 정보를 얻어내는 방식이다.

단, Union 쿼리는 2개의 테이블이 동일한 필드 개수와 데이터 타입을 가져야하므로 사전에 해당 정보를 얻는 과정을 거쳐야 한다.

3) Blind based SQL Injection

에러가 발생되지 않는 사이트에서는 위의 기법들을 상요할 수 없기 때문에 공격을 통해 정상적인 쿼리 여부를 가지고 취약점 여부를 판단하는 기법이다.

간단한 예시를 살펴본다.

http://www.xxx.com/page.php?id=5 and 1=1

id=5 다음에 and 1=1 을 삽입하였고 이는 id=5 , 원래 페이지 요청 값에 and 1=1 항상 창인 값이기 때문에 page.php?id=5 를 요청한 값과 동일한 결과 페이지가 제공될 것이다.

http://www.xxx.com/page.php?id=5 and 1=2

그러나 위 예시와 같이 and 조건을 가지는 and 1=2 를 삽입한 경우,
id=5(참)1=2(거짓) 의 거짓조건으로 인해 정상적인 쿼리가 수행되지 않아 화면에 결과가 출력되지 않을 것이다.

이와 같이, 다양한 참(TRUE) 및 거짓(FALSE) 조건을 요청하여 페이지가 정상적으로 호출되는지를 가지고 취약점을 점검한다.

4) Time based SQL Injection

쿼리 결과를 특정시간만큼 지연시키는 것을 이용하는 기법으로, Blind 기법과 마찬가지로 에러가 발생되지 않는 조건에서 사용할 수 있다.

http://www.xxx.com/listproducts.php?cat=1 AND SLEEP(5)

MYSQL에서 SLEEP() 함수를 이용하여 5초 후에 쿼리 결과를 얻도록 공격 문자열을 삽입한다고 가정했을 때,

5초 이후 쿼리 결과가 화면에 출력된다면 취약점이 존재한다고 판단할 수 있다.

CRLF Injection

CRLF Injection에서의 CRLFCarriage ReturnLine Feed 를 의미하며,

키보드의 엔터키와 동일한 기능을 한다. 그러나 URL 의 특정 파라미터에 해당 코드를 삽입하는 경우 임의의 헤더정보를 생성할 수 있는 취약점이 발생한다.

아래 예시는 url 파라미터에 CRLF(%0d%0a)를 삽입한 경우이다.

CRLF(%0d%0a) + Space(%20) + New_Header:New_Header_Value+CRLF(%0d%0a)

GET/redir.php?url=%0D%0A%20New_Header:New_Header_Value%0D%0A

만일 해당 취약점이 존재할 경우, 응답코드는 302번 및 Location 헤더에 삽입한 공격 문자열(New_Header:New_Header_Value)이 보이게 된다.

Command Injejction

GET, POST 요청필드, HTTP Header, 쿠키 등에 운영체제 명령어를 삽입하여 권한을 획득하는 공격을 의미한다.

/productlist.php?id=1020&page=|cat /etc/passwd&pid=A1023

위 예시와 같이 파라미터인 page| cat /etc/passwd 를 삽입하여 /etc/passwd 파일을 읽는 시도를 해볼수 있다.
참고로, 파이프(|) 혹은 세미콜론(;)은 명령어와 명령어 사이 구분자로 사용되며 , 윈도우에서는 &가 사용될 수 있다.