파일 다운로드 취약점이란 인터넷에서 어떠한 파일을 받는 과정에서 발생하는 취약점으로 방문자에게 허용된 파일 외의 다운로드를 가능하게 함으로써 웹 서버의 소스 및 페스워드 등을 다운받을 수 있다.




1.URL파라미터 변조


 게시판에 첨부된 파일을 사용자에게 제공하는 방식에는 정적과 동적 방식이 있으며, 아래와 같은 정적방식은 디렉터리에 파일 링크를 걸어 사용자에게 제공하기 때문에 파라미터 변조 가능성이 없는 안전한 구조이다.


http://xxx.xxx.xxx/xxx/downfile.txt


그러나 동적방식의 경우, 파리미터 값 조작(file = ../../../../../../../../../etc/passwd)등의 취약점으로 인해 시스템 파일 등의 접근시도가 가능하다.


http://xxx.xxx.xxx/xxx?file=downfile.txt




2.NULL바이트 인젝션


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



 1) Perl


C로 개발된 펄의 경우, FILE()함수에 입력된 값은 마지막처리단계에서 C 프로세스로 전달되기 때문에 %00과 같은 널 문자를 이용한 공격이 가능할 것이다.



위의 코드는 외부에서 입력된 값에 .jpg를 붙여 처리하도록 구성되어 있기 때문에 다운로드를 원하는 파일의 확장자가 jpg로 끝나야 한다.

그러나 널바이트와 .jpg를 삽입하는 경우 위 로직을 우회할 수 있다.


정상적인 URL


우회된 URL



  2)JAVA


자바의 경우는 java.io.File 함수가 파라미터를 C API로 전달하기 때문에 NULL바이트 인젝션이 가능하다.



정상적인 URL


우회된 URL




3. 멀티 파라미터 변조


 웹 사이트의 구조를 보면 file 과 file_path라는 파라미터가 존재하며, 각각에는 파일 이름과 디렉토리가 입력되는 구조를 보인다.

 이러한 경우에는 2개의 파라미터를 적절하게 변조하여 접근해야 한다.


정상적인 URL


의심스러운 파라미터가 2개이기 때문에 file 혹은 file_path만 변조하거나, 둘 모두를 동시에 변조하여 접근해볼 수 있다.


file 파라미터 변조


file_path 파라미터 변조


file, file_path 파라미터 모두 변조




4. 웹 로그를 통한 관리자 권한 획득


 파일 다운로드 취약점이 있다는 것을 확인한 후, 웹 로그 접근을 이용하여 관리자정보를 얻는 과정이다.

 파일 다운로드 취약점이 있다면, 다양한 시스템파일(passwd, .cshrc, .bashrc, .profile, .bash_profile 등)의 접근을 통하여 웹 로그파일의 위치를 추측하여 접근을 할 수 있다.



관리자 페이지에 입력되는 계정과 암호를 GET 메소드를 통해 전송하는 경우, 입력된 모든 정보는 웹 로그에 고스란히 남게 된다.  

또한 웹 로그의 접속한 모든 디렉토리 및 페이지 정보도 확인할 수 있으므로 디렉토리 전체를 보는 것과 동일 한 공격효과를 볼 수 있다.


by dajababa



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

Drive-By-Download(DBD)공격(실습편)  (0) 2017.05.29
Blind SQL Injection (이론편)  (0) 2017.05.14
CSRF (Cross-site request forgery) 란  (0) 2017.04.28
Drive-By-Download(DBD) 공격(이론편)  (0) 2017.04.24
파일업로드 취약점  (0) 2017.04.09


CSRF는 Cross-site request forgery의 약자로 사이트 간 요청 위조 또는 크로스 사이트 요청 위조를 뜻한다.

XSS( 사이트 간 스크립팅) 을 이용한 공격이 사용자가 특정 웹사이트를 신용하는 점을 이용한 것이라면,

CSRF는 특정 웹사이트가 사용자의 웹 브라우저를 신용하는 상태를 노린 것이다.



1. 발생 원인

개별 링크와 폼이 사용자 별로 예측 가능한 토큰을 사용할 때

-> 예측 불가능한 토큰이 있으면 공격자는 요청 메시지를 변조할 수 없고, 예측 가능한 토큰이 있으면 요청 메시지를 변조할 수 있다.

- 인증이나 세션, 쿠키 등 모든 웹사이트에서 인증된 사용자가 보내는 데이터는 정상적인 경로를 통한 파라미터 요청으로 판단

