一、写在前面
作为一名安全人员,SQL注入是我们必不可少的利器,下面我们一起来学习SQL注入
二、参考文献
SQL注入攻击与防御,也可以说是本书的学习笔记三、正文
(一)SQL注入简介
SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。
也就是说,SQL注入是一种利用数据库驱动的Web应用所固有的特性(用户输入的参数将会直接输送到Web应用架构的逻辑层上),以及Web应用开发人员对用户输入的参数没有进行严格的审查所引发的漏洞的攻击。
理解上面一点:这是一种由当前数据库驱动的Web应用架构所决定的特性,不改变架构则该特性一直存在。因此安全人员需要做的就是对用户输入的参数进行详细的考虑和处理,避免出现SQL注入漏洞。
(二)SQL注入的方式
1.直接将代码插入到参数中
这些参数会被置入SQL命令中加以执行
2.将恶意代码插入到字符串中
此后这些数据将会保存到数据库的数据表中或被当作元数据,当将存储的字符串置入动态SQL命令时,恶意代码就将被执行
(三)SQL注入的产生过程
为什么SQL注入会出现,它是如何产生的?
1.构造动态字符串
这是一种编程技术,允许开发人员在运行过程中动态构造SQL语句。动态的SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL语句
下面的PHP代码展示了这一技术
$query=”SELECT *FROM table WHERE field =’$_GET[“input”]’”;
Query=”SELECT *FROM table WHERE field = ‘ “ + request.getParameter (“input”)+”’”;
在这里,并未对输入的参数进行验证或编码,因此可引发严重的SQL注入。
我们对该技术的几种常见代码审查错误进行一下分析
①转义字符处理不当
在SQL数据库中,单引号字符(')解析成代码与数据间的分界线。因此我们只需简单地在URL的字段中输入一个单引号,就能快速识别出Web站点是否会收到SQL注入攻击。
可以看到,我们在ID后加入了一个’后,服务器返回了错误的信息,仔细一看后我们据此可以判断该站点存在SQL注入漏洞,服务器并没有对单引号进行任何的处理。
如果服务器没有返回错误信息或返回了统一错误信息,我们就要继续深入分析了。总而言之,先用单引号试一试服务器的反应。
②类型处理不当
从上面可以看到,单引号注入是很常见的一个漏洞。但我们的SQL注入不止于此,并不是对单引号进行了处理,转义,编码就可以万事大吉了,我们还有双引号,通道符|等等一些转义字符可以利用,而且这里所说的类型处理不当便是一种不需要单引号即可实施的注入
MYSQL提供了一个名为LOAD_FILE的函数,能够读取文件并将文件内容作为字符串返回。
如果我们使用 1 UNION ALL SELECT LOAD_FILE(‘/etc/passwd’)—这一语句进行注入,我们便不需要使用单引号字符来进行转义查询
③查询集处理不当
有时候需要使用动态的SQL语句对木屑复杂的应用进行编码,因为在程序开发阶段可能还不知道要查询的表或字段(或此时还不存在)。
比如在一个数据库中,用户可以选择他能选择的一系列数据进行查看,如本月工作明细,日工资,当月效能图等等,在他能选择的范围内不包括password,user等等一系列敏感数据表。
如果开发人员不对该请求进行处理而相信其数据的话,那么攻击者可以通过嗅探工具,操纵HTTP请求,用password,user等字段替换应用产生的列名,从而获取系统中数据库的用户名和口令。
④错误处理不当
在第一点的时候已经有所提及,错误处理不当会给Web站点带来许多安全方面的问题。
最常见的问题是将详细的内部错误消息(如数据库转储,错误代码)等显示给用户或攻击者,这些信息会泄露从来都不应该显示的实现上的细节,这些细节会为攻击者提供与网站潜在缺陷相关的重要线索。
⑤多个提交处理不当
在大型的Web开发项目会出现这样的问题,对于某些输入进行了验证而对于某些输入又没有进行验证,这在大型项目中十分常见,因为你不能避免独立工作的情况出现,也很难保证项目中每个人都严格遵循相同的标准。因而这就产生了一些难以避免的小漏洞,而这些漏洞会产生严重的后果。这也给我们安全从业人员一些提示,在进行渗透测试时一定要全面。
2.不安全的数据库配置
默认的数据库系统管理员账号密码:SQL Server的“sa”,MYSQL的“root”和“anonymous”,Oracle的“SYS”,“SYSTEM”,“DBSNMP”,“OUTLN”等等
而在一些数据库中,会允许以特权系统用户账号身份执行操作。我们应该始终以普通用户身份运行服务器,以便在·1数据库遭到成功攻击后可以减少对操作系统和其他进程的潜在破坏。
另外,权限分离也是必须的,它可以有效防止攻击者访问数据库中的所有数据,并且拥有SELECT、INSERT、UPDATE、DELETE、EXECUTE等权限,这些过高的权限通常允许攻击者在数据库间跳转,访问超出程序数据存储区的数据。