XSS는 웹 브라우저에서 동작하는 악의적인 스크립트이다. 일반적으로 사용자의 개인정보, 쿠키탈취등을 한다.

 

대부분 XSS취약점을 진단하고자 할 때 <script>alert(1)</script> 와 같은 형태로 공격구문을 넣는다.

 

이를 우회하는 방법에는 여러가지가 있다.

 

 

1. 대소문자를 구분하는 함수를 이용해 보안을 해 놓았을 경우

 

공격 코드 : ex) <ScripT>alert(1)</SCRipT>

 

  

 

2. 금지어의 값을 Null 처리하는 함수를 이용해 보안을 해 놓았을 경우

 

공격 코드 : ex) <sscriptcript>alert(1)</sscriptcript>

 

  

 

 

3. HTML 태그 속성을 이용한 우회

 

특정 문자열만을 치환하는 방식의 함수가 쓰였을 때에 onmouseover 옵션을 사용하여 우회할 수 있다.

 

<?
 function XSSFilter($inputString)
 {
  $content = str_replace("<","&lt;",$content);
  $content = str_replace(">","&gt;",$content);
  return $content;
 
?>                                                                       

 

위와 같은 코드가 있다고 가정하자. 위 코드는  '<'와  '>' 문자열에 대해서 필터링을 한다.  예를들어 ?file=<script>alert(1)</script>   와 같은 형태로 공격구문을 넣었을 때 필터링과정을 거쳐    &lt;script&gt;alert(1)&lt;/script&gt;  와 같이 출력될 것이다.

 

 

공격 코드 : ex) <img scr="hello" onmouseover="alert(1)l">

 

"hello"라는 이미지 파일에 마우스를 올려 놓았을 경우 스크립트가 실행된다.

 

 

  

 

4. 문자열 분리를 통한 우회


자바 스크립트의 eval 함수를 이용하여 우회한다.

여기서 eval 함수에 대해 짚고 넘어가겠다.

 

eval() 함수의 인자는 기본적으로 문자열이다. 만약 문자열이 표현식을 나타낸다면 eval()은 표현식을 실행하지만, 인자가 있는 경우에는 문장을 반환한다.

 

예를 들어 eval("1+2") 는 3을 반환하지만, eval(new String("2+2")); 는 "2+2" 인 문자열 객체를 반환한다.

이때 변수를 선언하고 그 변수에 객체를 저장한 다음 toString()을 사용하면 이 제약을 피할 수 있다.

ex) var A = new String("1+2");

    eval(A.toString());  => 3을 반환!

 

공격 코드 : var inputString="aler" + "t(al" + "ert" + "(1));" ;

               eval(inputString);

  

 

 

5. 연속된 문자열을 거부하는 함수 우회

 

ex) 웹해킹 23번

 

 

위와 같은 경우 문장의 종료를 나타내는 'null'값을 문자열 사이 사이에 url 인코딩하여 넣어주면 된다 (위의 경우에는 GET방식으로 입력받기 때문)

 

공격 코드 : <s%00c%00r%00i%00p%00t>%00a%00l%00e%00r%00t%00(1);</s%00c%00r%00i%00p%00t>

  

 

 

 

참조 사이트

 

https://msdn.microsoft.com/ko-kr/library/12k71sw7(v=vs.94).aspx

 

http://dntsecurity.blogspot.kr/2017/02/xss.html

 

 

 

 

- Created by subo0521 -

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

error based sql injection  (0) 2017.09.18
Drive-By-Download(DBD)공격(실습편)  (0) 2017.05.29
Blind SQL Injection (이론편)  (0) 2017.05.14
파일 다운로드 취약점  (0) 2017.05.08
CSRF (Cross-site request forgery) 란  (0) 2017.04.28

error based sql injection 참과 거짓을 error로 구분하는 것인데 보통 if문으로 공격하는 기법.


일단 mysql에서의 if문을 보면

if(조건 , 참 , 거짓) 으로 나타냅니다.

이것으로 참일때 또는 거짓일 때 에러를 출력하게 하면 됩니다.

에러는 서브쿼리를 이용하면 됩니다


예시:

<?php
  
include "./config.php"
  
login_chk(); 
  
dbconnect(); 
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~");
  if(
preg_match('/sleep|benchmark/i'$_GET[pw])) exit("HeHe");
  
$query "select id from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  
$result = @mysql_fetch_array(mysql_query($query));
  if(
mysql_error()) exit(mysql_error());
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>";
  
  
$_GET[pw] = addslashes($_GET[pw]);
  
$query "select pw from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  
$result = @mysql_fetch_array(mysql_query($query));
  if((
$result['pw']) && ($result['pw'] == $_GET['pw'])) solve("iron_golem");
  
highlight_file(__FILE__);

?>

출처 : lord of sqlinjection


위의 예시를 보면 if문에

