1. 背景与取证价值

在 Windows 应急响应和主机取证中,浏览器历史记录是一个很有价值的数据源。它通常可以帮助回答这些问题:

  1. 用户近期访问过哪些可疑域名、URL 或 Web 服务。

  2. 是否访问过钓鱼页面、WebShell 管理页面、内网后台、远程控制面板或临时文件分享页面。

  3. 可疑文件是否来自浏览器下载。

  4. 下载文件保存到了哪里,下载来源 URL 和来源页面是什么。

  5. 某个访问行为发生在什么时间。

  6. 浏览器访问时间能否和进程、文件、事件日志、Prefetch、网络连接等证据互相印证。

浏览器记录本身不等于恶意结论,但它很适合用来还原用户行为和攻击链。例如:

  • 下载记录中的保存路径,可以对应文件系统中的可疑文件。

  • 文件创建时间,可以和下载记录时间互相验证。

  • 访问 URL,可以和 DNS、代理、EDR、网关日志互相验证。

  • 浏览器进程运行时间,可以和 Prefetch 或进程记录互相验证。

  • 可疑文件运行时间,可以继续关联自启动项、服务、计划任务等持久化痕迹。

所以,浏览器历史记录更适合作为证据链中的一环,而不是单独作为处置结论。

2. Chromium 系浏览器

Edge、Chrome、QQ 浏览器、夸克、搜狗、360、2345 等大量浏览器都基于 Chromium 或使用类似的数据目录结构。

Chromium 系浏览器的历史记录通常保存在 SQLite 数据库中,文件名一般为:

History

常见 Profile 名称包括:

Default
Profile 1
Profile 2

2.1 常见数据库路径

以下路径为本次整理过程中确认过的 Windows 路径。不同版本或定制安装环境可能会变化,但整体目录规律基本一致。

浏览器

常见 History 路径

是否验证

Edge

%USERPROFILE%\AppData\Local\Microsoft\Edge\User Data\<Profile>\History

已验证

Chrome

%USERPROFILE%\AppData\Local\Google\Chrome\User Data\<Profile>\History

已验证

SogouExplorer

%USERPROFILE%\AppData\Local\Sogou\SogouExplorer\User Data\<Profile>\History

已验证

Quark

%USERPROFILE%\AppData\Local\Quark\User Data\<Profile>\History

已验证

QQBrowser

%USERPROFILE%\AppData\Local\Tencent\QQBrowser\User Data\<Profile>\History

已验证

360se6

%USERPROFILE%\AppData\Roaming\360se6\User Data\<Profile>\History

已验证,存在加密

2345Explorer

%USERPROFILE%\AppData\Local\2345Explorer\User Data\<Profile>\History

已验证

路径中的 <Profile> 需要按实际目录替换,例如:

Default
Profile 1
Profile 2

2.2 访问记录表结构

Chromium 访问记录主要涉及两张表:

  • urls

  • visits

核心关联关系:

visits.url = urls.id

常用字段:

字段

含义

urls

id

URL 记录 ID

urls

url

访问 URL

urls

title

页面标题

urls

visit_count

访问次数

urls

last_visit_time

最后访问时间

visits

visit_time

单次访问时间

visits

transition

访问来源类型

典型查询思路:

SELECT
    visits.visit_time,
    urls.title,
    urls.url,
    urls.visit_count,
    urls.last_visit_time
FROM visits
JOIN urls ON urls.id = visits.url
WHERE urls.url LIKE ?
ORDER BY visits.visit_time DESC
LIMIT ?;

这里需要区分:

  • urls.last_visit_time:该 URL 的最后访问时间。

  • visits.visit_time:某一次具体访问的时间。

如果目标是还原时间线,应该优先使用 visits.visit_time

2.3 下载记录表结构

Chromium 下载记录通常涉及:

  • downloads

  • downloads_url_chains

常用字段:

字段

含义

downloads

start_time

下载开始时间

downloads

target_path

目标保存路径

downloads

current_path

当前保存路径

downloads

total_bytes

文件总大小

downloads

received_bytes

已接收大小

downloads

state

下载状态

downloads

tab_url

下载来源页面

downloads_url_chains

url

下载 URL

downloads_url_chains

chain_index

URL 跳转链序号

不同 Chromium 版本的 downloads 表字段可能存在差异。比如有的版本存在 target_path,有的版本主要依赖 current_path;来源页面字段也可能随版本变化。

典型查询思路:

SELECT
    downloads.start_time,
    final_url.url AS download_url,
    downloads.target_path,
    downloads.current_path,
    downloads.tab_url,
    downloads.total_bytes,
    downloads.received_bytes,
    downloads.state
FROM downloads
LEFT JOIN (
    SELECT
        c.id,
        c.url
    FROM downloads_url_chains c
    WHERE c.chain_index = (
        SELECT MAX(c2.chain_index)
        FROM downloads_url_chains c2
        WHERE c2.id = c.id
    )
) final_url ON final_url.id = downloads.id
WHERE
    final_url.url LIKE ?
    OR downloads.target_path LIKE ?
    OR downloads.current_path LIKE ?
ORDER BY downloads.start_time DESC
LIMIT ?;

