Web漏洞之SQL注入
The following article is from 洋洋自语 Author 听风之小猪
SQL注入(英语:SQL injection),也称SQL注入或SQL注码,是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了字符检查,那么这些注入进去的恶意指令就会被数据库误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。
1 、漏洞描述
SQL注入漏洞产生的原因是网站应用程序在编写时未对用户提交至服务器的数据进行合法性校验(类型、长度、业务参数合法性等),同时没有对用户输入数据进行有效地特殊字符过滤,使得用户的输入直接带入数据库执行,超出了SQL语句原来设计的预期结果,导致了SQL注入漏洞。
2、 常见应用场景
SQL注入漏洞可能出现在一切与数据库交互的地方,比如常见的查询用户信息、查询订单信息等查询处;搜索、筛选、过滤等;更新用户信息、添加备注等。另外,其他日志记录、分析等处也可能出现,比如记录用户登录处,记录用户登录日志处;比如常见的请求头中的字段,UA、XFF(X-Forwarded-For等。
3 、漏洞危害
获取数据库访问权限,甚至获得DBA权限; 获取其他数据库中的数据; 盗取用户的机密信息包括账户、个人私密信息、交易信息等等; 运行各种操作系统命令; 通过构造特殊的数据库查询语句,可操作数据库进入后台并插入木马,以获取整个网站和数据库的控制权限; 篡改、删除网站页面; 数据库所在服务器被攻击从而变为傀儡主机,甚至可能导致局域网(内网)被入侵。
4 、修复建议
4.1 代码层面
4.1.1 输入验证
类型判断:字符型、整型;
长度判断:设置最大长度值;
业务参数合法性判断:比如支付金额不可能为负值这种;
特殊字符过滤:比如',",\,<,>,&,*,;,#,select,from,where,sub,if,union,sleep,and,or等;
验证所有的输入点,包括UA、Cookie以及其他HTTP头;
4.1.2、预编译处理&参数化查询
所有与数据库交互的业务接口均采用参数化查询,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,参数化查询是防御SQL注入的最佳方法,比如:Java中的PreparedStatement,PHP中的PDO等。
4.2 数据库层面
4.2.1 最小权限原则
遵循最小化权限原则,严格限制网站用户的数据库的操作权限,禁止将任何高权限帐户(sa,dba、root等)用于应用程序数据库访问,从而最大限度的减少注入攻击对数据库的危害。
4.2.2 禁用敏感函数
比如MSSQL中,拒绝用户访问敏感的系统存储过程,如xp_dirtree,xp_cmdshell等。
4.2.3 权限控制
限制用户所能够访问的数据库表。
4.2.4 编码统一
网站与数据层的编码统一,建议全部使用UTF-8编码,避免因上下层编码不一致导致一些过滤模型被绕过,比如宽字节注入等。
4.3 其他措施
避免网站异常抛出SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断; 使用通用防注入系统;