** Request Line(요청 라인)의 Method 종류 **
GET - 지정된 URL 정보를 요청한다.(이때 전달해야 하는 파라메터를 URL에 포함시켜서 전달한다.)
POST - 지정된 URL 정보를 요청한다. (이때 전달해야 하는 파라메터를 메시지 본문(Request Message Body)을 통해서 전달한다.)
HEAD - HTTP Header 정보만 요청한다.
TRACE - 클라이언트의 요청을 그대로 응답한다. (Request의 Loop Back 테스트)
DELETE - 요청하는 URL의 자원을 삭제한다.
OPTIONS - 응답 가능한(서버에서 지원하는) HTTP 메소드를 요청
PUT - 요청하는 URL의 자원을 생성한다. 예를 들면 파일 업로드가 가능하다.
CONNECT - 터널링의 목적으로 연결 요청
** HTTP 버전별 지원 Method **
HTTP/0.9 - GET
HTTP/1.0 - GET, POST, HEAD
HTTP/1.1 - GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE, CONNECT
** GET 과 POST를 제외한 대부분의 메서드는 사용하지 않는것이 권장사항이다. 불필요한 메서드를 허용하므로 해서 웹서버는 공격에 취약할 수 있다. 그러므로 불필요한 메서드는 제거한다.
XST(Cross-Site Tracing)」는 Trace메소드를 사용한 공격 방법이다.
다운로드: http://www.cgisecurity.com/lib/WH-WhitePaper_XST_ebook.pdf
이것은 공격자가 클라이언트에 TRACE메소드를 발행하도록 하여, 그 레스폰스를 취득하는 것으로 Basic인증의 패스워드를 착취하는데 사용되는 공격이다.이런 이유로 Trace메소드를 무효로 할 것을 권장하고 있는 것이다.또한, 취약성 스캐너로 Trace메소드가 유효로 되어 있는 웹서버를 스캔하면 대부분 리스크로 보고하므로, 대책을 취하는 것이 좋다.
그럼 실제로 httpd.conf를 변경해 보자. 실제로는 매우 간단하다.
httpd.conf의 적당한 부분에 다음을 기술하고 Apache를 재기동한다.
TraceEnable Off
「TraceEnable Off」를 기술하기 전과 후의 Apache 반응을 「OPTIONS」메소드를 사용하여 비교해 보자.
적용 전
telnet 192.168.0.201 80
OPTIONS / HTTP/1.0
HTTP/1.1 200 OK
Date: Sun, 12 Mar 2006 17:27:26 GMT
Server: Apache/1.3.34 (Unix)
Content-Length: 0
Allow: GET, HEAD, OPTIONS, TRACE
Connection: close
적용 후
telnet 192.168.0.201 80
OPTIONS / HTTP/1.0
HTTP/1.1 200 OK
Date: Sun, 12 Mar 2006 17:28:28 GMT
Server: Apache/1.3.34 (Unix)
Content-Length: 0
Allow: GET, HEAD, OPTIONS
Connection: close
■ IIS(Intenet Information Service)의 경우
IIS Lockdown툴에 포함되어 있는 URLScan을 사용한다.
1. IIS Lockdown Tool을 설치한다.
2. IIS Lockdown Tool에 포함되어 있는 URLScan을 설치한다.
3. urlscan.ini에 다음의 내용을 추가한다.
◇ UseAllowVerbs=1을 지정한 경우
[options]
UseAllowVerbs=1
[AllowVerbs]
GET
HEAD
POST
◇ UseAllowVerbs=0을 지정한 경우
[options]
UseAllowVerbs=0
[DenyVerbs]
TRACE
TRACK
[2] IIS Lockdown Wizard 툴
http://www.microsoft.com/korea/technet/security/tools/locktool.asp
[3] URLScan 보안 툴
http://www.microsoft.com/korea/technet/security/URLScan.asp
[4] KB326444 - URLScan 툴의 구성 방법
http://support.microsoft.com/kb/326444/ko
Apache PHP 에서 PUT 허용
httpd.conf 파일에 다음 라인 추가
<Directory /var/www/test>
<Limit GET POST PUT DELETE HEAD OPTIONS>
Order allow,deny
#You might want something a little more secure here, this is a dev setup
Allow from all
</Limit>
<LimitExcept GET POST PUT DELETE HEAD OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
Script PUT /var/www/test/put.php
Script DELETE /var/www/test/put.php
</Directory>
마지막으로 .htaccess 에 추가
RewriteEngine On
RewriteBase /test
RewriteRule ^/?(api)/? put.php [NC]
RewriteCond %{REQUEST_METHOD} (PUT|DELETE)
RewriteRule .* put.php
Tomcat 에서 PUT 이나 DELETE 허용
출처: http://www.codereye.com/2010/12/configure-tomcat-to-accept-http-put.html
Tomcat은 디폴트로 PUT 메서드가 허용되지 않는다.
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
tomcat-users.xml 파일에서 PUT 메서드를 허용할 사용자를 등록한다.
<?xml version='1.0' encoding='cp1252'?>
<tomcat-users>
<user name="admin" password="admin" roles="admin" />
</tomcat-users>
web.xml 파일에서 PUT 메서드를 허용하고자 하는 웹 애플리케이션에 대해 security constraint을 설정한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<security-constraint>
<web-resource-collection>
<web-resource-name>Demo App</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Demo App</realm-name>
</login-config>
<security-role>
<description>Role for restricted resources</description>
<role-name>admin</role-name>
</security-role>
</web-app>