分析时建议:

  1. 保存路径优先看 target_path

  2. 没有 target_path 时看 current_path

  3. 下载 URL 从 downloads_url_chains 中按 chain_index 取最终 URL。

  4. 来源页面优先看 tab_url,如果没有再看其他 referrer 类字段。

2.4 Chromium 时间戳

Chromium 使用的是 WebKit / Chrome 时间:

从 1601-01-01 00:00:00 UTC 开始的微秒数

转换为 Unix 微秒时,需要减去固定偏移:

unix_microseconds = chromium_microseconds - 11644473600000000

再按本地时区格式化为可读时间。

2.5 Chromium 提取注意点

Chromium 系浏览器提取分析时需要注意:

  • 同一台机器可能有多个用户目录。

  • 同一浏览器可能有多个 Profile。

  • 国产浏览器路径可能和 Chrome / Edge 不完全一致。

  • History 数据库可能被浏览器进程占用。

  • 最新记录可能还在 WAL 文件中,单独复制 History 可能不完整。

  • 下载记录字段在不同版本间可能存在差异,需要动态判断表结构。

3. Firefox 浏览器

Firefox 不使用 Chromium 的 History 数据库,而是使用:

places.sqlite

这个数据库保存浏览历史、书签、访问次数等信息。

3.1 常见数据库路径

Firefox Profile 名称通常不是固定格式,例如:

i4qenfgl.default-release
abcd1234.default

因此检测 Firefox 记录时,不适合只匹配 DefaultProfile *,而应该枚举 Profiles 目录下所有包含 places.sqlite 的目录。

浏览器

常见数据库路径

是否验证

Firefox

%APPDATA%\Mozilla\Firefox\Profiles\<Profile>\places.sqlite

已验证

3.2 访问记录表结构

Firefox 访问记录主要涉及:

  • moz_places

  • moz_historyvisits

核心关联关系:

moz_historyvisits.place_id = moz_places.id

常用字段:

字段

含义

moz_places

id

URL 记录 ID

moz_places

url

访问 URL

moz_places

title

页面标题

moz_places

visit_count

访问次数

moz_places

last_visit_date

最后访问时间

moz_historyvisits

visit_date

单次访问时间

典型查询思路:

SELECT
    moz_historyvisits.visit_date,
    moz_places.title,
    moz_places.url,
    moz_places.visit_count,
    moz_places.last_visit_date
FROM moz_historyvisits
JOIN moz_places ON moz_places.id = moz_historyvisits.place_id
WHERE moz_places.url LIKE ?
ORDER BY moz_historyvisits.visit_date DESC
LIMIT ?;

Firefox 的访问记录结构相对清晰,主要注意时间戳格式与 Chromium 不同。

3.3 下载记录表结构

Firefox 下载记录比访问记录复杂,不同版本之间也存在变化。

较常见的一种方式是通过注解表保存下载信息:

  • moz_annos

  • moz_anno_attributes

  • moz_places

常见注解名称:

downloads/destinationFileURI
downloads/metaData

其中:

  • downloads/destinationFileURI 可能保存下载后的本地文件 URI。

  • downloads/metaData 可能保存 JSON 格式的下载元数据。

  • 下载 URL 可以从关联的 moz_places.url 获取。

典型查询思路:

SELECT
    COALESCE(dest.dateAdded, meta.dateAdded, moz_places.last_visit_date) AS download_time,
    moz_places.url AS download_url,
    dest.content AS destination_uri,
    meta.content AS metadata,
    moz_places.title
FROM moz_places
JOIN moz_annos dest
    ON dest.place_id = moz_places.id
    AND dest.anno_attribute_id = (
        SELECT id
        FROM moz_anno_attributes
        WHERE name = 'downloads/destinationFileURI'
        LIMIT 1
    )
LEFT JOIN moz_annos meta
    ON meta.place_id = moz_places.id
    AND meta.anno_attribute_id = (
        SELECT id
        FROM moz_anno_attributes
        WHERE name = 'downloads/metaData'
        LIMIT 1
    )
WHERE moz_places.url LIKE ?
ORDER BY download_time DESC
LIMIT ?;

示例:

file:///C:/Users/test/Downloads/example.zip

需要转换为本地路径:

C:\Users\test\Downloads\example.zip

Firefox 下载记录不如 Chromium 下载记录稳定。如果目标版本缺少相关注解表或字段,不能简单认为没有下载行为,只能说明当前方式没有提取到。

3.4 Firefox 时间戳

Firefox 常见历史记录字段使用的是 Unix 微秒:

从 1970-01-01 00:00:00 UTC 开始的微秒数

例如:

  • moz_historyvisits.visit_date

  • moz_places.last_visit_date

和 Chromium 混合分析时,建议统一转换为同一种内部时间格式,再做排序和时间线关联。

3.5 Firefox 提取注意点

Firefox 提取分析时需要注意:

  • Profile 目录名称不固定。

  • 访问记录和下载记录的稳定性不同,访问记录更容易提取。

  • 下载记录可能和版本、配置、隐私设置有关。

  • places.sqlite 也可能被浏览器占用。


参考链接: