您的位置:首页 > 理论基础 > 计算机网络

https的弱点

2010-11-23 11:17 246 查看
加了密就一定安全么?我们经常会访问一些看起来很“安全”的网站,因为这些网站都是以https开头的,学过一点网络安全的人都知道这代表着传输信息的加密处理。但是如果有人告诉你他知道了你的加密信息(如用户名、密码等),你也不要惊讶。当你还在疑惑黑客是怎么通过高超的手段破解RSA算法将用户名和密码展现在你面前的时候,除了惊讶也许你还应该注意另一个小小的细节。
我来举一个例子,假设你有一个保险柜,这个保险柜四周有半米厚,它只有通过你输入的电子密码才能开启,并且你设置了一个30位的连你都差点没记住的密码。黑客如何开启它,这也就是你疑惑上述问题的原因。其实黑客可以不用死磕这个保险柜,就像是使劲破你的密码一样,而是让你自己上当,他可以做一个和你的一模一样的保险柜来等你上钩。啊?这时你想起了钓鱼网站,但你只要稍微留神就可以看出钓鱼网站地址栏上的猫腻,并完全可以通过其他安全链接避免这一惨剧。那么要是连URL都一样呢?!这就是中间人的威力。下面我们就做一个实验吧。在做这个之前我们还是要从基础补补课。
安全套接层SSL协议是因特网中应用最为广泛的安全传输协议,我们的很多网站都会用到这个协议来保证用户传输信息的安全性。因为协议采用公开密钥技术,能使客户端与服务器之间的通信不被攻击者窃听,保证了通讯的两个应用程序间数据的可靠性和完整性。但是由于协议设计的不完善和实际应用的不规范,导致SSL存在许多不安全因素,使得攻击者有可乘之机。首先,SSL都是用HASH函数来进行签名,一旦找到两个文件可以产生相同的压缩值,就可以伪造签名,给网络安全领域带来巨大隐患。例如王小云教授成功破解MD5,证明了它在通信安全领域的不安全性。还有一个更加致命的弱点就是,当检测出证书与网站域名不符时,没有强制的断开连接,对于缺乏安全常识的上网用户仍处于易受攻击的危险网络。 那么,我今天就用改造过的Apache来实现对https传输内容的访问。
在进行测试之前我想介绍一下我获取https传输内容的思路,首先通过病毒、人工修改等手段修改windows系统中的Hosts文件,对特定网站/IP地址进行重定向,这样就可以将某网站的请求转发到我的Apache上,因为客户端会以为这个Apache就是需要访问的网站,在IE地址栏中也的确输入了类似https://...之类的网址,但是噩梦就从这开始。我可以对安装了mod_ssl的Apache进行日志输出,并通过openssl解密到用户名、密码等敏感信息,这时在IE端的地址栏会出现非常红的警告(很多人不会在意它,或通过小云老师的方法造一个假证书也可),然后Apache端再使用一个加密软件照常发送给正常服务器。我们的Apache就是一个中间人,用户根本无法察觉到自己的信息被别人窃听。
现在让我们谈谈技术吧,首先是Apache,Apache作为世界使用排名第一的Web服务器软件,可以运行在几乎所有广泛使用的计算机平台上。它通过灵活的模块配置使各个拓展功能与Apache核心实现松耦合关系,其中就包括代理服务器模块(mod_proxy)和安全Socket层的SSL模块(mod_ssl)。为了截获Apache代理过程中的敏感数据,就应该将这些数据包从Apache的数据结构中提取出来并显示在后台。过滤器是Apache2.0开始引入的新概念,它使我们能够更加灵活地控制输入输出的内容。在Apache中生成或从网络中获得的数据很少会一成不变地写入网络或读入Apache核心,当数据从网络到核心或从核心到网络的过程中,如果数据需要修改,那么可以通过过滤器来实现。
Apache中的过滤器可分为两大类,输出过滤器和输入过滤器。输出过滤器是将核心生成的内容封装并输出到网络中。而输入过滤器通常用于对输入的请求进行更改。包括对使用Openssl加密过的输入数据流就要使用SSL过滤器对数据内容进行解密,这也正是Apache作为中间人需要利用的功能。只需将Ssl_in过滤器处理过的解密数据的存储结构以某种形式输出到文本文件中,并对文本中的内容进行裁剪与分析就能得到中间人想要的敏感数据,如加过密的密码等。这就需要修改Apache中的Core_filters.c文件,在整行读取模式下(AP_MODE_GETLINE)修改代码如下:
/*-------------------------------中间人攻击-------------------------------------*/
apr_off_t readbytes111 = 0;
char str;
while (!APR_BRIGADE_EMPTY(ctx->b)) {
const char *pos;
apr_bucket *e; //该数据结构为存储段,用于Aapache内部传递参数
e = APR_BRIGADE_FIRST(ctx->b);
rv = apr_bucket_read(e, &str, &len, block); //将存储结构内容输出到字符串
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,str, "MITM");
if (rv != APR_SUCCESS) {
break;
}
/*-------------------------------中间人攻击-----------------------------*/

将上述代码进行编译、安装。其功能是将所有处理过的输入流在不影响正常数据流向的情况下以日志的形式输出到文件。这样,通过日志文件就可以获取经SSL解密过的双方通信的内容。接下来就可以用自己手上比较欣赏的加密软件(当然也可以自己写)在将请求转发到正常服务器就可以了。通过一个自己配置的opensslweb项目进行了测试,我做到了。
这里需要说明的是,因为Apache和加密软件的参数都是通过ip地址来配置的,所以对隐藏了ip或经过特定过滤处理的服务器是无法转发的。对于更加严密的银行系统,它采用的是U盾等本地证书来验证用户身份,我认为这种做法还是是非常安全的。
接下来总结以下防范策略:
对于用户来说
1、从个人主机安全防护的角度,防范恶意插件、病毒,安装实时监控的杀毒软件保护系统,防止中间人程序对计算机系统文件进行篡改。
2、对于代理服务器,如无必要尽量不要使用。如果一定要用也要确定此服务器绝对可信,否则尽量不要再使用代理服务器时进行保密操作。
3、对于服务器证书的认证,用户除了要仔细查看证书是否有可疑外,如果之前与服务器通信时安装过证书或未要求验证证书,之后再通信仍要求验证证书,那么此证书很有可能是假的或者你之前安装的证书可能是假的,用户可以用其他可信方式向服务器求证是否更换了证书。
对于开发者来说
隐藏好ip并对应用设置子目录,采用第三方技术保证应用安全。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: