搜索引擎最初是为了索引内容而构建的。然而,攻击者却利用它们来索引你的错误。查询 allintext:login 文件类型:日志 看起来似乎无害。但实际上,这是发现包含身份验证流程、凭据、令牌和内部基础架构数据的暴露日志文件的最简单方法之一。
如果谷歌能看到这些日志,攻击者也能看到。一旦被索引,泄露就不可避免。此外,当凭据出现在可公开访问的文件中时,安全漏洞就已经存在了。
1. 为什么选择 allintext:login 文件类型:日志比看起来更危险
Google dork 是一种使用高级运算符的搜索查询,用于查找搜索引擎索引的敏感或配置错误的内容。它并非利用 Google 的漏洞,而是利用你的信息泄露风险。
此查询结合了两个运算符:
- allintext: 返回的页面正文中所有术语均已出现。
- 文件类型:日志 将结果限制为
.log档
因此:
allintext:login filetype:log
方法: ”请显示包含该词的日志文件 login设立的区域办事处外,我们在美国也开设了办事处,以便我们为当地客户提供更多的支持。“
乍一看,这似乎微不足道。然而,在实践中,它往往会带来以下后果:
- 公开的网络服务器日志
- CI/CD 日志已作为工件上传
- 调试日志意外丢失 committed 到存储库
- 包含明文凭据的应用程序日志
这不是搜索引擎的漏洞。相反,这是…… 数据泄露漏洞 这是配置错误导致的。谷歌只是简单地索引了公开可访问的内容。
2. 攻击者在暴露的日志文件中实际发现了什么
当攻击者运行 allintext:login 文件类型:日志他们并非随意浏览,而是在寻找身份验证痕迹。
2.1 明文凭证
日志中经常包含如下条目:
POST /login username=admin password=SuperSecret123
or
Authorization: Basic YWRtaW46cGFzc3dvcmQ=
甚至是 SMTP 凭据:
smtp_user=mailer
smtp_pass=ProdMailPass!
记录身份验证有效负载是泄露生产环境凭据最快的方法之一。因此,一个暴露的日志文件就可能使整个访问控制模型失效。
2.2 会话令牌和 JWT
即使密码不被记录,令牌通常也会被记录。
例如:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Set-Cookie: session=abc123xyz789;
Generated API token: sk_live_ABC123SECRET
AWS_ACCESS_KEY_ID=AKIA...
DATABASE_URL=postgres://admin:password@internal-db:5432/app
If CI/CD 既然文物是公开的,那么秘密也就公开了。谷歌搜索技巧只是加速了发现过程。
2.4 云和基础设施数据
公开的日志通常会揭示:
- AWS 访问密钥
- Azure 存储连接字符串
- 内部服务网址
- 数据库凭据
- Redis 端点
即使凭证稍后被轮换,攻击者现在仍然拥有:
- 基础设施测绘
- 命名约定
- 针对未来攻击的目标情报
因此,暴露的日志既可用于访问,也可用于侦察。
3. 这些日志最初是如何公开的
日志不会凭空出现在谷歌搜索结果中。它们之所以被收录,是因为它们原本是公开可访问的。
3.1 配置错误的 Web 服务器
常见模式包括:
/logs/无需身份验证即可访问的目录- 已启用目录列表
- Nginx 或 Apache 提供原始数据
.log档
如果日志可以通过 HTTP 访问,则可以对其进行索引。
3.2 CI/CD 伪影暴露
典型错误:
- 已启用公共工件 GitHub动作
- 日志已上传到开放的S3存储桶
- Pipeline 无需身份验证即可访问跟踪信息
A pipeline 将日志存储在公共存储桶中,实际上就等于泄露了其机密信息。
3.3 生产环境中的调试模式
框架默认设置可能存在风险:
APP_DEBUG=true
此外,过多的请求日志记录可能会输出:
- 头
- 令牌
- 完整的请求机构
生产环境中的调试日志记录会将您的应用程序变成凭据导出器。
3.4 Docker 和容器日志
容器化环境引入了新的暴露途径:
- 日志已挂载到共享卷中。
- Sidecar 将日志导出到不安全的端点
- 历史记录 dashboard具有公共访问权限
如果容器日志通过 HTTP 或开放存储公开,则可以对其进行搜索。最终,它们会被建立索引。
4. 真实的攻击流程:从技术分析到突破
典型的攻击链如下所示:
攻击者运行:
allintext:login filetype:log
- 发现暴露
.log文件 - 提取物:
- JWT 令牌
- 基本身份验证标头
- 数据库连接字符串
尝试对以下对象进行身份验证:
- API端点
- 管理面板
- 内部服务
如果身份验证成功,攻击者可以:
- 提升权限
- 横向移动
- 访问 CI/CD
- 破坏供应链
最初只是一个搜索查询,后来变成了:
- 会话劫持
- 内部凭证填充
- Pipeline 收购
- 神器中毒
所有内容均来自公开索引的日志文件。
5. 为什么“过多”日志记录会成为应用安全问题
日志记录并非中立的。相反,它会造成…… 辅助数据存储.
如果你记录敏感数据,实际上就创建了你秘密信息的第二个副本。
然而,日志通常被排除在威胁建模之外。根据 STRIDE 模型,这显然对应于:
披露信息
因此,安全 SDLC 实践中应将日志视为:
- 与安全相关的工件
- 敏感资产
- 需要保护的基础设施组件
如果你的威胁模型忽略了日志,那么它就是不完整的。
6. 如何防止日志文件中的凭据泄露
6.1 停止记录秘密信息
从不记录:
- 密码
- 令牌
- API密钥
- 会话 ID
- 授权标头
即使在调试模式下也是如此。
尽可能实现自动编辑。
6.2 结构化和安全日志记录
使用结构化日志记录,并进行掩码和过滤。
示例(Node.js):
const logger = require('pino')({
redact: ['req.headers.authorization', 'body.password']
});
示例(Python):
class RedactFilter(logging.Filter):
def filter(self, record):
record.msg = record.msg.replace("password=", "password=***")
return True
关键原则很简单:秘密信息绝不能进入日志接收器。
6.3 锁定日志存储
安全控制措施应包括:
- 禁用目录列表
- 保护
/logs/带有身份验证的路径 - 限制存储桶访问
- 执行保留政策
- 对静态日志进行加密
日志绝不能通过 HTTP 公开访问。
6.4 CI/CD Guardrails
人工审核不足以应对这种情况。应该实施自动化控制:
- 在文物发布前秘密扫描日志
- 如果检测到令牌,则构建失败。
- 阻止上传包含凭据的工件
- 对工件进行哈希验证
CI/CD 应在索引建立之前阻止暴露。
7. Xygeni 如何防止 allintext:login 文件类型:日志事件
问题不在于谷歌搜索技巧,而在于曝光度。因此,预防措施必须在索引之前实施。
7.1 日志和工件中的秘密检测
Xygeni扫描:
- 应用日志
- CI/CD 作业跟踪
- 构建工件
- Docker 层
- 串行输出
如果凭证、令牌或敏感值出现在 .log 文件,Xygeni 会立即标记它们。
7.2 CI/CD Guardrails 阻止曝光
而不是依赖人工审核, Xygeni 在以下方面加强了安全措施: pipeline 水平:
dotnet xygeni enforce --rules secrets,artifacts,logs --fail-on-risk
这个:
- 当日志中出现密钥时,构建失败
- 积木制品出版
- 防止意外暴露于公众视野
- 在到达主干道之前阻止不安全的合并。
如果 CI 作业打印了一个令牌, pipeline 将失败。
未建立索引。
无接触史。
无意外发生。
7.3 在谷歌发现之前进行左移保护
时机很重要。
而不是做出反应:
allintext:login filetype:log
Xygeni 可以解决这个问题:
- At commit 次
- 中 pull request 验证
- 中 pipeline 执行
- 在文物发表之前
如果日志从未公开,Google 就不会对其进行索引。
最终结论:如果谷歌能够索引它,攻击者肯定已经索引过了。
日志并非无害。事实上,它们很少是临时性的。默认情况下,它们并非私有文件。因此,每个日志文件都应被视为与安全相关的资产,而不仅仅是调试输出。
如果敏感数据泄露 .log 文件将公开访问, 它立刻变成了攻击面。 此外,一旦被搜索引擎收录,曝光量就会超出你的控制范围。
解决方案并非停止日志记录,而是负责任地记录日志,并对存储和分发实施严格的控制。换句话说,安全必须超越应用程序本身,延伸到可观测性层面。
代替:
- 停止记录秘密信息
- 封锁原木存储
- 执行 pipeline guardrails
- 自动检测和策略执行
最终, 预防的关键在于时机。因为一旦 allintext:login 文件类型:日志 返回您的域名,事件已经开始。





