1.파일 업로드 취약점이란?


1) 파일 업로드 취약점이란? 

  

  게시판 등의 파일을 업로드 할 수 있는 기능을 악용하여 악의적인 파일 (웹쉘)업로드를 통해 시스템 권한을 장악하는 기법을 의미한다. 보통은 악위적인 스크립트가 포함된 소스파일을 첨부할 수 없게 막아 놓지만, 간혹 에디터의 오류로 인하여 업로드를 가능하게 한다. 때문에 악성 스크립트가 업로드 된 후 서버상에서 스크립트를 실행시켜 쉘 획득, 서버변조 등 웹 서버를 장악할 수 있다.



2) 웹 서버에서 실행 가능한 확장자

 

 개발언어

실행가능한 확장자 

ASP, ASPX

  asp, aspx, htm, html, asa 등

PHP 

  phtml, php, php3, php4, php5, inc, htm, html 등

JSP, JAVA 

  jsp, jspx, jsw, jsv, jspf, htm, html 등

PERL 

  pl, pm, cgi, lib, htm, html 등

ColdFusion

  cfm, cfml, cfc, dbm, htm, html 등



3) 파일 업로드 공격의 영항


- 허용하지 않은 사용자 내부망 접근

- 회사 기밀 유출 및 개인 정보 유출

- 윔 바이러스 배포 등,




2. 공격방법


1) 취약점 점검


- 파일첨부 기능이 있는 페이지를 찾아, 지정된 확장자 이외의 파일을 업로드 할 수 있는지 확인한다.(1-2 참고)

- 지정된 확장자 이외의 파일을 업로드 할 수 있다면 업로드 된 파일에 접근이 가능한지 또한, 실행이 가능한지 확인한다.

- 만약 접근이 가능하다면 피싱페이지로 활용될 수 있고, 실행이 가능하다면 시스템의 제어 권한을 얻을 수 있다. 



2) 프록시툴을 이용한 확장자 검사우회 파일 업로드


 게시판의 파일 업로드 기능에서 확장자 검사를 통해 파일 업로드 공격을 차단할 수는 있으나, 파일 타입 변조 등을 통해 다양한 우회공격이 존재한다.  

 

 업로드 시 파일의 유형정보를 알려주는 MIME(Multipurpose Internet Mail Extensions)는 메시지 유형을 정의하기 위한 인터넷 표준이며, Content-Type, MIME-Version Content-Transfer-Enconding 등 세 가지 헤더 정보로 구성되 있다.


 그중 Content-Type의 속성은 사용 목적에 따라 XML, Media, Application, Text등을 세팅하여 전달되는 파일 유형을 알려주게 된다. 이 Content-Type의 속성을 프록시 퉁을 이용해 변조를 하여 우회 할 수 있다.




3) 널바이트를 이용한 파일 업로드

 

 c/c++에서 널바이트 문자여(%00, 0x00)은 문자영의 끝을 의미하기 때문에, 특정 확장자를 숨기기 위한 목적으로 사용될 수 있으며, 해당 부분의 취약점은 C루팅을 처리하거나 내부의 C API를 호출하는 함수를 사용하는 경우에 발생될 수 있다.

  

 위험한 확장자를 검사하는 로직을 우회하기 위해 널바이트와 .jpeg를 함께 접목하여 업로드하면, 널바이트(%00)의 끝을 의미하기 때문에 %00 다음의 문자열은 무시하게 된다.


언어 

우회패턴 

처리패턴 

 PHP 

test.php%00.jpeg 

 test.php 

 ASP 

 test.asp%00.jpeg  

test.asp

JSP

test.jsp%00.jpeg 

test.jsp




4) SQL Injection을 이용한 파일 업로드

 

 -MySQL의 into outfile함수

into outfile()을 이용하면, 웹 서버에 파일을 생성할 수 있다.


  -MSSQL의 저장 프로시저 이용

XP_cmdshell 프로시저를 이용하여 윈도우 명령어인 echo를 통하여 특정 명령어를 작성하고 파이프(>>)를 통하여 특정파일에 삽입할 수 있다.




