요즘 DDOS 공격이나 DOS 공격이 많이 줄어들었다.
하지만 공격이 줄어들었다고 하여 공격에 대해 잊어버리지 않아야 하며
공격에 대한 이해와 인지는 하고 있어야 한다는
취지에 HASH DOS 에 관하여 조사해보았다.
개요
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 |
대응방안
PHP 5.4.0 RC 버전 및 취약점 패치 후 나올 PHP 5.3.9
Max_input_vars 설정으로 파라미터의 수를 제한
PHP 보안 모듈(suhosin) 사용 PHP 보안 모듈(suhosin)사용하여 다음과 같은 설정만으로도 문제가 해결된다.
suhosin.post.max_value_length = 1000000
최대 파라미터 개수를 500개로 제한 (default는 1000) |
패치 버전이 아닌 기존 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 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
nginx (default : 1MB)
Tomcat |
위와 같은 방법을 적용하여, 대응할 수 있지만 가장 좋은 방법은 취약점이 패치가 된 버전으로 업데이트 하는것이 좋다.
[polldaddy rating=”7739789″]