您的位置:首页 > 数据库

认识sql注入

2018-12-21 21:00 176 查看

SQL注入
简介:

SQL攻击(SQL injection),简称为注入攻击,是发生于应用程序数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。
简单的说,所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。例如:如果用户在用户名文本框中输入 ’ or ‘1’ = ‘1’ or ‘1’ = ‘1,则验证的SQL语句变成: select * from student where username=” or ‘1’ = ‘1’ or ‘1’ = ‘1’ and password=”;SQL语句的where条件永远是成立的,所以验证永远是有效的。
SQL注入过程:

这里写图片描述
作用原理

SQL命令可查询、插入、更新、删除等,命令的串接。而以分号字符为不同命令的区别。(原本的作用是用于SubQuery或作为查询、插入、更新、删除……等的条件式)
SQL命令对于传入的字符串参数是用单引号字符所包起来。《但连续2个单引号字元,在SQL资料库中,则视为字串中的一个单引号字元》
SQL命令中,可以注入注解《连续2个减号字元 – 后的文字为注解,或“/”与“/”所包起来的文字为注解》
因此,如果在组合SQL的命令字符串时,未针对单引号字符作替换处理的话,将导致该字符变量在填入命令字符串时,被恶意窜改原本的SQL语法的作用。

SQL 注入的主要形式:

直接将代码插入到与 SQL 命令串联在一起并使其得以执行的用户输入变量。
间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串。在存储的字符串随后串连到一个动态 SQL 命令中时,将执行该恶意代码。

注入的两个条件:

用户能够控制输入;
程序要执行的代码拼接了用户输入的数据。

常见注入方式:

转义字符处理不当:
这里写图片描述
类型处理不当:
这里写图片描述
查询语句组装不当
这里写图片描述
错误处理不当
这里写图片描述
多个提交处理不当
这里写图片描述
这里写图片描述

常见的风险:

在应用程序中若有下列状况,就有可能应用程序正暴露在SQL Injection的高风险情况下:

  • 在应用程序中使用字符串联结方式组合SQL指令。

  • 在应用程序链接数据库时使用权限过大的账户(例如很多开发人员都喜欢用最高权限的系统管理员账户(如常见的root,sa等)连接数据库)。

  • 在数据库中开放了不必要但权力过大的功能(例如在Microsoft SQL Server数据库中的xp_cmdshell延伸预存程序或是OLE Automation预存程序等)

  • 太过于信任用户所输入的数据,未限制输入的字符数,以及未对用户输入的数据做潜在指令的检查。
    可能造成的损失:

    数据表中的数据外泄,例如个人机密数据,账户数据,密码等。

    数据结构被黑客探知,得以做进一步攻击(例如SELECT * FROM sys.tables)。

    数据库服务器被攻击,系统管理员账户被窜改(例如ALTER LOGIN sa WITH PASSWORD=’xxxxxx’)。
    获取系统较高权限后,有可能得以在网页加入恶意链接、恶意代码以及XSS等。
    经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如xp_cmdshell “net stop iisadmin”可停止服务器的IIS服务)。
    破坏硬盘数据,瘫痪全系统(例如xp_cmdshell “FORMAT C:”)。

避免的方法:

在设计应用程序时,完全使用参数化查询(Parameterized Query)来设计数据访问功能。
在组合SQL字符串时,先针对所传入的参数作字符替换(将单引号字符替换为连续2个单引号字符)。如果使用PHP开发网页程序的话,可以打开PHP的魔术引号(Magic quote)功能(自动将所有的网页传入参数,将单引号字符替换为连续2个单引号字符)。
其他,使用其他更安全的方式连接SQL数据库。例如已修正过SQL注入问题的数据库连接组件,例如ASP.NET的SqlDataSource对象或是 LINQ to SQL。
更换危险字符,如果可能,拒绝包含以下字符的输入:
这里写图片描述
验证所有输入,例如限制用户输入的长度,限制用户输入的取值范围,测试输入的大小和数据类型,强制执行适当的限制。这有助于防止有意造成的缓冲区溢出。。
为当前应用建立权限比较小的数据库用户,这样不会导致数据库管理员丢失。
把数据库操作封装成一个Service,对于敏感数据,对于每个客户端的IP,在一定时间内每次只返回一条记录。这样可以避免被拖库。
使用SQL防注入系统。

常见问题:

如果web站点禁止输入单引号字符,是否可以避免SQL注入?
答:不能,可以使用多种方法对单引号字符进行编码,这样就能将它作为输入来接收,有些SQL注入漏洞不需要使用该字符,但应号不是唯一能用于SQL注入的字符,攻击者还可以使用其他字符,如双竖线(||)和双引号(“).
选择的语言能否避免SQL注入?
答:不能,任何编程语言,只要再将输入传递到动态创建的SQL语句之前未经历验证,就容易受到潜在的攻击,除非使用参数化查询和绑定变量。

参考

作者:ClaireKe
来源:CSDN
原文:https://www.geek-share.com/detail/2672331962.html
版权声明:本文为博主原创文章,转载请附上博文链接!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: