在OWASP Top10中排行第3的漏洞,注入通常是指,将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。以下内容主要介绍SQL注入以及OS注入:
一、SQL注入
1、什么是SQL注入:
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。
2、SQL注入攻击的总体思路:
①寻找到SQL注入的位置。
②判断服务器类型和后台数据库类型。
③针对不同的服务器和数据库特点进行SQL注入攻击。
3、如何防御SQL注入:
①检查变量数据类型和格式:
如果SQL语句是类似where id={$id}这种形式,数据库里所有的id都是数字,那么就应该在SQL被执行前,检查确保变量id是int类型;如果是接受邮箱,那就应该检查并严格确保变量一定是邮箱的格式,其他的类型比如日期、时间等也是一个道理。总结起来:只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式去检查,确保变量是预想的格式,这样很大程度上可以避免SQL注入攻击。
②过滤特殊符号:
对于无法确定固定格式的变量,一定要进行特殊符号过滤或转义处理。
③绑定变量,使用预编译语句:
MySQL的mysqli驱动提供了预编译语句的支持,不同的程序语言,都分别有使用预编译语句的方法
实际上,绑定变量使用预编译语句是预防SQL注入的最佳方式,使用预编译的SQL语句语义不会发生改变,在SQL语句中,变量用问号?表示,黑客即使本事再大,也无法改变SQL语句的结构。
4、预编译语句是什么
通常一条sql在db接收到最终执行完毕返回可以分为三个过程:①词法和语义解析,②优化sql语句,制定执行计划,③执行并返回结果。这种普通语句称作Immediate Statements。
但是很多情况,一条SQL语句可能会反复执行,或者每次执行的时候只有个别的值不同(比如query的where子句值不同,update的set子句值不同,insert的values值不同)。
如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。
所谓预编译语句就是将这类语句中的值用占位符替代,可以视为将sql语句模板化或者说参数化,一般称这类语句叫Prepared Statements或者Parameterized Statements。
预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止sql注入。
二、OS注入
1、什么是OS注入:
OS 命令注入(也称为 shell 注入)是一种 Web 安全漏洞,允许攻击者在运行应用程序的服务器上执行任意操作系统 (OS) 命令,并且通常会完全破坏应用程序及其所有数据。通常,攻击者可以利用操作系统命令注入漏洞来破坏托管基础架构的其他部分,利用信任关系将攻击转向组织内的其他系统。
2、OS注入攻击的危害:
OS命令注入中,攻击者可以执行未经授权的命令,然后可以使用这些命令来禁用软件,或者读取和修改攻击者无权直接访问的数据。由于目标应用程序直接执行命令而不是攻击者,因此任何恶意活动似乎都来自应用程序或应用程序的所有者,所以危害比较严重。
3、如何防御OS注入:
①要用最小权限去运行程序,不要给予程序多余的权限,最好只允许在特定的路径下运行,可以通过明确的路径运行命令。
②尽可能使用库或框架:使用不允许此弱点出现的经过审核的库或框架,或提供更容易避免此弱点的构造。尽可能地使用库调用,而不是调用外部进程来完成所需功能。
③减少被攻击面:对于那些被用于生成待执行命令的数据,尽可能避免其被外部可控的数据污染