网络安全

位置:IT落伍者 >> 网络安全 >> 浏览文章

五种常见的ASP.NET应用程序安全缺陷


发布日期:2022年01月27日
 
五种常见的ASP.NET应用程序安全缺陷

不能盲目相信用户输入

在Web应用开发中开发者最大的失误往往是无条件地信任用户输入假定用户(即使是恶意用户)总是受到浏览器的限制总是通过浏览器和服务器交互从而打开了攻击Web应用的大门实际上黑客们攻击和操作Web网站的工具很多根本不必局限于浏览器从最低级的字符模式的原始界面(例如telnet)到CGI脚本扫描器Web代理Web应用扫描器恶意用户可能采用的攻击模式和手段很多

因此只有严密地验证用户输入的合法性才能有效地抵抗黑客的攻击应用程序可以用多种方法(甚至是验证范围重叠的方法)执行验证例如在认可用户输入之前执行验证确保用户输入只包含合法的字符而且所有输入域的内容长度都没有超过范围(以防范可能出现的缓沖区溢出攻击)在此基础上再执行其他验证确保用户输入的数据不仅合法而且合理必要时不仅可以采取强制性的长度限制策略而且还可以对输入内容按照明确定义的特征集执行验证下面几点建议将帮助你正确验证用户输入数据⑴ 始终对所有的用户输入执行验证且验证必须在一个可靠的平台上进行应当在应用的多个层上进行

⑵ 除了输入输出功能必需的数据之外不要允许其他任何内容

⑶ 设立信任代码基地允许数据进入信任环境之前执行彻底的验证

⑷ 登录数据之前先检查数据类型

⑸ 详尽地定义每一种数据格式例如缓沖区长度整数类型等

⑹ 严格定义合法的用户请求拒绝所有其他请求

⑺ 测试

数据是否满足合法的条件而不是测试不合法的条件这是因为数据不合法的情况很多难以详尽列举

五种常见的ASPNET安全缺陷

下面给出了五个例子阐述如何按照上述建议增强应用程序的安全性这些例子示范了代码中可能出现的缺陷以及它们带来的安全风险如何改写最少的代码来有效地降低攻击风险

篡改参数

◎ 使用ASPNET域验证器

盲目信任用户输入是保障Web应用安全的第一敌人用户输入的主要来源是HTML表单中提交的参数如果不能严格地验证这些参数的合法性就有可能危及服务器的安全

下面的C#代码查询后端SQL Server数据库假设user和password变量的值直接取自用户输入

SqlDataAdapter my_query = new SqlDataAdapter(

SELECT * FROM accounts WHERE acc_user= + user + AND acc_password= + password the_connection);

从表面上看这几行代码毫无问题实际上却可能引来SQL注入式攻击攻击者只要在user输入域中输入OR =就可以顺利登录系统或者只要在查询之后加上适当的调用就可以执行任意Shell命令

; EXEC masterxp_cmdshell(Oshell command here)

■ 风险分析

在编写这几行代码时开发者无意之中作出了这样的假定用户的输入内容只包含正常的数据——合乎人们通常习惯的用户名字密码但不会包含引号之类的特殊字符这正是SQL注入式攻击能够得逞的根本原因黑客们可以借助一些具有特殊含义的字符改变查询的本意进而调用任意函数或过程

■ 解决方案

域验证器是一种让ASPNET开发者对域的值实施限制的机制例如

限制用户输入的域值必须匹配特定的表达式

要防止上述攻击行为得逞第一种办法是禁止引号之类的特殊字符输入第二种办法更严格即限定输入域的内容必须属于某个合法字符的集合例如[azAZ]*

篡改参数之二

◎ 避免验证操作的漏洞

然而仅仅为每个输入域引入验证器还不能防范所有通过修改参数实施的攻击在执行数值范围检查之时还要指定正确的数据类型

也就是说在使用ASPNET的范围检查控件时应当根据输入域要求的数据类型指定适当的Type属性因为Type的默认值是String

<! 要求输入值必须是之间的数字

<asp:RangeValidator MinimumValue= MaximumValue= />

■ 风险分析

由于没有指定Type属性值上面的代码将假定输入值的类型是String因此RangeValidator验证器只能确保字符串由之间的字符开始abcd也会被认可

■ 解决方案

要确保输入值确实是整数正确的办法是将Type属性指定为Integer

<! 要求输入值必须是之间的数字

<asp:RangeValidator MinimumValue=

MaximumValue= Type=Integer

信息洩漏

◎ 让隐藏域更加安全

在ASPNET应用中几乎所有HTML页面的__VIEWSTATE隐藏域中都可以找到有关应用的信息由于__VIEWSTATE是BASE 编码的所以常常被忽略但黑客可以方便地解码BASE 数据用不着花什么力气就可以得到__VIEWSTATE提供的详细资料

■ 风险分析

默认情况下__VIEWSTATE数据将包含

⑴ 来自页面控件的动态数据

