SQL注入漏洞产生的原因是网站应用程序在编写时未对用户提交至服务器的数据进行合法性校验(类型、长度、业务参数合法性等),同时没有对用户输入数据进行有效地特殊字符过滤,使得用户的输入直接带入数据库执行,超出了SQL语句原来设计的预期结果,导致了SQL注入漏洞。
简单点说,就是服务端未对用户的输入进行过滤和验证,导致恶意的sql语句直接与后端sql查询语句进行,造成了非本意的查询结果并且回显到页面上,最终导致数据库敏感信息泄露等。
SQL 注入漏洞的核心原理在于攻击者能够将恶意的 SQL 代码注入到应用程序的 SQL 查询语句中,从而执行未经授权的数据库操作
SQL注入漏洞可能出现在一切与数据库交互的地方,比如常见的查询用户信息、查询订单信息等查询处;搜索、筛选、过滤等;更新用户信息、添加备注等。另外,其他日志记录、分析等处也可能出现,比如记录用户登录处,记录用户登录日志处;比如常见的请求头中的字段,UA、XFF等。
判断是否存在注入,若存在,则判断是字符型还是数字型,简单来说就是数字型不需要符号包裹,而字符型需要
数字型:select * from table where id =$id
字符型:select * from table where id='$id'
判断类型一般可以使用 and 型结合永真式和永假式,判断数字型:
1 and 1=1 #永真式 select * from table where id=1 and 1=1
1 and 1=2 #永假式 select * from table where id=1 and 1=2
#若永假式运行错误,则说明此SQL注入为数字型注入
判断字符型:
1' and '1'='1
1' and '1'='2
#若永假式运行错误,则说明此SQL注入为字符型注入
然后通过order by来查字段个数,判断字段个数之后查找显示位,然后开始爆破库名、表名、字段名、详细内容等等,这里就先不详细写了。
SQL 注入的另外一个重要知识点,也就是注释的使用(可以确认有没有其他闭合字符),MySQL 提供了以下三种注释方法:
SQL 注入漏洞的风险等级通常为高危。因为攻击者可以通过利用此漏洞来执行各种数据库操作,包括获取敏感数据、修改数据库内容、执行系统命令等,从而造成严重的安全问题。
获取数据库访问权限,甚至获得DBA权限;
Sql 注入带来的威胁主要有如下几点
验证 SQL 注入漏洞的存在通常涉及尝试在输入框中输入恶意的 SQL 代码,并观察应用程序的响应是否发生异常。如果应用程序返回了与预期不符的结果,可能存在 SQL 注入漏洞。
如在url中存在?id=1类似的字眼,可以尝试改为1+1或添加单双引号,改变数值来看页面是否会发生变化。
攻击者可以构造恶意的sql语句来查询一些敏感的数据库和表内容,导致用户信息泄露。
类型判断:字符型、整型;
长度判断:设置最大长度值;
业务参数合法性判断:比如支付金额不可能为负值这种;
特殊字符过滤:比如',",\,<,>,&,*,;,#,select,from,where,sub,if,union,sleep,and,or等;
验证所有的输入点,包括UA、Cookie以及其他HTTP头;
所有与数据库交互的业务接口均采用参数化查询,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,参数化查询是防御SQL注入的最佳方法,比如:Java中的PreparedStatement,PHP中的PDO等。
遵循最小化权限原则,严格限制网站用户的数据库的操作权限,禁止将任何高权限帐户(sa,dba、root等)用于应用程序数据库访问,从而最大限度的减少注入攻击对数据库的危害。
比如MSSQL中,拒绝用户访问敏感的系统存储过程,如xp_dirtree,xp_cmdshell等。
限制用户所能够访问的数据库表。
网站与数据层的编码统一,建议全部使用UTF-8编码,避免因上下层编码不一致导致一些过滤模型被绕过,比如宽字节注入等。