將新文件命名為ReportController。將以下代碼粘貼到其中:

using Microsoft.AspNetCore.Mvc;

namespace injection_demo.Controllers;

public class ReportController : Controller
{
private readonly ILogger<ReportController> _logger;
private readonly IWebHostEnvironment _environment;

public ReportController(
ILogger<ReportController> logger,
IWebHostEnvironment environment)
{
_logger = logger;
_environment = environment;
}

public IActionResult Generate(string? id)
{
ViewData["Client"] = id;
var process = new System.Diagnostics.Process();
var startInfo = new System.Diagnostics.ProcessStartInfo();
var contentPath = _environment.ContentRootPath;
var filePath = System.IO.Path.Combine(contentPath, id);
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = $"/C echo teste > {filePath}";
process.StartInfo = startInfo;
process.Start();

if (process == null)
{
return StatusCode(500);
}
else
{
process.WaitForExit();
return View();
}
}
}

接下來,轉到“Views”并添加一個新文件夾:

.NET 命令注入:示例和預防 - 圖片 2

將文件夾命名為Report并在其中創建一個名為Generate.cshtml的文件。在其中添加以下文本:

@{
ViewData["Title"] = "Report";
}

<div class="text-center">
<h1 class="display-4">Report for the client @ViewData["Client"]</h1>
</div>

運行示例應用程序

現在我們可以運行此應用程序了。如果您已將VS Code 配置為調試,只需按 F5。否則,請轉到您的終端并執行dotnet run。

無論你如何操作,你都應該能夠訪問https://localhost:7168/并實時查看應用程序:

.NET 命令注入:示例和預防 - 圖片 3

要測試該應用,請轉到地址欄并將/report/generate/<SOME-NAME>附加到地址。當然,將<SOME-NAME>替換為實際名稱。例如,您的名稱。然后按 Enter。這是我使用我的名字執行此操作后看到的內容:

.NET 命令注入:示例和預防 - 圖片 4

完成此操作后,轉到項目文件夾,您將看到一個帶有您名稱的文件:

.NET 命令注入:示例和預防 - 圖片 5 圖像

這證明命令執行成功。但是命令注入呢?

利用應用程序

此示例應用程序處理用戶輸入的方式相當簡單。它只是接受任何輸入并將其連接到由底層操作系統執行的命令。

一般來說,你不應該盲目相信來自應用外部的任何信息。這包括

為了演示此應用程序的可利用性,你只需執行一個非常簡單的測試。在應用程序運行時,將以下內容附加到地址欄內容:

&& dir > out.txt

然后再次運行該應用程序。這是我在瀏覽器中看到的內容:

.NET 命令注入:示例和預防 - 圖片 6

這可能看起來像是一個無害的結果。不過,不要自欺欺人。轉到項目的文件夾,您將在那里看到一個名為out.txt的文件:

.NET 命令注入:示例和預防 - 圖片 7

沒錯!您剛剛添加的額外文本導致執行了第二條命令。更具體地說,執行了dir命令,然后將其輸出傳輸到新文件中。打開該文件,其內容應如下所示:

.NET 命令注入:示例和預防 - 圖片 8

如何防止 .NET 命令注入

正如您所見,我們創建的愚蠢示例應用程序根本無法防范命令注入。我們執行的“攻擊”相當溫和,但在現實世界中,此類事件可能會造成嚴重后果。

那么,您可以做些什么來防止此類攻擊?最好的方法就是不要從您的 Web 應用程序運行操作系統命令。通常有比直接運行命令更好的替代方案(例如,作業調度)。

如果您確實需要運行命令,請不要盲目信任用戶輸入。使用正則表達式或允許列表驗證收到的數據,以僅允許合法值。

另外,不要忘記利用您可能擁有的任何工具。例如,.NET 提供了許多有用的靜態安全分析規則。其中之一 —?CA3006?— 是關于命令注入的。不要停用這些規則。更好的方法是配置您的項目,使其發出編譯器錯誤而不是僅僅發出警告。

.NET 命令注入:了解它們并保護你的應用程序免受其侵害

流行文化將黑客的典型形象刻畫在我們所有人的腦海中。事實證明,現實世界中的漏洞利用要平常得多,而且通常是由于開發人員在保護其應用程序時不夠勤勉而發生的。在眾多漏洞利用中,代碼注入攻擊是最著名的攻擊之一。在其子類型中,我們可以列舉 SQL 注入和命令注入。這篇文章是關于前者的。

在這篇文章中,我們為您提供了 .NET 命令注入的入門指南。您已經了解了操作系統命令注入、它們對應用程序造成的危險以及如何應對它們。

文章來源:.NET Command Injection: Examples and Prevention

上一篇:

Node.js破損訪問控制指南:示例與預防

下一篇:

TypeScript CORS指南:它是什么如何啟用它
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費