원본링크
이것은 지금까지 나를 겁나게 한 첫 번째 공격 방법입니다. 범위가 넓고 방어가 어렵고 공격 효과가 즉각적입니다. 많은 수의 웹사이트와 웹 인터페이스가 해시 충돌 공격으로부터 보호되지 않습니다.
RESTful 스타일 인터페이스의 인기로 인해 프로그래머는 기본적으로 json을 데이터 전송 방법으로 사용하게 됩니다. json 형식은 데이터 중복성이 적고 호환성이 높습니다. 제안된 이후 널리 사용되었으며 웹에서 표준이 되었다고 할 수 있습니다. 서버 측에서 어떤 언어를 사용하든 json 형식의 데이터를 얻은 후에는 json 문자열을 json 객체로 변환하기 위해 jsonDecode()를 수행해야 하며 객체는 기본적으로 해시 테이블에 저장됩니다. 해시 테이블은 충돌 공격에 쉽게 취약합니다. 공격 데이터를 json에 넣어두면 jsonDecode()를 하면 서버 프로그램이 감염되고 CPU는 즉시 100%로 치솟게 됩니다. 16코어 CPU의 경우 16개의 요청으로 DoS의 목적을 달성할 수 있습니다.
모든 테스트 프로그램은 테스트의 편의를 위해 65536개의 json 키-값 쌍만 구성했습니다. 실제로 공격을 시작하면 수십만, 심지어 수백만 개의 데이터가 구성될 수 있습니다.
//只需要一行代码就能看到效果var jsonSrc = '这里输入json数据';
크롬에 기본으로 제공되는 작업 관리자를 보면 CPU가 즉시 100%까지 올라가고, 실행 완료까지 거의 1분 정도 소요되는 것을 볼 수 있는데, 일반 데이터는 1번에서 실행이 가능합니다.
$json = file_get_contents("https://raw.githubusercontent.com/laynefyc/php_thread_demo/master/hashNomal.json"); $startTime = microtime(true); $arr = json_decode($json,true); $endTime = microtime(true); echo "Nomal:".($endTime - $startTime)."\r\n"; $json = file_get_contents("https://raw.githubusercontent.com/laynefyc/php_thread_demo/master/hash.json"); $startTime = microtime(true); $arr = json_decode($json,true); $endTime = microtime(true); echo "Attack:".($endTime - $startTime)."\r\n";
PHP에서는 file_get_contents를 사용하여 원격으로 데이터를 가져오고 실행 시간을 비교하면 php-fpm의 단일 프로세스가 100% 이상 걸립니다. CPU.
public String index(){String jsonStr = "";try { FileReader fr = new FileReader("t.log");//需要读取的文件路径BufferedReader br = new BufferedReader(fr); jsonStr = br.readLine(); br.close(); fr.close(); //关闭文件流 }catch(IOException e) { System.out.println("指定文件不存在");//处理异常 } Map<String, Object> map = new HashMap<String, Object>();map = JSONObject.fromObject(jsonStr);return "Hash Collision ~"; }
Java에서는 파일을 읽어서 테스트를 합니다. Java의 Hash 알고리즘은 PHP 및 JavaScript와 약간 다르지만 60,000줄의 간단한 데이터도 구성합니다. Spring 부트 프레임워크에서는 브라우저가 액세스를 시작하고 CPU가 가득 찬 26초 후에 결과가 반환됩니다.
HashTable은 매우 일반적인 데이터 구조와 이에 대해 이야기하는 알고리즘에 대한 특별한 클래스가 있으므로 Hash Collision이 널리 사용됩니다. 각 언어는 해싱 알고리즘과 Table Storage에 미묘한 차이가 있습니다.
공격 방법
몇 년 전만 해도 PHP 버전은 여전히 5.2였습니다. 다음과 같이 POST 요청 본문에 모든 해시 키를 넣을 수 있었습니다.
서버가 데이터를 얻은 후 모든 매개변수를 해시 테이블($_POST)에 저장합니다. 이러한 방식으로 공격을 쉽게 구현할 수 있습니다. 그러나 이제 이 방법은 작동하지 않습니다. 왜냐하면 Nginx 계층과 PHP 계층에서 HTTP 요청 매개변수의 수와 크기를 쉽게 제한할 수 있기 때문입니다. PHP는 기본적으로 1000개의 매개변수만 허용하며 이는 서버에 전혀 영향을 미치지 않습니다.
지금은 2017년이고 json 형식과 RESTful 스타일 인터페이스가 큰 인기를 끌었습니다. 편리한 코딩을 제공하는 동시에 Hash Collision Dos에 대한 새로운 방법도 제공합니다. 이제 많은 RESTful 스타일 인터페이스는 다음과 같습니다.
방어 방법
Hash Collision Dos 공격을 방어하기 위해 업계에는 이미 성숙한 솔루션이 많이 있지만 모두 언어를 변경하거나 HashTable을 다시 작성하는 것을 권장합니다. 여기서는 현재 json 형식 구문 분석 문제에 대해서만 설명합니다. 먼저 jsonDecode() 이전에 불법 사용자를 최대한 거부하기 위한 권한 확인을 추가해야 합니다. 둘째, jsonDecode() 이전에 데이터 크기 및 매개변수 화이트리스트 확인을 수행합니다. 오래된 프로젝트의 변환 및 유지 관리 비용이 높으면 jsonDecode() 메서드를 직접 다시 작성하는 것이 좋습니다
위 내용은 고급 DoS 공격-해시 충돌 공격의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!