11月17, 2017

WEB三大攻击之—SQL注入攻击与防护

SQL注入的定义与诱因

定义

SQL攻击(英语:SQL injection),简称注入攻击,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。

只要是支持批处理SQL指令的数据库服务器,都有可能受到此种手法的攻击。

诱因

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

  • 在应用程序中使用字符串联结方式组合SQL指令。
  • 在应用程序链接数据库时使用权限过大的账户(例如很多开发人员都喜欢用最高权限的系统管理员账户(如常见的root,sa等)连接数据库)。
  • 在数据库中开放了不必要但权力过大的功能(例如在Microsoft SQL Server数据库中的xp_cmdshell延伸预存程序或是OLE Automation预存程序等)
  • 太过于信任用户所输入的数据,未限制输入的字符数,以及未对用户输入的数据做潜在指令的检查。

下面的GIF展示的是SQL注入的示意:

sql-injection

代码解释

假设某个网站的登录验证的SQL查询代码为

SELECT * FROM `user` WHERE (username = 'username') and (password = 'password');

如果恶意将username和password传入的值设置为:

username = '1' OR '1'='1';
password = '1' OR '1'='1';

即为:

SELECT * FROM user WHERE (username = '1' OR '1'='1') and (password = '1' OR '1'='1');

由于OR 1=1 总是为真(true),原SQL语句等同于:

SELECT * FROM user;

SQL注入的危害与防护

危害

  1. 数据表中的数据外泄,例如个人机密数据,账户数据,密码等。
  2. 数据结构被黑客探知,得以做进一步攻击(例如SELECT * FROM sys.tables)。
  3. 数据库服务器被攻击,系统管理员账户被窜改(例如ALTER LOGIN sa WITH PASSWORD='xxxxxx')。
  4. 获取系统较高权限后,有可能得以在网页加入恶意链接、恶意代码以及XSS等。
  5. 经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如xp_cmdshell "net stop iisadmin"可停止服务器的IIS服务)。
  6. 破坏硬盘数据,瘫痪全系统(例如xp_cmdshell "FORMAT C:")。

防护

  1. 在设计应用程序时,完全使用参数化查询(Parameterized Query)来设计数据访问功能。
  2. 在组合SQL字符串时,先针对所传入的参数作字符取代(将单引号字符取代为连续2个单引号字符)。
  3. 使用其他更安全的方式连接SQL数据库。例如已修正过SQL注入问题的数据库连接组件。
  4. 使用SQL防注入框架开发。

参考资料

本文链接:https://www.daguanren.cc/post/sql-injection.html

-- EOF --

大官人捐赠
大官人微信 大官人支付宝

Comments