• 推荐
  • 评论
  • 收藏

SQL注入攻击详解 - 常见的Web攻击方法

2020-06-11    8730次浏览

目录

  • SQL注入攻击简介
    • 什么是SQL注入攻击?
    • SQL注入攻击原理
    • SQL注入攻击可以做什么?
    • SQL注入攻击分类
  • SQL注入攻击实操
  • SQL注入攻击防御方法

SQL注入攻击简介

1、什么是SQL注入攻击?

SQL注入(SQLi)是一种注入攻击,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。
2、SQL注入攻击分类
SQL注入攻击可以通过多种方式执行。在选择特定攻击方法之前,攻击者可能会观察系统的行为。

2.1、带内注入

这是典型的攻击,攻击者可以通过相同的通信通道发起攻击并获得结果。一般是通过两种带内技术完成的:
  • 基于错误的SQL注入:从显示的错误消息中获取有关数据库的信息
  • 基于联合的SQL注入:依赖于攻击者能够将UNION ALL被盗信息的结果与合法结果连接起来。
这两种技术都依赖于攻击者修改应用程序发送的SQL,以及浏览器中显示的错误和返回的信息。如果应用程序开发人员或数据库开发人员无法正确地参数化他们在查询中使用的值,那么它会成功。两者都是试错法,可以检测到错误。
2.2、盲注入(根据线索进行深入)
盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。也称为推理SQL注入,盲注入攻击不会直接从目标数据库中显示数据;相反,攻击者会仔细检查行为中的间接线索。HTTP响应中的详细信息,某些用户输入的空白数据以及数据库响应某些用户输入需要多长时间,这些都可以是线索,具体取决于攻击者的目标。
2.3、带外注入(通过其他途径来注入)
带外通道攻击主要是利用其他协议或者渠道从服务器提取数据. 它可能是HTTP(S)请求,DNS解析服务,SMB服务,Mail服务等。这种攻击有点复杂,当攻击者无法在单个直接查询中响应攻击中实现其目标时,攻击者可能会使用此攻击。通常,攻击者会制作SQL语句,这些语句在呈现给数据库时会触发数据库系统创建与攻击者控制的外部服务器的连接。以这种方式,攻击者可以收集数据或可能控制数据库的行为。
二阶注入就是一种带外注入攻击。在这种情况下,攻击者将提供SQL注入,该注入将由数据库系统的单独行为存储和执行。当二级系统行为发生时(它可能类似于基于时间的作业或由其他典型管理员或用户使用数据库触发的某些事情)并且执行攻击者的SQL注入,那就是当“伸出”到系统时攻击者控制发生了。
 
3、SQL注入工作原理
为什么会存在sql注入呢,只能说SQL出身不好。因为sql作为一种解释型语言,在运行时是由一个运行时组件解释语言代码并执行其中包含的指令的语言。基于这种执行方式,产生了一系列叫做代码注入(code injection)的漏洞 。它的数据其实是由程序员编写的代码和用户提交的数据共同组成的。程序员在web开发时,没有过滤敏感字符,绑定变量,导致攻击者可以通过sql灵活多变的语法,构造精心巧妙的语句,不择手段,达成目的,或者通过系统报错,返回对自己有用的信息。
4、SQL注入攻击可以做什么?
SQL注入漏洞可能会影响使用SQL数据库(如MySQL,Oracle,SQL Server或其他)的任何网站或Web应用程序。犯罪分子可能会利用它来未经授权访问用户的敏感数据:客户信息,个人数据,商业机密,知识产权等。SQL注入攻击是最古老,最流行,最危险的Web应用程序漏洞之一。
 

SQL注入攻击实操

1、利用注释符号破解用户登录
在用户名输入框中输入:' or 1=1#,密码随便输入,这时候的后台程序如果没有过滤,则合成后的SQL查询语句为:
select * from users where username='' or 1=1#' and password=''
语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价: 
select * from users where username='' or 1=1#' and password=''
等价于
select * from users where usrername='' or 1=1
因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:
select * from users
没错,该sql语句的作用是检索users表中的所有字段
 
2、在已知用户名的情况下破解用户登录
在用户名输入框中输入:admin'#,密码随便输入,这时候的后台程序如果没有过滤,则合成后的SQL查询语句为:
select * from users where username='admin'#' and password=''
等价于
select * from users where username='admin'
这样即可不能输入密码登入上去的。数据库就会错认为不用用户名既可以登入,绕过后台的验证,已到达注入的目的。同样利用了SQL语法的漏洞。
 

SQL注入攻击防御方法

1、不要使用动态SQL:避免将用户提供的输入直接放入SQL语句中;最好使用准备好的语句和参数化查询,这样更安全。

2、不要将敏感数据保留在纯文本中:加密存储在数据库中的私有/机密数据;这样可以提供了另一级保护,以防攻击者成功地排查出敏感数据。

3、限制数据库权限和特权:将数据库用户的功能设置为最低要求;这将限制攻击者在设法获取访问权限时可以执行的操作。

4、避免直接向用户显示数据库错误:攻击者可以使用这些错误消息来获取有关数据库的信息。

5、对访问数据库的Web应用程序使用Web应用程序防火墙(WAF):这为面向Web的应用程序提供了保护,它可以帮助识别SQL注入尝试;根据设置,它还可以帮助防止SQL注入尝试到达应用程序(以及数据库)。

6、定期测试与数据库交互的Web应用程序:这样做可以帮助捕获可能允许SQL注入的新错误或回归。

7、将数据库更新为最新的可用修补程序:这可以防止攻击者利用旧版本中存在的已知弱点/错误。