티스토리 뷰

Security

HASH DOS

초보의 CHOMAN 2015. 5. 7. 11:47

개요

 


WEB 서버가 GET, POST 요청 받을시 파라미터를 관리하기 위한 Hash Table 사용

 

파라미터가 많은 POST 요청시 Hash Table 충돌 발생 → CPU 부하 발생

 

타겟은 Hash Table을 사용하는 모든 웹서버

 

공격 소스는 POST 요청이며 특정 Hash Key 값 전달

 

content-type: application/x-www-form-urlencoded 에 전달


 

 

예시

 


[Application/x-www-form-urlencoded 형식]

Key=Value&Key1=Valu1

 

content=1&content=2

 

POST 메소드를 통해  Hash table에 존재하는 값과 비교하게 되는 특정값을 다량 보내며

웹서버는 Hash Table과 비교하는 순간 충돌이 발생하고 서비스가 제대로 되지 않는다고 함


 

 


[그림1]  HASHDOS 패킷헤더



 



[그림2] HASHDOS

 


 


Hash Table 을 왜 사용하냐?

 


POST, GET 요청에서 전송되는 파라미터 값을 접근을 쉽게 빠르게 하기 위해 Hash table 구조로 관리

파라미터에 있어서 GET 요청시 길이 제한이 있어 문제가 되지 않음

POST 요청시는 전달할수 있는 파라미터수의 제한이 없음 (수백, 수천개의 파라미터 전달 가능)



 

취약대상들

 

Java : All version
JRuby : 1.65 이하
PHP : 5.38 / 5.4.0 이하
Rython : All version
Ruby : 1.87-p356이하 버젼
Apache Geronimo : All version
Apache Tomcat : 5.5.34 / 6.034 / 7.022 및 이하 버젼
Oracle Glassfish : 3.1.1. 및 이하
jetty : All version
Plone : All version
Rack : 1.1.2 / 1.24 / 1.3.5 및 이하
V8 Java Script Engine : All version

 

 

대응방안

 

PHP 5.4.0 RC 버전 및 취약점 패치 후 나올 PHP 5.3.9

 


Max_input_vars 설정으로 파라미터의 수를 제한

 

PHP 보안 모듈(suhosin) 사용

PHP 보안 모듈(suhosin)사용하여 다음과 같은 설정만으로도 문제가 해결된다.

 

suhosin.post.max_value_length = 1000000
suhosin.post.max_vars = 500
suhosin.request.max_vars = 500

 

최대 파라미터 개수를 500개로 제한 (default는 1000)
최대 파라미터 개수를 제한하면, 그 이상의 파라미터 개수가  들어 올 시 PHP 보안 모듈(suhosin)에서 차단


 


패치 버전이 아닌 기존 PHP 버전

 


php.ini 설정 값 max_input_time 와 post_max_size를 변경하여, 공격을 완화 가능

max_input_time은 요청 데이터를 파싱하는데 걸리는 최대 시간을 나타내며,  post_max_size는 POST의 크기를 나타낸다.

 max_input_time으로 파싱 시간 제한, post_max_size으로 POST 사이즈를 제한 함으 로써 파라미터수를 어느 정도 제한하는 효과


다음은 php.ini default값이다.

max_input_time = 60     
post_max_size = 8M


max_input_time 와 post_max_size를 변경하기 위해서는, 기존에 쌓여 있는 웹 로그를 분석하여,

스크립트의 실행 시간이 얼마나 걸리는지 POST 요청의 사이즈가 얼마나 되는지 분석해야 한다.

무턱대고 변경하였다가는, 공격이 아닌 정상적인 서비스인데도 제한이 걸려 서비스가 이루어 지지 않을 수 있기 때문이다.

단, 파일이 업로드 되는 서비스는 POST사이즈가 크므로 post_max_size는 적용하기 어렵기 때문에, max_input_time만 설정하는 것


 

 

 IIS for ASP.NET

 


shutdown time limit for processes 값을 줄임


 

 

Apache와 Nginx

 


POST사이즈 제한을 php설정 외에 웹 서버 자체 설정도 적용하고 싶다면 다음과 같이 설정 값을 변경 해 준다.

주의 할 점은 기존 웹 로그를 분석해서 적절 POST사이즈를 파악해서 적용해야 한다.

 

apache
LimitRequestBody 값 변경 

 

nginx (default : 1MB) 
client_max_body_size 값 변경

 

Tomcat
maxParametercont 값을 넣어 주면 된다. (6.0.35 이상 / 7.0.23 이상부터 지원)


 

 

위와 같은 방법을 적용하여, 대응할 수 있지만 가장 좋은 방법은 취약점이 패치가 된 버전으로 업데이트 하는것이 좋다.

 

  

[자료출처]


 

http://blog.naver.com/differentt?Redirect=Log&logNo=130128791625

http://darkangelo.blog.me/90133402197



댓글
댓글쓰기 폼