缺陷标题 testfire网站→登录页面→登录框有SQL注入攻击问题。
测试平台与浏览器 Windows 7+IE 9或Firefox。
测试步骤
(1)用IE浏览器打开网站http://demo.testfire.net。
(2)打开登录页面。
(3)在Username文本框中输入'or'1'='1,在Password文本框中输入'or'1'='1,如图1-1所示。
(4)单击Login按钮。
(5)查看结果页面。
期望结果 页面显示拒绝登录的信息。
图1-1 输入SQL注入攻击语句段
实际结果 以管理员身份成功登录,如图1-2所示。
图1-2 以管理员身份成功登录
SQL注入已经多年排在Web安全攻击第一位,对系统的破坏性很大。如果一个系统的整个数据库内容都被窃取,那么信息社会中最重要的数据就一览无遗了。所谓SQL注入攻击,就是攻击者把SQL命令插入Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入攻击。
SQL注入是从正常的WWW端口访问,而且表面看起来和一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报。以ASP.NET网站为例,如果管理员没有查看IIS日志的习惯,可能被入侵很长时间都不会发觉。SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,攻击者能够根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据。
常见的SQL注入攻击过程如下。
(1)某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个用户名和密码。
(2)登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数。下面是ASP.NET应用构造查询的一个例子。
(3)攻击者在用户名和密码文本框中输入'or'1'='1。
(4)用户输入的内容提交给服务器之后,服务器运行上面的ASP.NET代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成SELECT*from Users WHERE login="or'1'='1'AND password="or'1'='1'。
(5)服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比,但是遇到'1'='1',这是永真的条件,所以数据库系统就会有返回信息。
(6)由于SQL命令实际上已被注入攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。
如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询,他就会尝试输入某些特殊的SQL字符串篡改查询,改变其原来的功能,欺骗系统授予访问权限。
SQL注入攻击成功的危害:如果用户的账户具有管理员或其他比较高级的权限,攻击者就可能对数据库中的表执行各种他想要做的操作,包括添加、删除或更新数据,甚至可能直接删除表。一旦攻击者能操作数据库层,那就没有什么内容得不到了。