纷繁复杂的计算机世界说到底还是为人服务,并最终由人来操纵。如果以“原子”般的视角来观察人对计算机的操纵方式,展现出来的无非是两个方面——数据,以及操作这些数据的指令。当数据和指令都是事先预设好的,各司其职,则天下太平——人们通过指令将输入的数据进行处理,获得期望的结果后通过特定的渠道输出。
但随着IT技术的飞速发展,“计算机”的形态多种多样(大型服务器、PC机、智能终端等等,以及运行其上的形形色色的应用),不同角色的人在计算机系统中所扮演的角色各异(开发者、维护者、高级用户、普通用户、管理者等等)。这些场景中,数据甚至指令通常都无法事先固化,需要在运行的过程中动态输入。如果这两者混杂在一块,没有经过良好的组织,就会被黑客加以利用,成为一种典型的攻击方式——命令注入。
命令注入攻击的常见模式为:仅仅需要输入数据的场合,却伴随着数据同时输入了恶意代码,而装载数据的系统对此并未设计良好的过滤过程,导致恶意代码也一并执行,最终导致信息泄露或者正常数据的破坏。其中最常见的一类攻击行为就是针对数据库系统的SQL(结构化查询语言)注入。常见的SQL语句构成为:对符合特定条件的数据(某些行的某些列)实施增、删、改、查等操作。其中需要符合的条件就是所谓“数据”(如学生数据表中性别为女,或年龄大于10岁等),对这些数据的选取以及实施的某种操作就是“指令”。成功的SQL注入攻击就在于,在输入数据的时候混杂了其它SQL子句,最终拼接成的SQL语句语法是正确的(数据库系统对此毫无防备)并得到执行。
SQL注入等命令注入攻击会造成严重的危害,包括:
1、信息泄露,例如数据库存放的账户、密码等个人机密数据泄露,并且数据结构可能为黑客知晓并进行进一步攻击。
2、信息泄露,例如数据库存放的账户、密码等个人机密数据泄露,并且数据结构可能为黑客知晓并进行进一步攻击。
3、利用数据库服务器提供的操作系统命令接口,控制整个系统。
从上面SQL注入攻击的场景分析来看,对SQL攻击(以及其它命令注入模式的攻击)的防范可以从两个方面着手:
1、应用系统将指令和数据良好隔离,当数据传输到系统中即便其中混杂了恶意指令,数据和恶意指令也会被一并视作“数据”,至多造成异常数据不被正确执行,而避免了恶意攻击。
2、对输入的数据进行过滤,如果其中混杂着恶意执行则丢弃。
新的注入方式会不断出现,过滤方式也要随之更新,有可能会有滞后。因此方案2可以过滤常见的命令注入,但指令和数据的良好隔离才是解决命令注入的根本之道。