一、SQL注入原理
大部分网站采用B/S架构,B/S架构的全称为Browser/Server,即浏览器/服务器结构。B/S架构有三层,
分别为:
第一层表现层:主要完成用户和后台的交互及最终查询结果的输出功能。
第二层逻辑层:主要是利用服务器完成客户端的应用逻辑功能。
第三层数据层:主要是接受客户端请求后独立进行各种运算。
当我们访问动态网页时,就会从业务逻辑层向数据访问层发送数据库查询语句,此时我们便可以构造特殊的查询语句实现对数据的非法访问。
二、如何判断是否存在SQL注入漏洞
通常情况下,可能存在SQL漏洞注入的网址可能形如www.xxxx.com/xxx.php?id=x
一种原始的判断方法可以加上一个单引号,id=1' 如果页面返回错误,则存在 Sql 注入。 原因是无论字符型还是整型都会因为单引号个数不匹配而报错。 (如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入)
然后便可以判断注入类型了
注入类型分为两种:数字型和字符型
数字型
当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下: select * from <表名> where id = x 这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:
Url 地址中输入 http://xxx/xxx.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
Url 地址中继续输入 http://xxx/xxx.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。
原因如下: 当输入 and 1=1时,后台执行 Sql 语句:
select * from <表名> where id = x and 1=1
没有语法错误且逻辑判断为正确,所以返回正常。
当输入 and 1=2时,后台执行 Sql 语句:
select * from <表名> where id = x and 1=2
没有语法错误但是逻辑判断为假,所以返回错误。 我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:
select * from <表名> where id = 'x and 1=1'
select * from <表名> where id = 'x and 1=2'
查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。
字符型
当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下: select * from <表名> where id = ‘x’ 这种类型我们同样可以使用 and ‘1’=’1 和 and ‘1’=’2来判断:
Url 地址中输入 http://xxx/abc.php?id= x’ and ‘1’=’1 页面运行正常,继续进行下一步。
Url 地址中继续输入 http://xxx/abc.php?id= x’ and ‘1’=’2 页面运行错误,则说明此 Sql 注入为字符型注入。
原因如下: 当输入 and ‘1’=’1时,后台执行 Sql 语句:
select * from <表名> where id = 'x' and '1'='1'
语法正确,逻辑判断正确,所以返回正确。
当输入 and ‘1’=’2时,后台执行 Sql 语句:
select * from <表名> where id = 'x' and '1'='2'
语法正确,但逻辑判断错误,所以返回正确。我们同样可以使用假设法来验证。
三、如何进行SQL注入
通过以上分析,我们了解了什么是SQL注入,所以,我们现在便可以通过构造出SQL语句来访问数据库中的数据。
在有回显的情况下,便可以使用基本SQL语句来访问数据库,例如select * from XXX, (常用表名如user,admin等等)
可以借助工具如sqlmap等等
SQL注入工具已经较为完善,便捷实用,这里不再赘述。
本人刚接触信息安全行业不久,第一次写博客,如有错误,烦请指正。