可利用的C#函数


69

这个问题类似于可利用的PHP函数

受污染的数据来自用户,或更具体地说是攻击者。当受污染的变量到达接收器函数时,您将遇到漏洞。例如,执行sql查询的函数是一个接收器,而GET / POST变量是污点的来源。

C#中所有接收器功能是什么?我正在寻找引入漏洞或软件漏洞的功能。我对远程执行代码漏洞特别感兴趣。是否有整个类/库在功能上包含黑客想要影响的讨厌的东西?人们如何意外制作危险的C#代码?


5
有点模糊。许多危险来自在完全信任而不是较低信任级别下运行的应用程序。信任程度越低,进行恶意行为的难度就越大。
Lucero 2010年

@Lucero我喜欢php问题,我认为这非常适用于C#。
rook 2010年

2
哇,软件弱点链接是一个庞大的页面。
IWriteApps 2010年

@Gio yep花了一点时间整理一下;)
菜鸟

3
您在这里到底期望什么?大量的功能?我不知道怎么说也是有益的......另外,是学究,你说有关.NET基础类库,也许Asp.Net,不C#的功能(我不知道有“C#函数” )。
Kobi 2013年

Answers:


31

在基于Web的方面,C#(更常见的是ASP.NET)通常容易受到以下漏洞的影响(OWASP Top 10 2013列出的项目)。我知道您主要对接收器功能感兴趣,但其中有一些内容,但是您确实询问了人们是如何意外制作危险的C#代码的,因此希望在此提供一些见解。

A1注射

SQL注入

通过字符串连接生成查询。

var sql = "SELECT * FROM UserAccount WHERE Username = '" + username "'";
SqlCommand command = new SqlCommand(sql , connection);
SqlDataReader reader = command.ExecuteReader();

这通常可以通过参数化查询来解决,但是,如果您使用的是IN条件,则当前没有字符串连接是不可能的

LDAP注入

代码如

searcher.Filter = string.Format("(sAMAccountName={1})", loginName);

会使应用程序容易受到攻击。更多信息在这里

操作系统命令注入

此代码容易受到命令注入的影响,因为第二个参数Process.Start可以使用&字符批处理多个命令来传递额外的命令

string strCmdText= @"/C dir c:\files\" + Request.QueryString["dir"];
ProcessStartInfo info = new ProcessStartInfo("CMD.exe", strCmdText);
Process.Start(info);

例如 foldername && ipconfig

A2身份验证和会话管理中断

登出

默认的“表单身份验证签出”方法不会更新服务器端的任何内容,从而允许继续使用捕获的身份验证令牌。

调用SignOut方法只会删除表单身份验证cookie。Web服务器不存储有效的和过期的身份验证票证以供以后比较。如果恶意用户获得有效的表单身份验证cookie,这会使您的站点容易受到重放攻击。

使用会话状态进行身份验证

会话固定如果一个用户已经使用漏洞可能存在会话状态以用于认证

A3跨站点脚本(XSS)

Response.Write(和快捷方式<%= =>)默认情况下容易受到攻击,除非开发人员记得对输出进行HTML编码。<%:默认情况下,较新的快捷方式HTML会默认编码,尽管某些开发人员可能会使用此快捷方式将值插入JavaScript,从而使攻击者仍然可以对其进行转义。即使使用现代的Razor引擎,也很难做到这一点:

var name = '@Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Name))';

默认情况下,ASP.NET启用请求验证,该请求验证将阻止来自cookie,查询字符串和POST数据的任何输入,这些输入可能是恶意的(例如HTML标记)。这似乎可以很好地应付来自特定应用程序的输入,但是如果数据库中存在从其他来源插入的内容,例如使用其他技术编写的应用程序插入的内容,则可能仍会输出恶意脚本代码。另一个弱点是将数据插入属性值中。例如

<%
alt = Request.QueryString["alt"];
%>
<img src="http://example.com/foo.jpg" alt="<%=alt %>" />

可以在不触发请求验证的情况下利用此漏洞:

如果alt

" onload="alert('xss')

然后呈现

<img src="http://example.com/foo.jpg" alt="" onload="alert('xss')" />

