所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将SQL命令注入到后台数据库引擎执行的能力,比如先前的很多影视网站泄露VIP会员密码大多就是通过Web表单递交查询字符曝出的,这类表单特别容易受到SQL注入攻击。对照OWASP 2013报告,在最新发布的OWASP 2017报告中,SQL注入依然是排名第一的Web威胁(见图4-8)。
图4-8 OWASP 2017 TOP10网站威胁
当应用程序直接使用输入内容来构造动态SQL语句以访问数据库时,会发生SQL注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生SQL注入。SQL注入可能导致攻击者使用应用程序登录并在数据库中执行命令。相关的SQL注入可以通过测试工具sqlmap进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态SQL命令,或者作为存储过程的输入参数,这些表单特别容易受到SQL注入攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是SQL注入就发生了。
SQL注入虽然是个古老的攻击方式,但是直到现在依然是互联网安全的一大威胁,由SQL注入导致的拖库、远程控制依然困扰着各大互联网公司,如图4-9所示。
图4-9 乌云2016年SQL注入漏洞列表举例