【安全】渗透攻防之SQL注入攻击

摘要:在安全领域,SQL注入是永不过时的黑客技术。黑客中的“白帽子”和”黑帽子”是两个完全对立的群体。对于黑帽子而言,他们只要找到系统的一个切入点就可以达到入侵破坏的目的,而白帽子必须将自己系统所有可能被突破的地方都设防,以保证系统的安全运行。这看起来好像是不公平的,但是安全世界里的规则就是这样。本文在重点阐述了SQL注入的原理和攻击过程的基础上,从服务器层面、数据库层面、PHP脚本语言层面以及编程安全角度重点分析了SQL注入的防御方法,以便更好地保护我们自己的网站系统。

引言

TalkTalk的信息泄漏事件导致约15万人的敏感信息被暴露,涉嫌造成这一事件的其中一名黑客使用的并不是很新的技术。

事实上,该技术的「年纪」比这名15岁黑客还要大两岁。

这项技术就是大名鼎鼎的SQL注入,它曾经被用来窃取世界卫生组织员工的信息,偷过华尔街日报数据,甚至还攻击过美国联邦政府机构。

如果你没有被这张图片震撼到,说明你离黑客的道路暂时还很遥远。

这是一张相当有技术含量的号牌遮挡,其对交警系统SQL Injection的hack䅁例。

当摄像头拍到你车牌号并把其转成文本后,插入数据库时的SQL注入。

在交警系统数据没有备份的情况下,我想此时,你应该知道后果有多严重。

定义

SQL(Structured Query Language): SQL是一种用来和数据库交互的语言文本。

SQL注入(SQL Injection):攻击者把SQL命令插入到Web表单的输入域或页面请求的字符串,欺骗服务器执行恶意的SQL命令。

上图是Xkcd上的一幅漫画。该学生的姓名:

Robert'); DROP TABLE students;--'

最终结果会导致students表被删除。

注入原理

攻击者通过Web应用程序利用SQL语句或字符串将非法的数据插入到服务器端数据库中,获取数据库的管理用户权限,然后将数据库管理用户权限提升至操作系统管理用户权限,控制服务器操作系统,获取重要信息及机密文件。

SQL注入漏洞攻击主要是通过借助于HDSI、NBSI和Domain等SQL注入漏洞扫描工具扫描出Web页面中存在的SQL注入漏洞,从而定位SQL注入点,通过执行非法的SQL语句或字符串达到入侵者想要的操作。

攻击过程

SQL注入漏洞的判断

SQL注入可以说是一种漏洞,也可以说是一种攻击。

当程序中的变量处理不当,没有对用户提交的数据类型进行校验,编写不安全的代码,构造非法的SQL语句或字符串,都可能产生这个漏洞。

一般来说,SQL注入一般存在于形如:

https://wwxiong.com/test.php?id=1

等带有参数的PHP动态网页中。

有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。

总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。

如果一个优秀的开发工程师在编程的时候没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。

分析数据库服务器类型

由于SQL注入漏洞攻击利用的是通用的SQL语法,使得这种攻击具有广泛性。

理论上说,对于所有基于SQL语言的数据库管理系统都是有效的,包括MSSQLServer、Oracle、DB2、Sybase、Access和MySQL等。

当然,各种系统自身的SQL扩展功能会有所不同,因此最终的攻击代码可能不尽相同。

一般来说,ACCESS与SQL-SERVER是最常用的数据库服务器,尽管它们都支持T-SQL标准,但还有不同之处,而且不同的数据库有不同的攻击方法,必须要区别对待。

模拟攻击

假设某个Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码。

登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数,例如:

$query = 'SELECT * from Users WHERE login = ' . $username . ' AND password = ' . $password;

攻击者在用户名输入框中输入:

' or '1'='1

攻击者在密码输入框中输入:

' or '1'='1'

用户输入的内容提交给服务器之后,服务器运行上面的代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成:

SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1';

服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比。

由于SQL命令实际上已被注入式攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。

如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询,他就会尝试输入某些特殊的SQL字符串篡改查询改变其原来的功能,欺骗系统授予访问权限。

系统环境不同,攻击者可能造成的损害也不同,这主要由应用访问数据库的安全权限决定。

如果用户的帐户具有管理员或其他比较高级的权限,攻击者就可能对数据库的表执行各种他想要做的操作,包括添加、删除或更新数据,甚至可能直接删除表。