在旧版本的.NET中,对于开发人员来说,要确保使用某些默认的Web控件正确地编码了他们的输出,这是一个雷区

不幸的是,数据绑定语法尚不包含内置编码语法。它会在下一个版本的ASP.NET中发布

例如不脆弱:

  <asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
      <asp:TextBox ID="txtYourField" Text='<%# Bind("YourField") %>'
        runat="server"></asp:TextBox>
    </ItemTemplate>
  </asp:Repeater>

脆弱的:

<asp:Repeater ID="Repeater2" runat="server">
  <ItemTemplate>
    <%# Eval("YourField") %>
  </ItemTemplate>
</asp:Repeater>

A4-不安全的直接对象引用

MVC模型绑定可以允许将添加到POST数据的参数映射到数据模型上。这可能是无意发生的,因为开发人员尚未意识到恶意用户可以通过这种方式修改参数。该Bind属性可用于防止这种情况

A5-安全性错误配置

有许多配置选项可以削弱应用程序的安全性。例如,设置customErrorsOn或启用跟踪。

诸如ASafaWeb的扫描仪可以检查这种常见的错误配置。

A6敏感数据暴露

默认哈希

ASP.NET中默认的密码哈希方法有时不是最好的方法。

A7-缺少功能级别的访问控制

无法限制URL访问

在集成管道模式下,.NET可以看到每个请求,并且句柄可以授权每个请求,甚至可以访问非.NET资源(例如.js,图像)。但是,如果应用程序以经典模式运行,则.NET仅会看到对文件的请求,例如,.aspx因此其他文件可能会意外地不安全。有关差异的更多详细信息,请参见此答案

例如www.example.com/images/private_photograph_user1.jpg,尽管有一些解决方法,但在以经典模式运行的应用程序中,它更容易受到攻击。

A8跨站请求伪造(CSRF)

尽管由于要求攻击者伪造“视图状态”和“事件验证”值,传统的Web表单应用程序通常更安全地抵御CSRF ,但除非开发人员手动实施了防伪令牌,否则更新的MVC应用程序可能会很容易受到攻击。请注意,我并不是说Web表单不是易受攻击的,只是简单地传递一些基本参数会更加困难-尽管有一些修复,例如将用户密钥集成到“视图状态”值中。

当EnableEventValidation属性设置为true时,ASP.NET验证控件事件源自该控件所呈现的用户界面。控件在呈现期间注册其事件,然后在回发或回调处理期间验证事件。例如,如果在呈现页面时列表控件包括编号为1、2或3的选项,并且如果收到指定选项号为4的回发请求,则ASP.NET会引发异常。默认情况下,ASP.NET中所有事件驱动的控件都使用此功能。

[EnableEventValidation]功能降低了未经授权或恶意的回发请求和回调的风险。强烈建议您不要禁用事件验证。

A10未经验证-重定向和转发

添加代码如

Response.Redirect(Request.QueryString["Url"]);

将使您的网站容易受到攻击。可以通过向包含链接的用户发送网络钓鱼电子邮件来发起攻击。如果用户保持警惕,则可以在单击之前仔细检查URL的域。但是,由于该域将与用户信任的您的域匹配,因此他们将单击链接,而没有意识到页面会将用户重定向到攻击者的域。

进行验证Url以确保它是相对于您自己允许的域和页面的允许URL还是绝对URL。例如,您可能想检查某人没有将您的用户重定向到/Logout.aspx。尽管可能并没有阻止攻击者直接链接的方法http://www.example.com/Logout.aspx,但他们可以使用重定向来隐藏URL,因此用户很难理解正在访问哪个页面(http://www.example.com/Redirect.aspx?Url=%2f%4c%6f%67%6f%75%74%2e%61%73%70%78)。

其他

其他OWASP类别是:

  • A9-使用已知漏洞的组件

其中我想不出C#/ ASP.NET特有的任何东西。如果有任何疑问(如果您认为与您的问题相关),我将更新我的答案。


我应该更仔细地阅读。
菜鸟

@也骗我。这个家伙很棒。我是说真的。
罗伊·纳米尔

55