mysql에서 (select 1 union select 2)를 넣게 되면 Subquery returns more than 1 row 라는 에러가 뜨게 됩니다.

따라서 url에 " ' or id = 'admin' and (if(length(pw)>숫자,(select 1 union select 2),1)#"를 넣으면

숫자에 해당되는 수에서만 error를 띄우지 않습니다.

물론 select 1 union select 2 와 1 의 자리를 바꾸어 준다면 error가 참일때만 발생할 것입니다.

이렇게 알게된 길이를 범위로 잡고

비밀번호를 계속해서 대입시켜준 다음 화면을 txt로 받아 Subquery가 있을 때의 값으로 비밀번호를 찾을수 있습니다. 

-create by sang-gamja

  



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

xss (Cross Site Scripting)  (0) 2017.12.04
Drive-By-Download(DBD)공격(실습편)  (0) 2017.05.29
Blind SQL Injection (이론편)  (0) 2017.05.14
파일 다운로드 취약점  (0) 2017.05.08
CSRF (Cross-site request forgery) 란  (0) 2017.04.28

이번에는 "Drive-By-Download(DBD)공격"의 간단한 원리 등을 직접 해보겟습니다.


저번 이론편에서 페이지 이동 및 악성코드의 유포에 대한 모든 것이 "스크립트 코드"로 이루어진다고 말하였습니다.



순서대로 하나씩 구현을 해보겠습니다.

(난독화는 하지 않고 진행하겠습니다.)


1. 페이지 이동

:<iframe>, javascrpit 코드 등을 사용하여 페이지 이동이 가능해집니다.


총 5개의 웹 사이트가 있다고 가정합니다.


각각의 사이트들은 그냥 h2 태그에 의해 문자를 보이는 형식으로 이루어져 있습니다.

A1.html = A1 PAGE 출력 / A2.html = A2 PAGE 출력 ...

위의 노랑색으로 칠한 코드는 페이지를 불러오는 역할을 합니다.



*iframe 코드 설명

iframe코드는 다른 웹사이트를 자신의 웹의 프레임 안에 불러오는 역할을 합니다.

만일 위의 코드에서 display:none(화면에 안보이게하기)를 없애버리면...


즉! 웹사이트안에 웹사이트가 생기는 것입니다.




이러한 것을 사용하면 하나의 웹사이트가 다른 웹사이트를 불러오고, 그 웹사이트가 다른 웹사이트를 불러올 수 있습니다.

이말은 다른 웹사이트의 스크립트 코드에 의해 영향을 받을 수도 있다는 것을 말합니다.

 

예를 들어

A5.HTML에 alert("A5")라는 스크립트 코드를 넣으면, A1에 접속 시 A5경고 메시지를 보게 됩니다.


이것을 악성코드 유포에 사용한다면...

A1에 접속 시 A2,A3,A4,A5안에 멀웨어(바이러스)를 다운 받는 코드가 있다면, 바이러스를 다운받게 됩니다.




2. 악성 스크립트 코드 & 난독화

위에서 설명한 예제로 든 것은, 기존에 쉽게 알 수 있는 script 코드 입니다.


하지만 실제로는 이러한 스크립트 코드를 악의적인 목적으로 만들어 악성 스크립트 코드를 만듭니다. 그런 후에 지나치는 웹 


사이트 중 하나에 이러한 스크립트 코드를 넣게 되면, 직접적으로 그 사이트에 접속하지 않더라도, 연결되어 있는 웹에 접속하


게 되면 자동적으로 이 악성 코드에 감염되게 됩니다.


스크립트 코드를 분석하게 되면, 이러한 악성코드가 무엇인지, 무슨 기능을 하는지, 서버는 어디를 이용하는지, iframe태그를 어디다 연결하는지 등에 대해 알게됩니다. 그렇기에 이러한 분석을 최대한 지연시키기 위해 난독화를 이용합니다.


예를 들어

<iframe src="A2.HTML" style="display:none"></iframe>이 HTML페이지의 소스에 있으면 바로 보이기 때문에...


"%3Ciframe%20src%3D%22A2.HTML%22%20style%3D%22display%3Anone%22%3E%3C/iframe%3E" 등으로 난독화 하여 자바스크립트 코드인 Document.write랑 같이 사용합니다.

eval과 replace 등의 함수 조합을 통하여 <iframe>태그를 만들어서 호출합니다.


또는 


쉘코드를 이용하기도 하는데, 이러한 쉘코드도 그대로 사용하지 않습니다.

hex 값 변조, xor 변조 등을 통하여 쉘코드를 변조 시켜 사용합니다.


이외에도 많은 난독화 기법을 사용하여 악성 스크립트 코드등을 이용합니다.





<Created by 서쿤>




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

