基于C#實(shí)現(xiàn)一個(gè)簡(jiǎn)單的漏洞掃描器
下面是一個(gè)用 C# 開(kāi)發(fā)簡(jiǎn)單漏洞掃描器的示例。它包含兩個(gè)核心功能:
- 端口掃描:快速檢測(cè)目標(biāo)主機(jī)開(kāi)放的 TCP 端口。
- 基礎(chǔ) Web 漏洞檢測(cè):對(duì) HTTP/HTTPS 服務(wù)進(jìn)行簡(jiǎn)單的 SQL 注入和 XSS 反射測(cè)試。
你可以在此基礎(chǔ)上擴(kuò)展服務(wù)識(shí)別、漏洞庫(kù)匹配等高級(jí)功能。
1. 項(xiàng)目創(chuàng)建與依賴(lài)
建議使用 .NET 6/8 控制臺(tái)應(yīng)用。
dotnet new console -n SimpleVulnScanner cd SimpleVulnScanner
無(wú)需額外 NuGet 包,僅使用內(nèi)置 System.Net.Sockets、System.Net.Http。
2. 完整代碼
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
namespace SimpleVulnScanner;
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("=== 簡(jiǎn)單漏洞掃描器 (C#) ===");
string target = GetTarget(args);
int startPort = 1, endPort = 1024; // 默認(rèn)掃描常見(jiàn)端口
// 解析端口范圍
if (args.Length >= 2)
{
var portParts = args[1].Split('-');
if (portParts.Length == 2 && int.TryParse(portParts[0], out int p1) && int.TryParse(portParts[1], out int p2))
{
startPort = p1;
endPort = p2;
}
else if (int.TryParse(args[1], out int singlePort))
{
startPort = singlePort;
endPort = singlePort;
}
}
Console.WriteLine($"目標(biāo): {target}");
Console.WriteLine($"端口范圍: {startPort}-{endPort}");
Console.WriteLine("開(kāi)始端口掃描...\n");
var openPorts = await PortScanner.ScanPortsAsync(target, startPort, endPort);
Console.WriteLine("\n端口掃描完成。");
if (openPorts.Count == 0)
{
Console.WriteLine("未發(fā)現(xiàn)開(kāi)放端口。");
return;
}
Console.WriteLine("開(kāi)放端口列表:");
foreach (var port in openPorts)
{
string service = PortScanner.GuessService(port);
Console.WriteLine($" {port}/tcp ({service})");
}
// 對(duì)常見(jiàn) Web 端口進(jìn)行漏洞檢測(cè)
var webPorts = openPorts.Where(p => p == 80 || p == 443 || p == 8080 || p == 8443).ToList();
if (webPorts.Any())
{
Console.WriteLine("\n開(kāi)始 Web 漏洞檢測(cè)...");
foreach (var port in webPorts)
{
string scheme = port == 443 || port == 8443 ? "https" : "http";
string baseUrl = $"{scheme}://{target}:{port}";
await WebVulnScanner.ScanAsync(baseUrl);
}
}
Console.WriteLine("\n掃描結(jié)束。按任意鍵退出...");
Console.ReadKey();
}
static string GetTarget(string[] args)
{
if (args.Length > 0 && !string.IsNullOrEmpty(args[0]))
return args[0];
Console.Write("請(qǐng)輸入目標(biāo) IP 或域名: ");
return Console.ReadLine()?.Trim() ?? "127.0.0.1";
}
}
// ---------- 端口掃描模塊 ----------
public static class PortScanner
{
private const int TimeoutMs = 1000;
private const int MaxConcurrency = 100;
public static async Task<List<int>> ScanPortsAsync(string host, int startPort, int endPort)
{
var openPorts = new List<int>();
var semaphore = new SemaphoreSlim(MaxConcurrency);
var tasks = new List<Task>();
for (int port = startPort; port <= endPort; port++)
{
await semaphore.WaitAsync();
int currentPort = port;
tasks.Add(Task.Run(async () =>
{
try
{
if (await IsPortOpenAsync(host, currentPort))
{
lock (openPorts)
{
openPorts.Add(currentPort);
Console.WriteLine($"[+] 開(kāi)放: {currentPort}/tcp");
}
}
}
finally
{
semaphore.Release();
}
}));
}
await Task.WhenAll(tasks);
openPorts.Sort();
return openPorts;
}
private static async Task<bool> IsPortOpenAsync(string host, int port)
{
try
{
using var client = new TcpClient();
var connectTask = client.ConnectAsync(host, port);
var timeoutTask = Task.Delay(TimeoutMs);
var completedTask = await Task.WhenAny(connectTask, timeoutTask);
if (completedTask == timeoutTask)
return false;
return client.Connected;
}
catch
{
return false;
}
}
public static string GuessService(int port)
{
return port switch
{
21 => "FTP",
22 => "SSH",
23 => "Telnet",
25 => "SMTP",
80 => "HTTP",
110 => "POP3",
143 => "IMAP",
443 => "HTTPS",
3306 => "MySQL",
3389 => "RDP",
5432 => "PostgreSQL",
8080 => "HTTP-Proxy",
_ => "未知"
};
}
}
// ---------- Web 漏洞檢測(cè)模塊 ----------
public static class WebVulnScanner
{
private static readonly HttpClient _httpClient;
static WebVulnScanner()
{
var handler = new HttpClientHandler
{
ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true // 忽略證書(shū)錯(cuò)誤
};
_httpClient = new HttpClient(handler);
_httpClient.Timeout = TimeSpan.FromSeconds(10);
_httpClient.DefaultRequestHeaders.Add("User-Agent", "SimpleVulnScanner/1.0");
}
public static async Task ScanAsync(string baseUrl)
{
Console.WriteLine($"\n[*] 掃描 Web 服務(wù): {baseUrl}");
// 1. 檢測(cè) SQL 注入(基于錯(cuò)誤回顯)
await TestSqlInjectionAsync(baseUrl);
// 2. 檢測(cè)反射型 XSS
await TestReflectedXssAsync(baseUrl);
}
private static async Task TestSqlInjectionAsync(string baseUrl)
{
string[] sqlPayloads = { "'", "\"", "' OR '1'='1", "\" OR \"1\"=\"1", "' OR 1=1--", "\" OR 1=1--" };
var errorPatterns = new[]
{
"SQL syntax", "mysql_fetch", "ORA-", "PostgreSQL", "SQLite", "Microsoft OLE DB",
"Unclosed quotation mark", "You have an error in your SQL syntax"
};
foreach (var payload in sqlPayloads)
{
string testUrl = $"{baseUrl}/?id={Uri.EscapeDataString(payload)}";
try
{
var response = await _httpClient.GetAsync(testUrl);
string content = await response.Content.ReadAsStringAsync();
foreach (var pattern in errorPatterns)
{
if (content.Contains(pattern, StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine($" [!] 可能存在 SQL 注入 (錯(cuò)誤回顯) - Payload: {payload}");
return; // 僅報(bào)告一次
}
}
}
catch (Exception ex)
{
// 忽略網(wǎng)絡(luò)錯(cuò)誤
}
}
}
private static async Task TestReflectedXssAsync(string baseUrl)
{
string xssPayload = "<script>alert('XSS')</script>";
string testUrl = $"{baseUrl}/?q={Uri.EscapeDataString(xssPayload)}";
try
{
var response = await _httpClient.GetAsync(testUrl);
string content = await response.Content.ReadAsStringAsync();
// 檢查 payload 是否原樣反射在響應(yīng)中
if (content.Contains(xssPayload))
{
Console.WriteLine($" [!] 可能存在反射型 XSS - Payload 已回顯");
}
}
catch
{
// 忽略
}
}
}3. 使用說(shuō)明
命令行參數(shù)
dotnet run <目標(biāo)IP/域名> [端口范圍]
示例:
# 掃描 127.0.0.1 的 1-1024 端口 dotnet run 127.0.0.1 # 掃描 192.168.1.1 的 80-100 端口 dotnet run 192.168.1.1 80-100 # 掃描單個(gè)端口 443 dotnet run example.com 443
若未提供參數(shù),程序會(huì)交互式詢(xún)問(wèn)目標(biāo)。
運(yùn)行截圖示意
=== 簡(jiǎn)單漏洞掃描器 (C#) === 目標(biāo): 192.168.1.1 端口范圍: 1-1024 開(kāi)始端口掃描... [+] 開(kāi)放: 80/tcp [+] 開(kāi)放: 443/tcp [+] 開(kāi)放: 22/tcp 端口掃描完成。 開(kāi)放端口列表: 22/tcp (SSH) 80/tcp (HTTP) 443/tcp (HTTPS) 開(kāi)始 Web 漏洞檢測(cè)... [*] 掃描 Web 服務(wù): http://192.168.1.1:80 [!] 可能存在 SQL 注入 (錯(cuò)誤回顯) - Payload: ' [!] 可能存在反射型 XSS - Payload 已回顯 [*] 掃描 Web 服務(wù): https://192.168.1.1:443 掃描結(jié)束。按任意鍵退出...
4. 功能說(shuō)明與局限性
| 功能 | 實(shí)現(xiàn)方式 | 說(shuō)明 |
|---|---|---|
| 端口掃描 | TCP Connect 異步掃描 | 超時(shí) 1 秒,并發(fā) 100,速度快且準(zhǔn)確 |
| 服務(wù)猜測(cè) | 靜態(tài)映射表 | 根據(jù)常見(jiàn)端口號(hào)推測(cè)服務(wù)名稱(chēng) |
| SQL 注入檢測(cè) | 發(fā)送 ' 等 payload,匹配錯(cuò)誤關(guān)鍵詞 | 僅檢測(cè)錯(cuò)誤回顯型,不適用于盲注 |
| XSS 檢測(cè) | 發(fā)送 <script>alert('XSS')</script> 并檢查回顯 | 僅檢測(cè)反射型,不適用于 DOM 型 |
局限性與改進(jìn)方向
- 端口掃描:容易被防火墻攔截,可改用 SYN 半開(kāi)掃描(需更高權(quán)限)。
- Web 漏洞檢測(cè):非?;A(chǔ),實(shí)際環(huán)境中應(yīng)集成更全面的 payload 和智能分析(如基于 DOM 的變化)。
- 服務(wù)識(shí)別:目前僅靠端口猜測(cè),可增加 Banner 抓取。
- 多線程安全:已使用
SemaphoreSlim控制并發(fā),避免資源耗盡。
5. 擴(kuò)展建議
如果你想增強(qiáng)這個(gè)掃描器,可以考慮以下方向:
- Banner 抓取:在端口開(kāi)放后發(fā)送特定協(xié)議探測(cè)包(如 HTTP GET、SMTP EHLO),獲取服務(wù)版本信息。
- 漏洞庫(kù)匹配:將識(shí)別到的服務(wù)版本與 CVE 數(shù)據(jù)庫(kù)對(duì)比。
- 爬蟲(chóng)與表單掃描:對(duì)發(fā)現(xiàn)的 Web 服務(wù)進(jìn)行爬取,自動(dòng)填充表單進(jìn)行 SQLi / XSS 測(cè)試。
- 報(bào)告生成:將掃描結(jié)果輸出為 JSON 或 HTML 報(bào)告。
- 插件化架構(gòu):使用 MEF 或反射加載自定義檢測(cè)模塊。
以上就是基于C#實(shí)現(xiàn)一個(gè)簡(jiǎn)單的漏洞掃描器的詳細(xì)內(nèi)容,更多關(guān)于C#漏洞掃描器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#單例模式Singleton的實(shí)現(xiàn)詳解
單例模式(Singleton?Pattern)是日常開(kāi)發(fā)中最簡(jiǎn)單的設(shè)計(jì)模式之一,它提供了一種創(chuàng)建對(duì)象的最佳方式,本文主要為大家介紹的是C#單例模式的實(shí)現(xiàn)方法,需要的可以參考一下2023-05-05
Unity計(jì)時(shí)器功能實(shí)現(xiàn)示例
計(jì)時(shí)器在很多地方都可以使用,本文主要介紹了Unity計(jì)時(shí)器功能實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
基于Unity3D實(shí)現(xiàn)仿真時(shí)鐘詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Unity3D模擬實(shí)現(xiàn)一個(gè)簡(jiǎn)單是時(shí)鐘效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01
C#實(shí)現(xiàn)一個(gè)Word保護(hù)性模板文件
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)一個(gè)Word保護(hù)性模板文件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下2024-01-01
Linq兩個(gè)List集合取交集的實(shí)現(xiàn)
這篇文章主要介紹了Linq兩個(gè)List集合取交集的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
C#面向?qū)ο笤O(shè)計(jì)原則之接口隔離原則
這篇文章介紹了C#面向?qū)ο笤O(shè)計(jì)原則之接口隔離原則,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03