任何使用正则表达式的东西(尤其是RegularExpressionValidator)。要查看此信息,请使用正则表达式运行RegularExpressionValidator,^(\d+)+$并为其提供30位数字和一个字母字符进行验证。

一些帖子:

这就是所谓的“正则表达式拒绝服务”攻击,它可能使网站瘫痪。


3
哦,那是一个好人。并适用于带有正则表达式支持的任何语言。
杰夫·梅卡多

2
有趣的奇怪之处,但这离完整答案还很远。
菜鸟

2
所有的正则表达式都不会引起此类问题。这是专门为解决此类问题而设计的。
拉瑟五世卡尔森

3
是的,我做到了,我完全同意。如果您使用未经审核的正则表达式,并且对正则表达式了解很多,那么您将打开各种蠕虫罐。
Lasse V. Karlsen

1
通过使用智能算法并取消对某些奇特功能的支持,可以安全地完成正则表达式。示例:TRE,Google的RE2。
jilles 2010年

18

Process.Start 是第一个想到的。

我敢肯定,WindowsIdentity其中许多System.Security也可以用于邪恶。

当然,有SQL注入攻击,但我认为这不是您的意思(尽管可以通过SQL Server进行远程执行)。


2
诸如具有SQL用户名和密码的连接字符串之类的东西有点狡猾,当您使用静态字符串时,它们通常会在反编译器中找到,因此,如果它们包含私有信息,则最好不要使用它们。
kyndigs

请描述WindowsIdentity的问题
jgauffin 2010年

尽管我更喜欢使用带有用户名和密码的连接字符串,但是然后严格控制数据库权限,以使用户名和密码无法执行任何操作,但我并没有根据具体情况明确授予其权限。
彼得·朗格,2010年

17

除了Process.Start()已经提到的显而易见的内容外,我还可以看到几种潜在的间接利用方式。

  • WinAPI通过PInvoke调用,CreateProcess()然后调用。
  • 任何使用Assembly.Load()和其他此类重载的动态程序集加载机制。如果某个受损的程序集将其安装到系统中并加载。
  • 一般情况下如果完全信任运行。
  • 如果拥有正确的权限,任何注册表操作都可能使您面临风险。

这就是现在想到的全部。


12

IMO:nr 1的可利用功能看上去很无辜,但是如果不加考虑就非常危险。

在ASP.NetResponse.Write或快捷方式中:

  <%= searchTermFromUser %>

在ADO.Net中:

  • string +操作:
    var sql = "SELECT * FROM table WHERE name = '" + searchTermFromUser + "'"

4
从来没有那样的SQL语句。在查询中使用Command.AddParameter和参数名称。
jgauffin 2010年

1
是的,这就是我的意思。这些是可利用代码的示例。
GvS

使用该网站的response.write有什么问题?
Xaqron

@Xaqron:因为通常会忘记HtmlEncode
GvS 2010年

2
@Xaqron:这是允许[跨站点脚本编写](en.wikipedia.org/wiki/Cross-site_scripting)的一种途径
jachguate 2010年

12

您从用户(或任何其他外部来源)获取并传递给另一个系统或另一个用户的任何数据都是潜在的利用。

如果您从用户那里得到一个字符串并在不使用HtmlEncode的情况下将其显示给另一个用户,则可能是一个利用。

如果您从用户那里得到一个字符串并用它来构造SQL,则可能是SQL注入。

如果您从用户那里得到一个字符串,并用它来为Process.Start或Assembly.Load压缩文件名,则它是一个远程执行漏洞

您明白了,危险来自使用未经处理的数据,如果您从未未经消毒就将用户输入传递给外部系统(例如:HtmlEncode)或使用注入安全接口(例如:SQL参数),则相对安全-就在您一分钟之内忘了清理某些东西,最无辜的方法可能会变成安全漏洞。

注意:Cookies,html标头和通过网络传递的其他任何内容也是来自用户的数据,在大多数情况下,即使数据库中的数据也是来自用户的数据。


是的,来自用户的数据称为污染数据。当受污染的数据达到“接收器”功能时,您将具有漏洞。查看我在顶部发布的PHP Sink函数列表。

