레이블이 웹방화벽인 게시물을 표시합니다. 모든 게시물 표시
레이블이 웹방화벽인 게시물을 표시합니다. 모든 게시물 표시

2011년 3월 1일 화요일

Include Injection 대처법

File include 취약점은 크게
local include Injection
Remote include Injection 취약점으로 나뉜다.

Local include Injection 취약점은 시스템 내부의 파일을 열람하여 정보를 획득하거나, 내부에 파일을 생성시켜 악용하는 방법이며,

Remote Include Injection 취약점은 http 또는 ftp 프로토콜을 통한 외부 사이트의 소스를 실행 할 수 있는 기능을 이용하여 임의의 명령 실행이나 악의적인 스크립트를 실행시키는 공격 방법이다. 본 문제에서는 Local Include Injection 취약점에 대해서 다루었으며 소스코드 수정을 통한 보완을 할 수 있다.
 


1) 문제 확인.

- 웹브라우저를 이용하여 문제에 접근하면 다음과 같이 hint와 click to me 라는 문구가보인다.



- click to me를 클릭하면 전 페이지의서 제공된 소스를 분석하라고 친절하게 가르쳐 준다.  download.phps 파일을 열람하여 소스를 분석해 보자.


 - download.php의 소스 코드 내용 중 include 함수를 이용하는 부분에 php injection 취약점이 존재 한다는 것을 알 수 있다.  Include($url. error.php) 부분을 보면 &url 이라는 변수 경로를 동적으로 할당해서 error.php의 파일을 include 시키는 형식으로 되어있다. 이러한 코드는 PHP injection 취약점을 발생시키며 내부에 있는 시스템 파일을 열람 할 수가 있다.



2) PHP injection 공격 시도.

 - 다음과 같이 ../../../etc/passwd 라는 문자열을 url 파라메터에 삽입하여 시스템내부의 파일을 열람 할 수 있게 하였다. 하지만 오류메시지가 뜨면서 실행이 되지 않았다. 소스코드에서 보면 include($url.error.php) 로 되어있다. $url 이후에 error.php 문자열을 붙이도록 되어있기 때문이다. 이를 우회하기 위해 를 이용하여 문자열의 끝으로 인식시켜 /etc/passwd 파일을 열람 할 수 있었다. 이란 문자열의 끝인 NULL CHAR를 의미한다. 그러므로 /etc/passwderror.php에서 error.php는 서버에서 인식하지 않는 것이다.
 - 1차 시도

 - 를 이용한 2차 시도

3) download.php의 소스코드 수정.
 - eregi 함수를 이용하여 $url 의 값을 검사 할 수 있다. 기본적으로 . , .. , /, // 와 같은 문자열을 막으므로 내부 시스템 파일을 확인 할 수 없도록 한다.




 
- 소스코드 적용확인
.


4) 문제 해결 인증.

download.php에 추가된 소스코드
If( eregi(http|\.\.|\/|\/\/|\.,&url))
{
            echo not good :);
            exit;
}

Remote Include Injecton을 사용하기 위해서는 한가지 선행되어야 할 옵션이 있는데 바로 Apache 설정 중 allow_url_fopen on 으로 설정되어 있어야 하는 것이다. allow_url_fopen 기능이란 PHP에서 include를 이용하여 어떤 파일을 Include할 때 http, ftp 등 외부의 파일을 URL 방식으로 include 할 수 있도록 허용해 주는 기능이다.


참고 사이트 : http://kr.php.net/manual/kr/function.eregi.php
참고 문서 : 홈페이지 개발 보안 가이드 KISA

XSS(Cross Site Scripting) 대처방법

이번에는 XSS공격에 대하여 몇자 적어 봅니다.

Cross Site Scripting 웹사이트에 접속한 사용자가 공격의 대상이 되는 기법으로, 사용자의 입력 값에 악의적인 Javascript code 삽입하여 페이지를 로드 함으로 현재 페이지를 열람하는 사용자에게 스크립트를 실행시키도록 하는 것입니다. 그러므로 사용자의 입력을 받는 모든 사이트에서 XSS공격이 일어날 가능성이 있습니다. 특히 다음과 같은 상황에서 자주 발생합니다.

1.     검색할 단어를 입력하는 Input 영역에서 검색단어를 입력한 , 검색 결과와 함께 입력한 검색 키워드를 다시 보여주는 경우
2.     사용자 입력 폼에 입력한 내용들을 다시 출력하는 경우
3.    게시판에서 내용들을 열람하는 경우


공격자는 XSS 통해서 사용자의 쿠키를 변경하거나 탈취할 있으며 정상적인 사용자에 대해서 잘못된 정보를 보내줄 수도 있습니다. 이러한 XSS 최근 Phishing기법에 많이 사용되는데 악의적인 사용자가 변조된 입력 폼을 제공함으로 다른 사용자의 정보가 노출되고 있습니다. 또한 자바 스크립트 코드뿐만 아니라 object들을 사용자의 브라우저상에서 실행시킴으로 광고팝업이나 브라우저를 변조할 있습니다.


XSS 공격을 방어하는 가장 좋은 방법은 어플리케이션이 모든 header , cookie, query string, form field, hidden field (예를 들면, 모든 parameter ) 대해 유효성 검사를 실시하는 것입니다. 사용자의 입력이 화면에 출력되어 나오는 경우, 사용자의 입력 값을 HTML Entity 변환시켜야만 합니다. 또한 위의 태그들을 HTML으로 인식시키지 않기 위해 스크립트에서는 함수를 지원합니다. 그리고 공개 게시판의 경우, HTML 형식을 지원하는 경우 XSS 잠재적인 위험성이 존재하므로, 이를 중지할 필요가 있습니다.


기본 대책

(1)  ASP Script

사용자의 입력에 대해 Server.HTMLEncode함수를 사용하여 HTML태그를 비활성화 시킵니다.

Server.HTMLEncode함수를 사용하여 HTML태그를 변환합니다.
<%= Server.HTMLEncode(<script>alert(XSS Test);<script>) %>
위의 결과 tag들이 비활성화 됩니다.

(2) JSP Script

HTML코드의 시작을 알리는 < 대해서 &lt; 으로 변환시키는 방법입니다.

/% less than (<) character &lt; 으로 변환시킵니다. %/
String userInput = request.getParameter(keyword);
user_input = user_input.replaceAll(“’”, \’”);

(3) PHP Script

PHP 내장함수 가운데 입력 문자열에 대해서 HTML코드를 변환시켜주는 htmlentities() 사용하여 XSS 막습니다.

<?
$str = "A 'quote' is <b>bold</b>";
echo htmlentities($str);
// 출력: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
?>


이것또한 간단 하게 기본적인 부분만 처리 해주어도 상당부분 방어가 가능합니다.
조금 귀찮더라도 이정도 처리는 해주어야 하지 않을까 합니다.