5) Exploit을 통한 root권한획득


 exploit이란 소프트웨어의 버그 등의 설계상 결함을 이용한 공격코드를 말한다. ex) kernel.c


파일 업로드 이후 완벽한 시스템 권한을 왹등하기 위해서는 root권한이 필요하나, 대부분이 별도의 계정을 이용하여 웹 서비스를 운영하기 때문에 파일 업로드 공격은 일반 권한까지만 획득이 가능하다. 때문에 시스템공격을 위한 exploit을 이용하여 root권한을 획득할 수 있다


  




3. 방어방법

 

- 지정된 확장자를 제회한 다른 확장자의 업로드를 불가능 하도록 해야 하며, 스크립트 파인의 업로드 및 실행을 금지 시킨다.


- 파일명 및 확장자 검증을 우희하는 것을 방지하기 위해 대소문자를 구분하지 않고 문자열을 비교해야 하며, 특수문자가 포함되어 있을 경우 업로드를 금지시킨다.

 

- 웹 서버 엔진 설정 시 업로드 된 디렉토리의 serve side script언어의 실행 권한을 제거하고 업로드 된 파일명, 확장자를 난수화 하여 변경해야 한다.


- 업로드 된 파일을 루트 디렉토리와 동일한 수준에 존재하는 다른 디렉토리에 저장하거나 url요청에 의해서 직접 접근이 불하는 한 곳에 저장하며, 상위 폴더 졀로 이동을 제한한다.


by dajababa

'WEB > Web Hacking' 카테고리의 다른 글

CSRF (Cross-site request forgery) 란  (0) 2017.04.28
Drive-By-Download(DBD) 공격(이론편)  (0) 2017.04.24
SQL injection  (0) 2017.03.25
자바스크립트(JavaScript) 난독화  (0) 2017.03.21
XSS(Cross Site Scripting) 공격이란?  (0) 2017.03.12



1. SQL injection 이란?

1)

-코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식

-SQL 구문을 임의로 삽입하여 기존 쿼리문을 변조, 인가되지 않은 데이터 열람 등을 수행할 수 있는 취약점

- SQL 삽입, SQL 주입으로도 불린다.



2) SQL injection에 주로 사용되는 문자열

문자열

설명

'

 문자 데이터 구분 기호 

 ; 

쿼리 구분 기호

-- , #

해당 라인 주석 구분 기호

-- Oracle, MSSQL

# MySQL 

 /* */

 /* 와 */  사이 구문 주석

 ||

문자 연결 ( Oracle에만 해당 ) 




3)

SQL injection을 크게 두 종류로 본다면 Numeric injection과 String injection으로 나뉜다.


3-1) Numeric Injection

- SQL injection 취약점이 존재하는 입력의 형태가 정수일 때의 injection이다.

정수의 타입으로 입력하기 때문에 String과 달리 작은 따옴표(')가 없다.


EX) select * from u_table where no=1 union select * from u_table

* 띄어쓰기를 할 수 있어야 추가적인 명령을 할 수 있다.

( 만약 코드 상에 trim()이나 공백을 지워주는 함수가 있다면 불가능하다. )


3-2 )String Injection

- Injection 취약점이 존재하는 입력의 형태가 문자일 때의 Injection이다.

입력하는 것이 작은따옴표(') 안으로 들어가기 때문에 Numeric Injection처럼 바로 명령을 이어 붙이지는 못하나

' 따옴표를 사용해 문자열을 잘라주면 된다.




2. SQL injection 공격 종류

1) 데이터베이스 구조 파악

데이터베이스의 오류를 낼 수 있는 SQL query를 입력하여 데이터베이스의 오류 결과를 분석하면 구조를 파악할 수 있다.

테이블명, 필드명,레코드 값 등을 파악할 수 있다.


2) Blind SQL injection

웹 서버에서 SQL injection을 방어하기 위해 데이터베이스의 오류 메시지를 출력하지 않도록 설정하는데

이때 오류 메시지를 보지않고 injection 공격을 한다고 해서 Blind injection으로 불린다.

오류 메시지가 출력되지 않기 때문에 참과 거짓만으로 공격하여 참으로 처리되는 값들만 파악하는 기법이다.


3) Stored Procedure SQL injection

보안상 취약한 프로시저를 이용하여 쉘을 수행, query 결과를 html로 제공, 레지스트리 조작, 서비스 시작 및 중지, 시스템 정보 획득 등

시스템 상에 공격하는 것이다.


4) Union SQL injection

2개 이상의 query를 요청하여 결과를 얻는 UNION 이라는 SQL 연산자를 이용한 SQL injection 공격을 말하며 공격자는 이 연산자를 이용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 정보를 알아낼 수 있다.

하지만 컬럼의 갯수가 같아야 하고, 데이터 형식도 같아야 한다.



3. 예시

1) Login



(아래 내용은 위 사진과 일치하지 않습니다.)


로그인 폼에선 사용자가 값을 입력하면 데이터베이스를 조회하여 데이터와 일치할 때 로그인을 할 수 있다.

이때 데이터베이스에 값을 조회하기 위해 사용되는 언어를 SQL이라고 하며

일반적인 형태는 다음과 같다.


SELECT user FROM user_table WHERE id='입력한 아이디' AND password='입력한 비밀번호';


사용자의 id가 guest이고 password가 asdf1234이면 


SELECT user FROM user_table WHERE id='guest' and password='asdf1234'; 가 될 것이다.


sql injection으로 비밀번호에 ' or  '1' = '1 을 넣으면


SELECT user FROM user_table WHERE id='admin' and password=' ' or '1' = '1'; 이 되고,

 

AND연산은 OR보다 연산의 우선순위가 빠르기 때문에 위 구문 전체가 true가 되어 올바른 값으로 판단하게 된다.

즉,  ' or '1' = '1'' 구문 때문에 입력받은 id와 password가 데이터베이스와 일치하지 않아도 로그인을 할 수 있다.



또, id 부분에 주석을 넣어서 id = guest 이후 부분을 다 생략해버리면 password을 입력하지 않아도 로그인이 될 가능성도 있다.


SELECT user FROM user_table WHERE id='guest'-- and password='';








4. 방어 방법

- 유저에게 받은 값을 직접 SQL로 넘기지 않는다.

- 정규 표현식을 사용하여 적법한 입력 외에는 거부한다

- query 빌드 시 문자열 연결이 아닌 매개변수 query를 사용한다. -> 저장 프로시저 사용

- 최소 권한 계정으로 데이터 베이스에 연결하게 한다.

- 데이터베이스 연결 문자열을 가급석 config 파일에 저장하지 않는다 + 암호화

- 데이터베이스에 유저별로 접근 권한과 사용 가능한 명령어를 설정하면 피해를 최소화 할 수 있다.

- 클라이언트 측 자바스크립트로 폼 입력값을 한 번 검증하고, 서버측은 클라이언트 측 필터가 없다고 가정한 뒤 한번 더 입력값을 필터링한다.

- 공격자에게 너무 많은 오류 정보를 노출하지 않는다



<자바스크립트(JavaScript) 난독화>


자바스크립트” +”난독화”의 개념입니다.


자바스크립트는 웹 사이트에서 많이 사용되는 객체 기반 스크립트 프로그래밍 언어입니다.


그러나, 일반적으로 클라이언트 측 언어로 사용되기 때문에 소스가 공개되어 있다는 단점이 있습니다.


예를 들어 네이버 홈페이지에 들어가서, 크롬의 개발자 도구를 보게 되면


 

위의 그림처럼 자바 스크립트 코드가 보이게 되는 것을 확인 할 수 있습니다.


이러한 단점을 보완하기 위해, “난독화라는 개념을 가져와 사용하기 시작하였습니다.


난독화에도 종류가 나뉘는데, 여기서 사용한 개념은 코드 난독화

코드 난독화는 프로그래밍 언어로 작성된 코드에 대해 읽기 어렵게 만드는 작업입니다.


난독화는 초기에 사용한 아이디어나 알고리즘을 숨기기 위한 것으로 사용되었으나, 근래에는 해커들의 공격 수단으로 사용되기 시작하였습니다.


그럼 이제 이 난독화 방법에 대해서 알아보려고 합니다.



(1)Split 기법


Split 기법은 문자열 기반의 탐지를 회피하기 위한 가장 간단한 기법입니다.


악성 문자열을 다수의 String 변수에 잘게 나눈 후 마지막에 재 조합을 하는 형식으로 이루어집니다.




위의 예제를 보면, split 기법을 사용하여 <iframe>태그를 넣은 것을 확인 할 수 있습니다.



(2)escape()/unescape()


escape()함수는 ASCII 형태의 문자열을 ISO Latin-1 형태로 변환해주는 함수입니다.

(알파벳과 숫자, *, @, -, _, +, /를 제외한 특수 문자만 인코딩 합니다.)


unescape()함수는 그와 반대로 ISO Latin-1 형태의 문자열을 ASCII 형태로 반환해줍니다.

( unescape escape로 난독화된 코드를 복호화하는 함수라고 이해하시면 됩니다.)


위의 예제를 간단히 설명하자면, document.write 첫번째는 "Helloworld!@#$%^&*()"를 escape 함수를 사용하여 난독화 하는 것이고,

document.write 세번째는 "Helloworld!@#$%^&*()"를 escape 함수가 사용된 것을 다시 unescape 함수를 사용하여 복호화 하는 것입니다.



(3)eval 함수


eval()함수는 자바스크립트 코드를 계산하고 실행하는 함수입니다.


예를 들어 myNum에 많은 연산값을 넣어준 후, eval을 사용하면… 위와 같이 모든 계산을 끝낸 후의 결과 값을 보여줍니다.


!, 이것을 활용하여 난독화된 소스를 해석하는 용도로 악성 스크립트에서 필수적으로 사용되는 함수입니다.


또한 숫자형태의 문자열로도 표기가 가능하여 eval()함수의 매개변수에 숫자형태로 난독화된 표기를 사용 할 수 있습니다.


위의 예제는 argos 를 숫자형태의 문자열로 표기를 해본 것입니다.


\ddd : 세 개의 8진수(ddd)로 지정된 Latin-1 문자

\xdd : 두 개의 16진수(dd)로 지정된 Latin-1 문자

\udddd : 네 개의 16진수(dddd)로 지정된 유니코드 문자로 표현할 수 있습니다.



(4) replace 함수


Replace()는 자바스크립트에서 문자열을 치환할 때 주로 사용합니다.


다만, 처음에 오는 문자 단 하나만 바꿔준다는 단점이 있습니다.


위의 결과를 보면, 단 처음에 오는 문자 단 하나만 바꿔준다는 것을 확인 할 수 있습니다.


만일 모두 바꾸기를 원한다면, 저희는 정규식 표현을 사용해야 합니다.


위의 결과를 보면, 정규식 표현을 사용하였을 경우 모든 문자열이 바뀐다는 것을 확인 할 수 있습니다.



(5)Decimal 난독화


변수에 10진수 값을 나열하는 형태의 코드입니다.


단순히 아스키코드 표에서 직접 쫒아가며. 난독화를 해제하거나, Mazilla JSDEtox와 같은 툴로 바로 풀리는 난독화이기 때문에 어렵지는 않습니다.




(6)Hexdecimal 난독화


이름에서 알 수 있듯이, 이것은 변수에 16진수 값을 나열하는 형태의 코드입니다.


Decimal 난독화와의 차이는 변수에 16진수인 10진수인지의 차이이기 때문에, 난독화 해제 역시 직접 아스키 코드 16진수 값을 보거나, Malzilla jsdetox 등을 이용하시면 됩니다.


