攻:
1. 获取数据库的结构信息:
攻击者要成功实施一次攻击,需要了解哪个表和列可用。SQL Server默认的行为是,当不正确查询运行时返回错误消息。例如攻击者输入用户名:“'having 1=1;--”,数据库将返回包含表名和代码查询中第一列的错误消息;而group by语句可以更进一步确定查询中的列:“'group by 表名.列名 having 1=1;--”,数据库将返回查询中的下一列;攻击者可以继续附加group by语句,直到不再收到错误消息。
2. 获取数据库内容信息:
攻击者可以利用变换错误消息,获取数据库中存储的数据,例如输入用户名:“'union select min(username),1 from Users where username>1;--”,数据库将返回表中的第一个用户名。攻击者可以使用同样的SQL注入,用password代替username得到用户账户的密码,以此类推,可以获取数据库表中的每条记录。
3. 修改数据库和内容:
攻击者通过“';”来结束一条查询语句,然后附加破坏性的SQL语句,例如:“';delete from Accounts”或“';insert into Users (……)”。
4. 缩短查询条件:
攻击者通过缩短查询条件来绕过身份认证过程,例如输入用户名“admin'--”或“' or a==a--”
防:
客户端的任何输入(字段,查询字串参数,Cookie等)都是不安全的,虽然Asp.Net提供了一些验证控件,但这些控件都是生成客户端脚本在客户端进行校验,虽然使用这些控件可以减少页面的住返次数,改善用户体验,但是不要仅仅依赖于此,因为黑客可以很容易避过客户端脚本。
1. 过滤或转义危险字符:string.Replace("'","''")或正则;
通常我们要定义合法字符,再检查输入是不是在合法字符范围之内;而不是校验是否包含危险字符,因为非法的情况太多了,很容易漏掉。过滤是一种不理想的构思,因为“危险的”字符可能是用户输入的有效部分。另外,攻击者可以使用ASCII十六进制字符和其他字符来通过验证,例如用0x2C来代替单引号(')。
2. 参数化SQL查询或存储过程:
SqlParameter可以提供类型和长度检查,并自动转义用户输入。
3. 使用最小特权:
将数据库用户能执行的动作限制到最少,绝对不要使用sa账户,因为sa具有操作数据库的所有权限。
4. 在服务器上处理错误:
成功的SQL注入攻击不一定导致错误;导致错误的SQL注入通常是攻击者正在收集数据库信息,是攻击的前兆。在try..catch..finally中处理错误;<compilation debug="false"/>;<customErrors mode="RemoteOnly"/>。
一般综合运用这些方法...
Stop SQL Injection Attacks Before They Stop You
新型SQL截断攻击和防御方法
SQL注入技术和跨站脚本攻击的检测
在ASP.NET中防止注入攻击