xss (Cross Site Scripting)  (0) 2017.12.04
error based sql injection  (0) 2017.09.18
Blind SQL Injection (이론편)  (0) 2017.05.14
파일 다운로드 취약점  (0) 2017.05.08
CSRF (Cross-site request forgery) 란  (0) 2017.04.28

Blind SQL Injection 이란?


Blind SQL Injection은 임의의 SQL 구문을 삽입하여 인가되지 않은 데이터를 열람할 수 있는 공격 방법이라는 점에서 일반적인 SQL Injection과 동일하다.


다만 일반적인 SQL Injection의 경우에는 조작된 쿼리를 입력 해 한번에 원하는 데이터를 얻을 수 있지만, Blind SQL Injection은 쿼리 결과에 따른 서버의 참과 거짓 반응을 통해 공격을 수행한다.


즉, 쿼리에 대한 결과가 참일때와 거짓일 때 서버의 반응이 나타나야 하며 이를 구분할 수 있어야 한다.


Blind SQL Injection을 수행하기 위해선 몇 가지 기본적인 함수에 대해 알고 있어야 한다.


1. substr


substr은 문자열을 자를 때 사용하는 함수이며 사용 방법은 아래와 같다.


substr(자를 문자열, 자를 문자의 시작점, 자를 문자 개수)


예를 들어, str = substr("HelloWorld", 1, 3)일 경우, substr함수를 통해 HelloWorld의 1번째 부터 3개의 문자가 str에 저장된다.


즉, str에는 Hel이 저장된다.


만약 str = substr("HelloWorld", 5, 2)일 경우에는 str에는 oW가 저장된다.


2. ascii


ascii 함수는 문자의 아스키 코드 값을 반환해 주는 함수이다.


ascii(아스키 코드로 반환 할 문자)


위와 같은 형태로 사용되며, ascii(a)의 경우 a의 아스키 코드 값인 97이 반환된다.


위의 2 가지 함수를 통해 Blind SQL Injection을 수행할 수 있다.



공격 방법


위에서 언급했듯, Blind SQL Injection은 쿼리 결과에 따른 서버의 반응을 보고 공격을 수행한다.


공격 예시를 보이기 전 몇 가지 상황을 가정하려 한다.


1. table의 이름은 users이다.


2. 속성에는 id와 pw가 있다.


3. 공격자는 테이블 명과 admin의 id는 이미 알고 있다.


4. 서버에서는 로그인에서 자주 사용되는 SELECT * FROM users where id='(입력받은 id)' and pw='(입력받은 pw)';  형태의 쿼리문을 실행한다.


이 때 공격자는 admin의 pw를 알아내기 위한 Blind SQL Injection 공격을 수행하려 한다.


먼저 id는 알고 있으므로, 로그인 창의 ID 입력 부분에는 admin의 id를 입력한다.


id의 뒤에는 pw의 첫 글자를 알아내기 위한 쿼리를 삽입한다.


ascii(substr(select pw from users where id = 'admin', 1, 1))의 쿼리를 사용하면 users 테이블에서 id가 admin인 행의 pw의 첫 글자를 가져와 아스키 코드로 바꾸어 준다.


공격 시에는 이를 활용한다.


즉, ID 입력 칸에 admin' and ascii(substr(select pw from users where id = 'admin', 1, 1)) < 100 -- 을 삽입한다.


위의 쿼리를 삽입함에따라 서버에 전달되는 전체 쿼리는 다음과 같다.


SELECT * FROM users where id='admin' and ascii(substr(select pw from users where id = 'admin', 1, 1)) < 100 -- and pw='(입력받은 pw)'


원래의 쿼리에서는 users 테이블에서 id와 pw를 입력받아 두 값이 동일한 행을 찾아 출력하는 쿼리문이었다.


하지만 공격 쿼리를 삽입한 후에는 id가 admin이고, id가 admin인 행에서 pw의 첫 글자를 아스키 코드로 바꾼 값이 100 이하여야 쿼리문이 동작한다.


뒤의 pw를 입력받아 이를 비교하는 구문은 주석처리 된다.


따라서 만약 pw의 첫 글자가 아스키 코드 값으로 100 이하가 될 경우에는 쿼리문이 실행되고, 아닐 경우에는 쿼리문이 실행되지 않는다.


위와 같은 방법을 반복하면 pw의 첫 글자를 알아낼 수 있으며, 더 나아가 pw의 전문을 알아낼 수 있다.



이것으로 Blind SQL Injection에 대한 기본적인 설명을 마치고, 다음번엔 직접 실습 환경을 구성하고 공격을 실습하려 한다.


Created by ccoma

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

error based sql injection  (0) 2017.09.18
Drive-By-Download(DBD)공격(실습편)  (0) 2017.05.29
파일 다운로드 취약점  (0) 2017.05.08
CSRF (Cross-site request forgery) 란  (0) 2017.04.28
Drive-By-Download(DBD) 공격(이론편)  (0) 2017.04.24

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




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


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