关注【索引目录】服务号,更多精彩内容等你来探索!
为什么需要另一个安全扫描程序?
随着IT技术的快速发展,我们周围充斥着多种安全工具,所以我问自己也问你:“为什么?”
我有两个答案:
这是一个学习的机会——我想加强对网络安全漏洞的理解并提高我的Go能力。
灵活性——我需要一种可以根据特定需求进行定制的工具,而无需使用过于复杂的企业级工具。
此外,让我们拒绝互相欺骗,建立安全系统是一项非常有趣的任务。
⚡ 脱颖而出的核心功能
该工具能够识别多种安全威胁:
HTTP 请求走私(集成起来非常困难)
SQL 注入
跨站点脚本 (XSS)
CORS 配置错误
安全标头的忽视
SSL/TLS 易受攻击区域
还有更多...
除了检测漏洞之外,我还希望它能够:
✅快速– 能够并发扫描(Go 的 goroutines 可以很好地实现此功能)
✅模块化– 具有易于部署的架构,可以引入新的漏洞扫描检查
✅友好– 提供修复问题的详细说明,而不仅仅是包含问题的指针
技术架构
构建模块
该项目遵循清晰的模块化结构:
该图是在dirscanner的帮助下制作的
cmd/ # CLI commands using Cobra
internal/
core/ # Core scanner logic
http/ # Custom HTTP client
model/ # Data structures
modules/ # Vulnerability detection modules
output/ # Report formatting
pkg/utils/ # Utility functions
模块系统
扫描器的核心是其模块系统。每个漏洞检查都作为单独的模块实现,并实现一个简单的接口:
type ScanModule interface {
Name() string
Description() string
Run(scanner Scanner) ([]model.Vulnerability, error)
}
这使得添加新的漏洞检查变得异常简单。以下是 XSS 模块的一个简化示例:
func (m *XSSVulnerabilityModule) Run(s Scanner) ([]model.Vulnerability, error) {
// Send requests with XSS payloads
resp, err := s.SendHTTPRequest("GET", "/?q=<script>alert(1)</script>", nil, nil)
// Check if the payload was reflected without encoding
if strings.Contains(bodyStr, "<script>alert(1)</script>") {
return []model.Vulnerability{{
ID: "XSS-01",
Name: "Reflected Cross-Site Scripting",
Severity: model.SeverityHigh,
// ...details, remediation info, etc.
}}, nil
}
return nil, nil
}
我解决的技术挑战
1. HTTP请求走私检测
识别 HTTP 请求走私非常复杂。我首先必须设计具有不匹配和矛盾的“Content-Length”和“Transfer Encoding”标头的合成 HTTP 请求,然后检查来自服务器的响应。这是一个复杂的过程,需要我创建一个自定义的原始 HTTP 客户端,该客户端可以完全控制请求的精确构造:
func (c *Client) SendRawRequest(target model.Target, payload string) (string, error) {
// Establish raw TCP or TLS connection
if target.SSL {
conn, err = tls.DialWithDialer(dialer, "tcp", address, tlsConfig)
} else {
conn, err = net.DialTimeout("tcp", address, timeout)
}
// Send the exact bytes we've crafted
fmt.Fprintf(conn, payload)
// Read the raw response
// ...
}
2.并发控制
安全扫描可能是并发性最有用的应用——我们可以并行执行的安全检查越多越好。相反,在这种情况下,等待一个任务完成后再开始另一个任务是低效的。不幸的是,不受管制的并行性可能导致目标服务器拒绝服务或调用速率限制。
scanner.semaphore = make(chan struct{}, config.Concurrency)
// In the scan routine
s.semaphore <- struct{}{} // Acquire token
defer func() { <-s.semaphore }() // Release token
3.强大的错误处理
当你发送格式错误的请求并探测安全边界时,事情就会出问题。很多次。优雅的错误处理对于防止扫描仪在扫描过程中崩溃至关重要:
go func() {
defer func() {
if r := recover(); r != nil {
s.logger.Errorf("Module %s panicked: %v", m.Name(), r)
errorChan <- fmt.Errorf("module %s panicked: %v", m.Name(), r)
}
}()
vulnerabilities, err := m.Run(s)
// ...
}()
通过将模块执行包装在 panic-recovery goroutine 中,单个行为不当的模块就不会导致整个扫描失败。
反思
我从这个项目中学到的东西比我最初计划的要多得多:
安全漏洞是微妙的——成功检测它们需要了解攻击者采用的技术和服务器端行为。
Go 的并发模型在网络工具中大放异彩——得益于 goroutine 和通道,扫描过程的并行实现出奇的简单。
CLI UX 很重要——命令行终端上精心设计的界面以及正确格式的输出可以提高开发人员工具的质量。
下一步是什么?
我对 Kafka HTTP Scanner 有很多想法:
主动利用模块(具有适当的保护措施)
CI/CD 集成
自定义报告设计
API 模糊测试
尝试一下!
如果您想涉足安全测试领域,或者正在寻找基于 Go 的命令行工具,请随意测试 Kafka HTTP Scanner。
git clone https://github.com/aymaneallaoui/kafka-http-scanner.git
cd kafka-http-scanner
go build -o httpscan
Copy
To execute a basic scan:
./httpscan scan --url https://your-target-site.com
由于该工具是开源的,您可以随意进行任何符合您要求的更改。我非常欢迎任何反馈和贡献。
如果您使用 Go 创建了任何安全工具,那么您必须克服哪些障碍?在评论中分享您的想法!