이렇게 끝이 라고 하고 싶지만,


Hexdecimal에 대해 더 알아두셔야 할 것이 있습니다.


여기서는 간단한 예제를 들기위해 0x를 앞에 붙여서 0x(숫자)형식으로 표현을 하였지만,

주로 나오는 난독화의 형식은 %(숫자) \x(숫자)입니다.

%형태의 16진수 난독화는 앞서 설명하였던 툴에서 바로 풀리지만, \x형태의 난독화는 바로 풀리지 않습니다.

하지만, \x => %로 치환 후 분석하면, 되기 때문에 별 문제는 없습니다.



(7) XOR 기법


XOR 연산은 암호화에 많이 쓰이는 기법입니다.


-XOR  /복호화 방식

평문 ^ KEY = 암호문  // 암호문 ^ KEY = 평문


-XOR 연산의 성질

교환법칙: A ^ B = B ^ A // 결합법칙: (A^B)^C = A^(B^C)

항등원: A^0 = A // 역원: A^A = 0



위의 예제에서는


3번째 줄은 XOR 암호화를, 5번째 줄은 XOR 복호화를 간단하게 나마 표현한 것 입니다


(8) 8bit ASCII


ASCII 코드는 일반적으로 7bit로 모든 문자를 표현할 수 있습니다.


그러나 통신 특성 상 8bit씩 전송되는데 최상위 1bit는 무의미한 bit로 사용됩니다.


일반적으로 최상위 1bit 0으로 설정되어 있는데, 이것을 1로 변환하여도 간단한 조작을 통하여 실제 HTML 파일을 처리하는 과정에서 영향을 받지 않도록 할 수 있습니다.


방법은 META 태그에서 charset 속성을 US-ASCII로 설정하면 됩니다.

US-ASCII로 설정하면 8bit ASCII코드에서 최상위 1bit는 인식하지 않으니, 시그니처 기반 탐지 장비는 hex값이 다르다고 생각하며 탐지를 하지 못할 것입니다.


(9) 생성자 []


원리는 결과값이 NaN, Undefined, Number, Boolean, Object 등의 문자열로 반환이 되는데, 이러한 문자열 등을 이용하여 alert 등의 문자를 조립하여 호출하는 방식입니다.


자바스크립트는 한가지 특징이 있는데, 변수가 숫자, 스트링 및 배열로 자유자재로 변환이 가능하다는 것입니다. 예를 들면 []스트링은 “”로 변환될 수 있고, 숫자 0으로도 변환 될 수 있습니다.


여기서 숫자로 바뀌기 위해서는 +를 붙여야 합니다.



++[[]][+[]]  =>  ++[“”][+[]]  => +0[+[]] => 1[+[]] => 1[0]


위의 과정은 Test의 변환 과정을 나타낸 것이다.

처음 []배열이 “”이 되고, 그 다음 []배열이 +에 의하여 0 으로 변환되고, +를 통하여 1 를 만든다. [+[]]도 마찬가지로 [0]을 만들어 최종 1의 값이 완성되는 것이다.

 

이와 비슷하게 $난독화가 있는데, 2010년도에 발견된 난독화 기법으로 달러 난독화, jjencode등으로 불리고 있습니다.. 생성자 난독화와 비슷한 원리로 작동하니, 알아두시는 것이 좋습니다.


자바스크립트 난독화에 대해서 여러 가지 기법들에 대해 알아보았습니다.

다만, 여기서 소개하는 것들이 전부가 아닙니다. 더 난해하고 창의적인 난독화 기술들은 많이 존재 할 수 있습니다.


<Created by 서쿤>

'WEB > Web Hacking' 카테고리의 다른 글

CSRF (Cross-site request forgery) 란  (0) 2017.04.28
Drive-By-Download(DBD) 공격(이론편)  (0) 2017.04.24
파일업로드 취약점  (0) 2017.04.09
SQL injection  (0) 2017.03.25
XSS(Cross Site Scripting) 공격이란?  (0) 2017.03.12

+ Recent posts