-> 정상적인 요청과 비정상적인 요청을 구분하지 못한다.




2. 공격 과정



3. 공격 영향

1.사용자 계정 생성

2. 중요 데이터 액세스

3. 게시글 내용 변경

4. 관리자 권한 획득

5. 라우터 및 공유기 설정 변경

6. 계정 정보 변경

etc.



4. 공격 방법


공격자가 올린 게시글을 읽었을 때 피해자의 정보가 수정될 수 있도록 하거나 관리자의 권한을 얻도록 스크립트를 작성하는 것이 대표적인 예이다.




비밀번호를 바꾸는 페이지이다.

페이지 소스를 보면 다음과 같다.




html 소스는



새로운 php파일을 만들고 password_new 의 value가 admin이 되도록 바꿔준다. 


<form action="http://~~~~~~~~~~~~" method="GET">

New password:<br />

<input type="password" AUTOCOMPLETE="off" name="password_new" value='admin'><br />

Confirm new password:<br />

<input type="password" AUTOCOMPLETE="off" name="password_conf"><br />

<br />

<input type-"submit" value="change" name="Change">

</form>




아까의 패스워드 변경 페이지에 test값을 넣고 Change를 누르면 비밀번호가 변경된다.




5. 예방 방법

1. 단순히 Session Token만을 이용한 권한 부여를 금지한다.

2. REFERER가 정상적인지 확인한다.

3. XSS 취약점이 없는지 확인한다.

4. GET 방식과 POST방식을 구분해 준다.


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

Blind SQL Injection (이론편)  (0) 2017.05.14
파일 다운로드 취약점  (0) 2017.05.08
Drive-By-Download(DBD) 공격(이론편)  (0) 2017.04.24
파일업로드 취약점  (0) 2017.04.09
SQL injection  (0) 2017.03.25

이번에 소개할 기법은 "Drive-By-Download"입니다.

앞글자를 따서 "DBD 공격" 이라고 부르기도 합니다.


0.정의


Drive-By-Download를 네이버에서 찾아보면,

"웹이 갖고 있는 취약한 보안 상태를 활용해 악성코드를 심어놓은 방법이다" 라고 정의되어 있습니다.

하지만, 이 정의로는 무언가 부족합니다. 그 이유는 이름에 전반적인 행동이 나와있는데, 그것에 대해 설명이 되어 있지 않았기 때문입니다. 


이름에서 "Drive-by"(지나간다)" 와 "Download(다운로드 하다)"가 합쳐져있는 것을 볼 수 있습니다.


이것들을 모두 포함하면, "지나가면서 다운로드 하다"로 해석이 가능합니다.

이게무슨말인지?  이해가 가나요?  이해가 안되실 겁니다. 하지만 밑에 내용을 보게되면, 이해가 되실겁니다.


1.원리


그림을 통해 간단한 원리와 특징을 설명하겠습니다.



1.사용자가 취약점이 있는 웹사이트 또는  크래커가 만든 사이트를 들어가게 됩니다.

2. 취약점이 있는 웹사이트 또는 크래커가 만든 사이트에는 스크립트 코드 등을 이용하여 악성코드가 있는 웹으로 이동시킵니다.

이때 이 악성코드가 있는 웹이 있는곳을 안들키기 위해서, 여러가지 경유 사이트를 만들어 놓습니다.

3.악성코드가 있는 웹에서 자기도 모르게 다운로드를 받게 됩니다.



*주로 사용되어진 스크립트 코드

*페이지 자유 이동

<iframe>, <frame>, <javascript> 등을 사용하여 사용자 행위 없이 페이지 이동이 가능하도록 기존 웹페이지에 삽입


*악성코드 유포

<object>, <embed> 등의 태그를 이용하여 숨김 객체 삽입



2. 전파 방법


-과거


-현재


예전에는 전파 경로를 이메일을 주로 사용하였습니다.

하지만 이제 기술이 발전하여 요즘에는 웹사이트를 사용하여 대규모로 악성코드를 유포 시킬 수 있게 되었습니다.

이러한 방법을 통해 유행하고, 아직도 존재하는 대표적인 악성코드는 "랜섬웨어" 입니다.


3. 난독화


이 Drive-By-Download와 같이 사용되는 것은 "난독화" 입니다.

그 이유는 위의 원리를 보면, 페이지 이동 및 악성코드 유포에 대한 모든 것이 스크립트 코드를 통해 이루어지기 때문입니다.

그렇기 때문에 그 코드 등을 최대한 안보이게 또는 알기 어렵게 하기 위해 난독화를 진행합니다.

주로 hexadecimal obfuscation, Dean Edwards'Packer, jjencode, Gondad EK, CK VIP 등이 사용됩니다.



여기까지 Drive-By-Download 공격의 이론에 대해서만 설명하였습니다.

다음에는 Drive-By-Download공격의 실습에 대해서 올리도록 하겠습니다.


<Created by 서쿤>

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

파일 다운로드 취약점  (0) 2017.05.08
CSRF (Cross-site request forgery) 란  (0) 2017.04.28
파일업로드 취약점  (0) 2017.04.09
SQL injection  (0) 2017.03.25
자바스크립트(JavaScript) 난독화  (0) 2017.03.21

HTTP 란?



HTTP는 HyperText Transfer Protocol의 약자로, www(World Wide Web)에서 쓰이는 핵심 통신 프로토콜이다.


거의 모든 웹 애플리케이션에서 사용되고 있으며, 메시지 기반 모델로서 클라이언트가 요청 메시지(Request)를 보내면 서버에서 응답 메시지(Response)를 보내는 형태로 이루어져 있다.




즉, 사용자가 웹 페이지의 링크를 클릭했을 때 브라우저(클라이언트)는 HTTP의 형태로 메시지를 작성하여 웹 서버에 전송한다.


웹 서버에서는 받은 메시지에 대하여 HTTP의 응답 형태로 메시지를 작성 해 브라우저에 보내면, 브라우저는 이를 해석 해 화면에 보여주게 된다.



HTTP 구조


HTTP는 Header와 빈 공백, Body로 나누어 지며, Header에는 주소 정보 등이, Body에는 메시지 정보가 포함된다.


아래에서 HTTP Request와 HTTP Response에 대하여 자세하게 설명한다.


1. HTTP Request



위의 사진은 현재 블로그(4rgos.tistory.com)로 접속을 요청할 때의 HTTP Header이다.


한줄 씩 설명하면 다음과 같다.


GET / HTTP/1.1 - HTTP 전송 방법, 기본 페이지(/)와 프로토콜 버전. 일반적으로 웹서버로부터 자료를 가져오는 기능을 하는 GET 방식을 많이 사용한다. GET 방식의 경우, 별도의 메시지 Body를 사용하지 않는다. 따라서 Body 부분에는 공백이 존재한다.


Host : 4rgos.tistory.com - 요청한 서버의 Host.


Proxy-Connection: keep-alive - HTTP 1.1부터 지원하는 기능. 서버와 클라이언트가 서로 연결이 되어있는 상태에서 지정된 시간동안 서로 패킷의 교환이 없더라도 패킷 교환을 대기하는 구조이다. 즉, 지정된 시간 내에 패킷 교환이 이루어진다면 계속해서 연결된 상태를 유지한다. 이 경우, 웹 프록시 툴을 통해 Request 메시지를 전송 해 Proxy-Connection 이라고 표시되었지만, 브라우저가 웹서버에 직접 요청하는 경우 Connection이라고 표시된다.


Upgrade-Insecure-Requests : 1 - HTTPS : 1과 동일한 표현. HTTP 메시지 전송 시 보안을 적용한다.


User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) ~ - 사용자의 웹 브라우저 종류나 기타 클라이언트의 소프트웨어 정보를 보여준다. 위의 예시에선 클라이언트가 윈도우 10 64비트 환경에서 크롬 브라우저를 사용했다는 것을 알 수 있다.


