领先技术: 子类化和重写ASP.NET页面 - 第II部分
字符串长度并不难,不管是通过 HTTP 模块还是通过有限地修改代码,都是可以实现的。
原始解决方案 发现 SQL 注入漏洞后,客户认为将可接受参数的大小限制为五个字符(即代码的实际大小)就能快捷有效地解决问题。仅有五个可用的字符,黑客是奈何不了您的数据库– 至少希望是这样的。因此,客户安装了“领先技术”2007 年 3 月刊中演示的 HTTP 模块,并检查了受影响页面的查询字符串大小。结果发现实际发送到页面的字符未超过五个。 但是,该应用程序组合了新的 ASP.NET 页面和经过修改的经典 ASP 页面,其中某些页面能够允许用户在文本框内键入并提交相同的代码。而在服务器上,指定的代码会在回发过程中通过前述的相同方法附加到 SQL 语句中。因此,通过文本框提交的文本长度也需要进行同样的限制。开发人员原以为这是个简单的问题,因此将文本框的 MaxLength 属性设置为所需的值: <asp:textbox runat=”server” id=”TextBox1” MaxLength=”5” /> 修复过的问题看上去万无一失。长度超过五个字符的代码无法进入站点的中间层。但这并不一定意味着站点处于可避免注入的安全状态,但这种做法确实限制了遭受攻击的可能性。或者说他们是这么认为的。 模拟一次很简单的攻击 假设有一个类似于图 1 所示的 ASP.NET 示例页面。页面的源代码如图 2 所示。该页面具有一个 MaxLength 属性为 5 的文本框和一个提交按钮。单击按钮后,会执行回发操作并对文本框的内容进行处理。正常情况下,在浏览器中显示页面的位置是无法键入五个以上的字符的。如果您尝试粘贴更长的文本字符串,字符串将被相应地截断为指定长度。 Figure 2 示例 ASP.NET 页的源代码 ASPX <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html > <head runat="server"> <title>Max Length</title> </head> <body> <form id="form1" runat="server"> <div> <h3>Try specifying more than 5 characters</h3> <asp:TextBox ID="TextBox1" MaxLength="5" runat="server"></asp:TextBox><br /> <asp:Button ID="Button1" runat="server" Text="Click" /> </div> </form> </body> </html> 代码隐藏 Partial Class _Default : Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load TextBox1.Focus() End Sub Protected Sub Button1_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button1.Click Response.Write("<b>Processing text: </b>" & TextBox1.Text & "<b> </b><hr/>") End Sub End Class 图 1 ASP.NET 示例页面 现在我们从攻击者的角度考虑这个问题。对网页进行攻击通常需要先创建格式为 Plain HTML 的页面副本,然后改变某些值并发布“破坏”版的页面。要获得页面的 HTML,恶意用户只需向普通用户那样显示页面:选择“ |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |