SQL注入漏洞是Web端非常危险的一种漏洞,也是长期霸占Web漏洞榜单前几的漏洞类型,我相信许多网络安全初学者,大部分都是从了解SQL注入漏洞开始的,而且第一次获得目标站点管理权限,大部分也都是通过利用SQL注入漏洞来获取的,可见SQL注入的危害性有多大,今天我们就来说一说SQL注入漏洞的基础知识,初步了解一下SQL注入漏洞的原理。
什么是SQL注入?
SQL注入攻击指的是通过构建特殊的输入作为参数,插入到Web表单的输入或者页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。而这些输入大都是SQL注入语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作。用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数。
为什么会出现SQL注入?
不当的字符处理
SQL数据库将单引号解析成了代码与数据库的分割线,单引号外面的内容均是需要执行的代码。将用户输入直接传递给动态创建的SQL语句,单引号字符会被解析成字符串分隔符,并作为代码与字符的分界。处理数字数据时,不需要使用单引号将数字数据引起来。
不安全的数据库配置
SQL Server经常使用“sa”作为数据库管理员,MySQL经常使用“root”作为数据库管理员,Oracle在创建数据库时会创建SYS、SYSTEM、OUTLN等账户。一些默认的账户采用默认的口令进行登录。当Web应用采用的是最高权限用户时,拥有所有权限,可以对当前数据库引擎中所有的数据库进行操作。
不合理的查询处理
在进行数据库操作时,用户的输入没有经过严格的过滤,用户可以自己构造SQL语句,采用拼接、注释等方式构造SQL语句来执行自己的语句。
不当的错误处理
导致错误的处理不当,最常见的原因是将详细的内部错误消息展示给用户或者攻击者。一些错误信息为攻击者提供网站缺陷或者相关的线索。开发和服务器配置时导致错误直接回显。
常见SQL语句
SQL(Structured Query Language)结构化的查询语言,是关系型数据库 通讯的标准语言。
查询:SELECT statement FROM table WHERE condition;
删除记录:DELETE FROM table WHERE condition;
更新记录:UPDATE table SET field=value WHERE condtion;
添加记录:INSERT INTO table field VALUES(values)。
SQL注入分类
数字型注入点
假设我们网站的 SQL 查询的语句是这样:
SELECT * FROM news WHERE id=$id
这里的“$id”是用户提交的,当我们输入的是
10 and 1=1
语句就变成了这样:
SELECT * FROM news WHERE id=10 and 1=1
数字型参数是不需要用单引号引起来的,假设“id=10”存在,那么这个 SQL 语句 and 左边是返回成功的,右边是恒成立的,所以整体返回就是成功。
如果将and右边换成“1=2”,那么就返回不成功,我们可以用这种方法测试站点是否存在数字型注入点,因为我们输入的内容被后台执行了,如果换成更加复杂的SQL语句,就可以在未授权的情况下执行更多SQL语句操作。
字符型注入点
假设我们网站的 SQL 语句是这样的:
SELECT * FROM news WHERE name='$name'
注意我们输入的参数被单引号引起来,所以我们构造参数时就需要考虑单引号了,当我们构造输入为
admin' and '1'='1
语句就变成了:
SELECT * FROM news WHERE name='admin' and '1'='1'
发现没有语句闭合了,同样如果“admin”存在,那么and左右两边是成立的,所以返回成功,如果将右边换成'1'='2',那么就会返回失败,同样也可以验证是否存在字符型注入点。
搜索型注入点
假设我们的 SQL 查询语句是这样的:
SELECT * FROM news WHERE keyword like '%$keyword%'
其中“%”是通配符,当我们输入以下语句:
keyword%' and 1=1 and '%'='
最终我们得到的语句是这样的:
SELECT * FROM news WHERE keyword like '%keyword%' and 1=1 and '%'='%'
可见语句也闭合了,如果将“1=1”换成“1=2”就可以验证是否存在搜索型注入点。
内联式注入点
假设我们的网站 SQL 查询语句是这样的:
SELECT * FROM admin WHER username='$name' AND password ='$passwd'
这一看就是个登录页面的代码,我们构造如下语句:
' or ''='
分别提交给“name”和“password”,那么我们就会得到如下语句:
SELECT * FROM admin WHER username='' or ''='' AND password ='word'
SELECT * FROM admin WHER username='name' AND password ='' or ''=''
这里我们要知道一点,就是在 SQL 语句中,AND 的优先级是大于 OR 的, 于是会先计算 AND,然后才会计算OR,所以这里我们的语句会被OR分为两段 SQL语句,第一个语句OR 左边username=''不成立,因为不可能存在用户名为空的情况,右边''=''恒成立,password='word'随便输的密码几乎不可能成立。
同样分析,第二个语句OR左边不成立,右边恒成立,根据OR语法,有一方成立就会返回成功,所以第二句显示登陆成功,就绕过了用户名密码。
终止式注入点
我们还是以
SELECT * FROM admin WHER username='$name' AND password ='$passwd'
不同的是,我们构造
' or ''='' --
我们就可以得到如下的查询语句:
SELECT * FROM admin WHER username='' or ''='' --' AND password ='word'
其中“--”为终止符号,后边的内容不会执行,可以忽略,因此我们的语句可以看成:
SELECT * FROM admin WHER username='' or ''=''
OR左边不成立,但是OR右边恒成立,所以返回成功,我们又绕过了用户名密码成功登陆。
以上就是我们今天介绍的SQL注入的一些基础知识,为了加深大家对SQL注入的理解,我会在以后文章中介绍一些手工注入的知识,这样会帮助大家更好的理解SQL注入是如何窃取网站后台数据库信息的,欢迎大家关注@科技兴了解更多科技尤其是网络安全方面的知识。