防范

WEB服务器安全

正确的配置WEB服务器可以降低SQL注入发生风险,从以下六方面来实现WEB服务器的安全配置:

① 修改服务器初始配置
② 及时安装服务器安全补丁
③ 关闭服务器的错误提示信息
④ 配置目录权限
⑤ 删除危险的服务器组件
⑥ 及时分析系统日志

数据库安全

正确的数据库安全配置同样也是降低SQL注入风险的方法之一,主要从以下几个方面进行配置:

① 修改数据库初始配置
② 及时升级数据库
③ 最小权力法则

脚本语言配置

对于PHP编程语言,在php.ini文件中可以配置一些涉及安全性的设置,通过这些设置可以增加SQL的注入难度,降低SQL注入风险。主要的从以下几个方面设置:
① 开启magic_quotes_gpc魔术函数

magic_quotes_gpc = On

作用:判断解析用户提示的数据,如包括有POST、GET、COOKIE过来的数据增加转义字符"\",以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。
② 关闭PHP中注册为全局变量配置

register_globals = Off 

register_globals的意思是注册为全局变量,所以当On的时候,传递过来的值会被直接的注册为全局变量直接使用,而Off的时候,我们需要到特定的数组里去得到它。

当 register_globals打开以后,各种变量都被注入代码,例如来自HTML表单的请求变量。再加上PHP在使用变量之前是无需进行初始化的,这就使得更容易写出不安全的代码。

③ 开启PHP安全模式

safe_mode = On

④ 将用户可操作的文件限制在某目录下

open_basedir = On

使用open_basedir可以限制程序可操作的目录和文件,提高系统安全性。但会影响I/O性能导致系统执行变慢,因此需要根据具体需求,在安全与性能上做平衡。

⑤ 关闭错误提示

display_errors = Off

安全编程角度

作为一个优秀的服务端的开发人员,当你在开发代码的时候你必须时刻保持安全意识。

因为当你在服务器上放任何涉及钱的东西时,就有可能会有人尝试破解它。

SQL注入攻击实质上是构造畸形的SQL语句,通过WEB应用程序送达数据库系统执行的。

但凡有SQL注入漏洞的程序,都是因为程序要接受来自客户端用户输入的变量或URL传递的参数,并且这个变量或参数是组成SQL语句的一部分。

因此,对于用户输入的内容或传递的参数,我们应该要时刻保持警惕,这是安全领域里的「外部数据不可信任」的原则。

纵观Web安全领域的各种攻击方式,大多数都是因为开发者违反了这个原则而导致的,所以自然能想到的,就是从变量的检测、过滤、验证下手,确保变量是开发者所预想的。

① 检查变量数据类型和格式

如果你的SQL语句是类似where id={$id}这种形式,数据库里所有的id都是数字,那么就应该在SQL被执行前,检查确保变量id是int类型;

如果是接受邮箱,那就应该检查并严格确保变量一定是邮箱的格式,其他的类型比如日期、时间等也是一个道理。

总结起来:只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL注入攻击。

② 过滤特殊字符
如果WEB应用程序对用户输入的参数进行过滤,使得参数构造的SQL语句不能送达数据库系统执行,这样就降低SQL注入攻击的风险。

主要是从一下几个方面进行过滤:

a. 整形参数过滤
b. 简单的字符和数字组合参数验证
c. 包含特殊字符的参数的处理
d. 限制用户参数长度

③ 绑定变量,使用预编译语句
绑定变量使用预编译语句是预防SQL注入的最佳方式,使用预编译的SQL语句语义不会发生改变,在SQL语句中,变量用问号?表示,黑客即使本事再大,也无法改变SQL语句的结构。

小结

① 不要随意开启生产环境中Webserver的错误显示。
② 永远不要信任来自用户端的变量输入,有固定格式的变量一定要严格检查对应的格式,没有固定格式的变量需要对引号等特殊字符进行必要的过滤转义。
③ 使用预编译绑定变量的SQL语句。
④ 做好数据库帐号权限管理。
⑤ 严格加密处理用户的机密信息。

参考文章

PHP安全之Web攻击

维基百科-SQL注入攻击

实验8:PHP/MySQL注入

PHP 安全编程建议

SQL注入攻击技巧与防范

相关推荐

微信扫一扫,分享到朋友圈

【安全】渗透攻防之SQL注入攻击
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close