⑵ 开发者在ViewState中显式保存的数据

⑶ 上述数据的密码签字

■ 解决方案

设置EnableViewStatMAC=true启用__VIEWSTATE数据加密功能然后将machineKey验证类型设置成DES要求ASPNET用Triple DES对称加密算法加密ViewState数据

SQL注入式攻击

◎ 使用SQL参数API

正如前文篡改参数部分描述的攻击者可以在输入域中插入特殊字符改变SQL查询的本意欺骗数据库服务器执行恶意的查询

■ 风险分析

恶意查询有可能获取后端数据库保存的任何信息例如客户信用卡号码的清单

■ 解决方案

除了前面介绍的办法——用程序代码确保输入内容只包含有效字符另一种更加健壮的办法是使用SQL参数API(例如ADONET提供的API)让编程环境的底层API(而不是程序员)来构造查询

使用这些API时开发者或者提供一个查询模板或者提供一个存储过程然后指定一系列的参数值由底层API将参数值嵌入到查询模板然后将构造出来的查询提交给服务器查询这种办法的好处是确保参数能够正确地嵌入例如系统将对引号进行转义处理从根本上杜绝SQL注入式攻击的发生同时在表单中引号仍是一个允许输入的有效字符这也是使用底层API的一个优点

按照这种思路修改前文篡改参数部分的例子结果如下

SqlDataAdapter my_query = new SqlDataAdapter(SELECT * FROM accounts

WHERE acc_user= @user AND acc_password=@pass the_connection);

SqlParameter userParam = my_querySelect_CommandParametersAdd(

@userSqlDbVarChar);

userParamValue=user;

SqlParameter passwordParam = my_querySelect_CommandParametersAdd(

@SqlDbVarChar);

passwordParamValue=password;

跨站脚本执行

◎ 对外发的数据进行编码

跨站脚本执行(Crosssite scripting)是指将恶意的用户输入嵌入到应答(HTML)页面例如下面的ASPNET页面虽然简单却包含着一个重大的安全缺陷

<%@ Page Language=vb %>

<asp:Label id=Label runat=server

标签文字

</asp:Label>

<form method=post runat=server ID=Form

请在此处输入反馈信息<br>

<asp:Textbox ID=feedback runat=server/><br>

<asp:Button id=cmdSubmit runat=server

Text=提交! OnClick=do_feedback

</asp:Button>

</form>

<script runat=server

Sub do_feedback(sender As Object e As SystemEventArgs)

LabelText=feedbackText

End Sub

</script>

■ 风险分析

攻击者可以用JavaScript代码构造一个恶意的查询点击链接时JavaScript就会运行举例来说脚本可以通过下面的用户输入来嵌入

<script>alert(okie)

</script>

■ 解决方案

在一个双层的安全体系中对HTML页面中出现的外发用户数据执行输入验证和HTML编码确保浏览器只把用户输入数据当成纯粹的文本而不是其他具有特殊含义的内容例如HTML代码JavaScript脚本

对于本例只要加入一个HtmlEncode调用即可

LabelText=ServerHtmlEncode(feedbackText)

这样应答HTML流将包含用户输入内容的HTML编码版本也就是说浏览器不会执行用户输入的JavaScript代码因为根本不存在HTML的<SCRIPT>标记用户输入的字符已经被替换成HTML编码版本

使用自动安全测试工具

由于客户需求不断变化一些单位平均每三个月就要部署新的应用同时由于人员流动所以对开发者快速开发健壮的高质量的代码寄予很高的期望虽然对所有开发者进行代码安全技术的培训是十分必要的但不可否认自动检测代码安全漏洞的工具也有助于快速开发安全的应用程序

到目前为止开发者常用的工具只能涵盖功能测试的特定方面例如性能测试BUG/故障点侦查人工检查代码有着许多与生俱来的局限而且要求开发者具有丰富的代码安全经验所以对于编写高质量的应用来说面向应用程序安全及其在恶意环境下行为的工具也是十分关键的

要迅速提高应用的质量和安全性最有效的办法是给开发者提供一个自动测试应用的工具如果在单元测试期间工具能够检测出应用的安全缺陷并将修补建议嵌入到代码之中

开发者就能立即找出代码中存在的错误不仅方便了现有错误的修改而且也有助于避免将来再犯同样的错误不断地提高代码抗御攻击的能力

结束语Web服务应用正在爆炸式增长越来越多的应用被推出到防火墙之外安全性脆弱的Web应用面临的风险也只会有增无减同时为了在紧迫的时限之前快速完成应用开发开发者面临的压力也越来越大注重编写代码时的安全问题同时投入必要的资源这样才能为未来的Web服务应用做好准备同时确保当前应用的高质量只有从应用的出生之日开始就采取正确的措施来确保其安全性才能构造出高质量安全的应用

               

上一篇:用CNG加密文件的简单方法

下一篇:asp.net中的validaterequest属性与安全性