1
@Rook-您不可能列出所有“接收器”功能,任何未明确设计为处理可能的恶意数据的代码均为接收器功能-同样,任何设计为在衍射环境中处理恶意数据的代码使用它是一个接收器功能(例如:XmlDocument.Load旨在检测和拒绝格式不正确或恶意的XML,但是如果让用户控制要加载的文件,则可以用来加载配置文件并造成非常严重的后果)。信息泄露漏洞)
Nir

您在顶部看到我的PHP链接了吗?或者你遇到的静态分析工具,如大鼠(fortify.com/ssa-elements/threat-intelligence/rats.html

8

System.Net,System.XML,System.IO中的许多内容(任何采用URI和/或文件路径并实际处理它们标识的资源的系统)System.Reflection,System.Security,System.Web,System .Data和System.Threading命名空间可能很危险,因为它们可以用来做坏事情,而不仅仅是搞乱当前执行。如此之多以至于无法识别每个人。

当然,除非另有说明,否则所有第三方程序集中的每种方法都必须假定为危险的。再次消耗更多时间。

我也不认为这是一种特别富有成果的方法。生成功能清单仅在有限的库或大语言中才真正起作用,在大语言中,使用C#之类的库中的很多内容都在该语言本身中。

有一些经典的危险示例,例如Process.Start()或可以直接执行另一个过程的任何示例,但它们之间的平衡显然很危险。即使是相对笨拙和不称职的编码人员在使用它时也要小心,同时不要去处理其他方法的数据。

与任何功能列表相比,对数据进行卫生检查是一件更有成果的事情。是否对数据进行了验证以消除明显不正确的输入(可能是由于攻击或可能只是一个错误),并且已针对给定层以适当的方式对其进行了编码和转义(关于“危险”字符序列的讨论过多) ,'永远不会伤害任何人,'对于SQL来说,它没有正确地转义,当它确实在SQL层时会造成伤害-确保数据正确到达那里所需的工作与避免被利用相同。是与代码外部内容进行可靠通信的层。例如,是否使用未经检查的输入来构造URI-如果没有,则可以将一些更常用的System.Net和System.XML方法变成漏洞。


7

使用任何类型的不安全代码都可能导致指针等问题。Microsoft在此处提供了有关不安全代码的很好的文章:http : //msdn.microsoft.com/zh-cn/library/aa288474(VS.71).aspx


2
-1将指针限定为问题...它们是什么问题?
jachguate 2010年

它们是不安全的,如果使用不当,很明显它们会被利用,因此它们可能是一个问题,爱因斯坦是否不知道这是一个问题?
kyndigs 2010年

如果使用不当。你的车是不安全的,如果使用不当,菜刀是不安全的,如果使用不当,但他们不是固有的不安全的人谁知道在做,以及如何正确地使用它们。
jachguate 2010年

这就是为什么我在帖子中说“可以导致”……我没有说“将导致”。
kyndigs 2010年

7

Reflection.Emit和CodeDom

编辑

允许使用线程的插件或第三方库会使您的整个应用程序崩溃,除非您将这些库/插件加载到单独的appdomain中。


7

框架的一半可能包含非常可怕的功能。我自己认为这File.WriteAllText()很可怕,因为它可以覆盖当前用户可以访问的任何文件。

解决此问题的另一种方法是如何管理安全性。http://ondotnet.com/pub/a/dotnet/2003/02/18/permissions.html上的文章包含有关.NET安全系统的基本描述,其中System.Security.Permissions命名空间包含所有.NET权限使可用。您也可以在http://msdn.microsoft.com/zh-cn/library/5ba4k1c5.aspx上了解更多信息。

简而言之,.NET允许您限制进程可以拥有的权限,例如,拒绝更改磁盘上数据的方法。然后,您可以检查这些权限,并根据该进程是否具有权限进行操作。


7

即使是简单的字符串比较也可能是一个问题。

如果应用程序基于此String.Compare操作的结果做出信任决定,则可以通过更改CurrentCulture来颠覆该决定的结果

看一下这个例子。很容易错过


3

我已经看到了代码,用户可以在其中为数据库中的函数调用设置名称和参数。然后系统将通过反射执行命名函数,而不检查任何内容...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.