Accept : text/html,application/xhtml+xml, ~ - 웹 서버로부터 수신되는 데이터 중 웹 브라우저가 처리할 수 있는 데이터 타입을 의미. text/html은 text, html 형태의 문서를 처리할 수 있다는 것이고, 끝 부분에 */*은 모든 문서를 처리할 수 있다는 의미이다.


Accept-Encoding : gzip, deflate, sdch - 전송할 수 있는 인코딩


Accept-Language : ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4 - 전송할 수 있는 언어


Cookie : ~ - 클라이언트가 서버에게 추가 정보를 보낼 때 사용한다.


2. HTTP Response


다음은 위의 Request를 전송했을 때 웹 서버로부터 받은 HTTP Response의 모습이다.



HTTP/1.1 200 OK - 웹 프로토콜 버전 및 응답 코드 정보. 200 OK가 표시되면 요청이 성공적으로 이루어졌고 요청한 자료가 클라이언트에게 보내졌다는 것을 의미한다.


Date: Sun, 16 Apr 2017 07:43:13 GMT - Response를 전송 한 날짜 및 시간을 나타낸다.


Server : Apache - 웹 서버로 사용하고 있는 소프트웨어의 이름을 나타낸다.


X-UA-Compatible: IE-Edge - 호환성과 관련하여 사용중인 IE 브라우저의 최신 버전의 엔진을 사용해야 한다는 의미이다.


Expires: Thu, 19 Nov 1981 08:52:00 GMT - 예전에 응답한 내용이 만기 시 캐시에 저장되지 못하게 지시한다.


Cache-Control: ~ / Pragma: ~ - 두 Header 모드 브라우저로 하여금 요청 시 캐시된 문서를 사용하지 말고 매 번 서버로부터 새로운 문서를 다시 전송받아 사용하도록 하는 Header이다.


P3P: CP='ALL DSP COR MON LAW OUR LEG DEL' - 사용자들이 허용하는 정보만 웹 사이트가 수집할 수 있도록 하는 도구. 클라이언트에게 웹 사이트의 프라이버시 보호 정책을 전달한다. 세 개의 문자로 구성된 토큰을 사용한다. (참고 : https://www.w3.org/TR/P3P11/#compact_policies)


Access-Control-Allow-Origin: http://4rgos.tistory.com - 서버 리소스에 대한 접근을 제한하는 Header이다. 이 예시의 경우 리소스에 대한 접근을 http://4rgos.or.kr에게만 허용한다. 만약 * 일 경우에는 모든 도메인으로부터의 접근이 가능하다.


Set-Cookie: visited= ~ - 클라이언트에게 쿠키 정보를 알려준다. 이 경우, visited라는 쿠키가 생성 되었으며 이 값을 클라이언트에게 알려주기 위해 사용되었다.


Vary: Accept-Encoding - 응답에 영향을 줄 수 있는 헤더의 목록을 클라이언트에게 알려준다.


Content-Length: 117851 - Body의 길이를 나타낸다.


Content-Type: text/html; charset=utf-8 - body에 적혀있는 것이 어떤 종류의 문서인지를 나타낸다. 이 경우, Body에는 text/html 형태의 문서가 적혀있다.


공백 - Header와 Body를 구분짓는 공백이다.


<!DOCTYPE html> ~ - 서버가 클라이언트에게 전송하는 메시지의 본문(Body)이다.



Created by ccoma

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

페이지 이동 Loction.href  (0) 2017.11.20
base64  (0) 2017.11.06
자바스크립트 용어  (0) 2017.10.28
아스키 코드(ASCII)  (0) 2017.10.16
javascript indexOf 함수와 lastindexOf 함수  (0) 2017.09.25


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

XSS 란?


웹 해킹 공격 중 XSS라는 공격 기법이 있다.


Cross Site Scripting의 약자로 CSS라고 하는 것이 맞지만 이미 CSS가 Cascading Style Sheets의 약어로 사용되고 있어 XSS라 한다.


XSS는 게시판이나 웹 메일 등에 자바 스크립트와 같은 스크립트 코드를 삽입 해 개발자가 고려하지 않은 기능이 작동하게 하는 치명적일 수 있는 공격이다.


또한 대부분의 웹 해킹 공격 기법과는 다르게 클라이언트 즉, 사용자를 대상으로 한 공격이다.


XSS 공격은 크게 Reflected XSSStored XSS 그리고 DOM Based XSS 세 가지로 분류할 수 있다.


이번 포스팅에서는 Reflected XSS와 Stored XSS에 대해서 설명하려 한다.


1. Reflected XSS


다음과 같이 ID를 입력하면 "Welcome OOO !!"을 출력해 주는 페이지가 있다고 가정하자.




이 페이지에 간단한 스크립트를 삽입하면 별다른 필터링 없이 실행이 되는 것을 확인할 수 있다.




공격자는 이러한 취약점이 존재하는 페이지를 미리 탐색한 후, XSS 공격을 위한 스크립트가 포함 된 URL을 공격 대상자에게 노출시키는 방법으로 공격을 수행할 수 있다.


Reflected XSS의 공격 순서는 다음과 같다.



공격자가 미리 XSS 공격에 취약한 웹 사이트를 탐색하고, XSS 공격을 위한 스크립트를 포함 한 URL을 사용자에 노출시킨다.


사용자가 해당 URL을 클릭 할 경우, 취약한 웹 사이트의 서버에 스크립트가 포함 된 URL을 통해 Request를 전송하고, 웹 서버에서는 해당 스크립트를 포함한 Response를 전송하게 된다.


2. Stored XSS


Stored XSS는 Reflected XSS와는 달리 웹 사이트의 게시판에 스크립트 삽입하는 공격 방식이다.


공격자는 게시판에 스크립트를 삽입한 후 공격 대상자가 해당 게시글을 클릭하도록 유도한다.



공격자가 미리 XSS 공격에 취약한 웹사이트를 탐색하고 XSS 공격을 위한 스크립트를 포함 한 게시글을 웹 사이트에 업로드 한다.


게시글의 URL을 사용자에게 노출하고 사용자가 게시글을 확인함으로써 URL에 대한 요청을 서버에 전송하게 된다.


웹 서버에서 스크립트를 포함한 Response를 전송하며 공격이 수행된다.



XSS 위험성


다음으로 XSS를 통해 어떤 피해가 발생할 수 있는지 알아본다.


1. 쿠키 정보 및 세션 ID 획득


공격자는 XSS에 취약한 페이지 및 게시판에 XSS 공격을 수행함으로써 해당 페이지를 이용하는 사용자의 쿠키 정보나 세션 ID를 획득할 수 있다.


쿠키는 웹 서버가 브라우저에 보내는 4KB 이하의 작은 텍스트 파일로, 사용자가 웹 사이트를 이용하는 동안 사용자 브라우저에 저장하는 파일이다.


주로 사용자의 상태를 기록하기 위해 쿠키에 로그인 및 버튼 클릭 등에 대한 정보를 저장한다.


만약 세션 ID 등을 쿠키에 포함하는 경우, XSS 공격을 통해서 페이지 사용자의 세션 ID를 획득 해 공격자가 불법적으로 정상 사용자인 척 가장할 수 있다.


2. 시스템 관리자 권한 획득


XSS 취약점이 있는 웹 서버에 다양한 악성 데이터를 포함시킨 후, 사용자의 브라우저가 악성 데이터를 실행하게 할 수 있다.


공격자는 아직 패치되지 않은 취약점에 대한 공격 코드가 실행되도록 해 사용자의 시스템을 통제할 수 있다.


만약 회사 등 조직의 개인 PC가 해킹될 경우, 조직 내부로 악성 코드가 이동 해 내부의 중요 정보가 탈취될 수 있다.


3. 악성코드 다운로드


XSS 공격은 악성 스크립트 자체로 악성 프로그램을 다운로드 할 수는 없다.


하지만, 사용자가 악성 스크립트가 있는 URL을 클릭하도록 유도 해 악성 프로그램을 다운받는 사이트로 리다이렉트(Redirect) 하거나 트로이 목마 프로그램을 다운로드 하도록 유도할 수 있다.


4. 거짓 페이지 노출


XSS 공격에 취약한 페이지일 경우, <script> 태그 뿐만 아니라 <img>와 같은 그림을 표시하는 태그를 사용 해 원래 페이지와는 전혀 관련이 없는 페이지를 표시할 수 있다.


기타 다른 태그도 사용이 가능할 경우, 원래 페이지의 일부를 변조 해 거짓 페이지를 노출할 수 있어 이를 통해 개인정보 유출 등의 위험이 있다.



XSS 방지법


XSS 공격은 IPS, IDS, 방화벽 등으로도 방지할 수가 없다.


때문에 단순히 문자를 필터링 하는 등의 방법만이 존재한다.


1. script 문자 필터링


XSS 공격은 입력값에 대한 검증이 제대로 이루어지지 않아 발생하는 취약점이다.


때문에 사용자의 모든 입력값에 대하여 서버측에서 필터링을 해 주어야 한다.


PHP의 eregi 함수를 이용하면 XSS 공격에 주로 사용되는 문자들을 필터링 할 수 있다.


주로 스크립트를 실행하기 위한 특수문자를 필터링 하며, <, >, ", ' 등의 문자가 있다.


2. htmlentities 사용


PHP 함수 중 htmlentities라는 함수가 있다.


htmlentities는 모든 특수문자를 HTML 엔티티(entity)로 변환한다.


※ HTML 엔티티는 "&약어;" 및 "&#숫자;"의 형태를 표현하는 것을 의미한다. 예를 들어 <는 &lt;로, >는 &gt;로 표현한다.


Created by ccoma

'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
자바스크립트(JavaScript) 난독화  (0) 2017.03.21

+ Recent posts