这个问题类似于可利用的PHP函数。
受污染的数据来自用户,或更具体地说是攻击者。当受污染的变量到达接收器函数时,您将遇到漏洞。例如,执行sql查询的函数是一个接收器,而GET / POST变量是污点的来源。
C#中所有接收器功能是什么?我正在寻找引入漏洞或软件漏洞的功能。我对远程执行代码漏洞特别感兴趣。是否有整个类/库在功能上包含黑客想要影响的讨厌的东西?人们如何意外制作危险的C#代码?
Answers:
在基于Web的方面,C#(更常见的是ASP.NET)通常容易受到以下漏洞的影响(OWASP Top 10 2013列出的项目)。我知道您主要对接收器功能感兴趣,但其中有一些内容,但是您确实询问了人们是如何意外制作危险的C#代码的,因此希望在此提供一些见解。
通过字符串连接生成查询。
var sql = "SELECT * FROM UserAccount WHERE Username = '" + username "'";
SqlCommand command = new SqlCommand(sql , connection);
SqlDataReader reader = command.ExecuteReader();
这通常可以通过参数化查询来解决,但是,如果您使用的是IN
条件,则当前没有字符串连接是不可能的。
代码如
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
默认的“表单身份验证签出”方法不会更新服务器端的任何内容,从而允许继续使用捕获的身份验证令牌。
调用SignOut方法只会删除表单身份验证cookie。Web服务器不存储有效的和过期的身份验证票证以供以后比较。如果恶意用户获得有效的表单身份验证cookie,这会使您的站点容易受到重放攻击。
甲会话固定如果一个用户已经使用漏洞可能存在会话状态以用于认证。
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>
MVC模型绑定可以允许将添加到POST数据的参数映射到数据模型上。这可能是无意发生的,因为开发人员尚未意识到恶意用户可以通过这种方式修改参数。该Bind
属性可用于防止这种情况。
有许多配置选项可以削弱应用程序的安全性。例如,设置customErrors
为On
或启用跟踪。
诸如ASafaWeb的扫描仪可以检查这种常见的错误配置。
ASP.NET中默认的密码哈希方法有时不是最好的方法。
在集成管道模式下,.NET可以看到每个请求,并且句柄可以授权每个请求,甚至可以访问非.NET资源(例如.js
,图像)。但是,如果应用程序以经典模式运行,则.NET仅会看到对文件的请求,例如,.aspx
因此其他文件可能会意外地不安全。有关差异的更多详细信息,请参见此答案。
例如www.example.com/images/private_photograph_user1.jpg
,尽管有一些解决方法,但在以经典模式运行的应用程序中,它更容易受到攻击。
尽管由于要求攻击者伪造“视图状态”和“事件验证”值,传统的Web表单应用程序通常更安全地抵御CSRF ,但除非开发人员手动实施了防伪令牌,否则更新的MVC应用程序可能会很容易受到攻击。请注意,我并不是说Web表单不是易受攻击的,只是简单地传递一些基本参数会更加困难-尽管有一些修复,例如将用户密钥集成到“视图状态”值中。
当EnableEventValidation属性设置为true时,ASP.NET验证控件事件源自该控件所呈现的用户界面。控件在呈现期间注册其事件,然后在回发或回调处理期间验证事件。例如,如果在呈现页面时列表控件包括编号为1、2或3的选项,并且如果收到指定选项号为4的回发请求,则ASP.NET会引发异常。默认情况下,ASP.NET中所有事件驱动的控件都使用此功能。
[EnableEventValidation]功能降低了未经授权或恶意的回发请求和回调的风险。强烈建议您不要禁用事件验证。
添加代码如
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类别是:
其中我想不出C#/ ASP.NET特有的任何东西。如果有任何疑问(如果您认为与您的问题相关),我将更新我的答案。
任何使用正则表达式的东西(尤其是RegularExpressionValidator)。要查看此信息,请使用正则表达式运行RegularExpressionValidator,^(\d+)+$
并为其提供30位数字和一个字母字符进行验证。
一些帖子:
这就是所谓的“正则表达式拒绝服务”攻击,它可能使网站瘫痪。
Process.Start
是第一个想到的。
我敢肯定,WindowsIdentity
其中许多System.Security
也可以用于邪恶。
当然,有SQL注入攻击,但我认为这不是您的意思(尽管可以通过SQL Server进行远程执行)。
除了Process.Start()
已经提到的显而易见的内容外,我还可以看到几种潜在的间接利用方式。
CreateProcess()
然后调用。Assembly.Load()
和其他此类重载的动态程序集加载机制。如果某个受损的程序集将其安装到系统中并加载。这就是现在想到的全部。
IMO:nr 1的可利用功能看上去很无辜,但是如果不加考虑就非常危险。
在ASP.NetResponse.Write
或快捷方式中:
<%= searchTermFromUser %>
在ADO.Net中:
string
+
操作:var sql = "SELECT * FROM table WHERE name = '" + searchTermFromUser + "'"
您从用户(或任何其他外部来源)获取并传递给另一个系统或另一个用户的任何数据都是潜在的利用。
如果您从用户那里得到一个字符串并在不使用HtmlEncode的情况下将其显示给另一个用户,则可能是一个利用。
如果您从用户那里得到一个字符串并用它来构造SQL,则可能是SQL注入。
如果您从用户那里得到一个字符串,并用它来为Process.Start或Assembly.Load压缩文件名,则它是一个远程执行漏洞
您明白了,危险来自使用未经处理的数据,如果您从未未经消毒就将用户输入传递给外部系统(例如:HtmlEncode)或使用注入安全接口(例如:SQL参数),则相对安全-就在您一分钟之内忘了清理某些东西,最无辜的方法可能会变成安全漏洞。
注意:Cookies,html标头和通过网络传递的其他任何内容也是来自用户的数据,在大多数情况下,即使数据库中的数据也是来自用户的数据。
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方法变成漏洞。
使用任何类型的不安全代码都可能导致指针等问题。Microsoft在此处提供了有关不安全代码的很好的文章:http : //msdn.microsoft.com/zh-cn/library/aa288474(VS.71).aspx
框架的一半可能包含非常可怕的功能。我自己认为这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允许您限制进程可以拥有的权限,例如,拒绝更改磁盘上数据的方法。然后,您可以检查这些权限,并根据该进程是否具有权限进行操作。