钓鱼网站是一种伪装成合法网站,旨在窃取用户敏感信息的恶意网站。传统的防御措施包括URL过滤、黑名单和特征码检测。然而,随着钓鱼技术的不断发展,这些方法变得不够有效。Bradley J Kemp在其文章《6 Ways to Detect Phishing Sites Using High Entropy Strings》中提出了一种新颖的方法,通过检测网页中的高熵字符串来识别钓鱼网站。本文将详细探讨如何根据页面HTML代码筛选出与之相似的钓鱼网站,并提供一种实用的方法来实现这一目标。
一、高熵字符串的概念
熵是信息理论中的一个概念,用于衡量字符串中的信息量。高熵字符串通常包含大量随机字符,例如密码、加密数据、哈希值等。钓鱼网站为了隐藏其恶意代码,往往会在其HTML代码中嵌入高熵字符串,这些字符串看起来像是随机生成的,从而使其难以被传统的字符串匹配检测方法识别。
二、HTML代码中高熵字符串的检测方法
数据收集和预处理:
从目标网页提取HTML代码。
去除HTML代码中的注释、空白字符和格式化标记,只保留纯文本内容。
字符串分割:
将纯文本内容按照一定的长度分割成多个子字符串。常用的分割长度为4到10个字符。
计算熵值:
阈值设定:
根据经验设定一个熵值阈值。熵值超过该阈值的字符串可以认为是高熵字符串。
高熵字符串检测:
对HTML代码中的每个子字符串进行熵值计算,筛选出所有高于阈值的高熵字符串。
三、从Fofa和Hunter中收集数据
Fofa和Hunter是两个强大的互联网资产搜索引擎,能够帮助找到潜在的钓鱼网站。以下是如何使用它们来找到相似的钓鱼网站的实例。
使用Fofa
Fofa是一个网络空间搜索引擎,可以通过特定的搜索语法查找特定的互联网资产。假设要寻找包含高熵字符串的钓鱼网站,可以使用以下步骤:
搜索语法:
使用关键词或特定的技术特征进行搜索。例如:
title="login" && body="random"
数据提取:
提取搜索结果中的URL,并获取其HTML代码。
使用Hunter
Hunter是另一种网络空间搜索引擎,功能类似于Fofa。以下是使用Hunter的步骤:
搜索语法:
使用类似的关键词或特征进行搜索。例如:
"high entropy string" site:example.com
数据提取:
提取搜索结果中的URL,并获取其HTML代码。
四、筛选相似钓鱼网站的实用方法
特征提取:
从已知钓鱼网站的HTML代码中提取高熵字符串,构建一个特征库。
特征匹配:
对新检测的网站进行高熵字符串检测,并将其与特征库进行匹配。
计算匹配度。若匹配度超过设定阈值,则认为该网站为钓鱼网站。
实现步骤:
import math from collections import Counter def calculate_entropy(string): # 计算字符串的熵值 prob = [string.count(c) / len(string) for c in set(string)] entropy = -sum(p * math.log2(p) for p in prob) return entropy def extract_high_entropy_strings(html_content, threshold=3.5, window_size=8): # 提取高熵字符串 high_entropy_strings = [] for i in range(len(html_content) - window_size + 1): substring = html_content[i:i + window_size] if calculate_entropy(substring) > threshold: high_entropy_strings.append(substring) return high_entropy_strings def match_phishing_sites(html_content, known_phishing_features, threshold=0.5): # 匹配钓鱼网站 high_entropy_strings = extract_high_entropy_strings(html_content) matches = [s for s in high_entropy_strings if s in known_phishing_features] match_ratio = len(matches) / len(high_entropy_strings) return match_ratio > threshold # 示例使用 html_content = "<html> ... </html>" # 从目标网站获取的HTML内容 known_phishing_features = ["feature1", "feature2", "feature3"] # 已知钓鱼网站的高熵字符串特征库 is_phishing = match_phishing_sites(html_content, known_phishing_features) if is_phishing: print("该网站可能是钓鱼网站") else: print("该网站可能是安全的")
五、实战案例
为了验证上述方法的有效性,从Fofa和Hunter中找到了几个疑似钓鱼网站,并对其进行了高熵字符串检测。
案例1:网站A
从Fofa搜索到的网站A,其HTML代码包含以下高熵字符串:
<script>var token="ajdk38s9d8sdja9sd8";</script>
通过的算法检测,该字符串的熵值为4.1,超过了设定的阈值3.5,初步判断为高熵字符串。进一步匹配特征库,发现该字符串与已知钓鱼网站的特征高度匹配,最终判断该网站为钓鱼网站。
案例2:网站B
从Hunter搜索到的网站B,其HTML代码包含以下高熵字符串:
<input type="hidden" value="kdsj83kds9a3kdkd">
经过检测,该字符串的熵值为3.8,同样超过了阈值。匹配特征库后,发现其与已知钓鱼网站的特征部分匹配。虽然匹配度较低,但仍需进一步分析和监控。
六、分析与讨论
通过上述方法,能够有效地检测钓鱼网站。然而,该方法也存在一些局限性:
高熵字符串的误报率:一些合法网站可能也包含高熵字符串,例如验证码、会话ID等。因此,需要结合其他特征(如域名信誉、SSL证书等)来降低误报率。
计算资源消耗:熵值计算需要较高的计算资源,尤其是对于大型网页。因此,优化算法和提高计算效率是一个重要的研究方向。
动态网页的挑战:许多钓鱼网站采用动态生成内容,导致高熵字符串的分布不稳定。对于这种情况,需要结合动态分析和行为分析来提高检测效果。
七、结论
利用高熵字符串检测钓鱼网站是一种新颖且有效的方法。本文详细介绍了该方法的原理、实现步骤和应用实例。尽管该方法存在一些局限性,但结合其他检测手段,能够显著提高钓鱼网站的检测准确率。未来的研究可以在优化算法、降低误报率和动态网页检测方面进一步探索。