SQL注入实验详细过程及讲解

一、SQL注入简介

SQL 注入攻击是通过将恶意的SQL查询或添加语句插入到应用的输入参数中,再在后台SQL服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。

二、Web 程序三层架构

三层架构(3-tier architecture) 通常意义上就是将整个业务应用划分为:

  • 界面层(User Interface layer)

  • 业务逻辑层(Business Logic Layer)

  • 数据访问层(Data access layer)

区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构被应用于众多类型的软件开发。

2.2、数据库 Web三层架构

由于数据库驱动的Web应用程序依从三层架构的思想也分为三层:

  • 表示层。

  • 业务逻辑层(又称领域层)

  • 数据访问层(又称存储层)

三、SQL注入漏洞详解

3.2SQL注入产生的原因及威胁:

刚刚讲过当我们访问动态网页时, Web 服务器会向数据访问层发起SQL查询请求,如果权限验证通过就会执行SQL语句。
这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造SQL语句,如果用户输入的数据被构造成恶意SQL代码,Web 应用又未对动态构造的 SQL语句使用的参数进行审查,则会带来意想不到的危险。

    SQL注入带来的威胁主要有以下几点:

  • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
  • 绕过认证,列如绕过验证登录网站后台。
  • 注入可以借助数据库的存储过程进行提权等操作。

四、SQL注入示例一、 猜解数据库通

过一个实例,让你更加清楚的理解 SQL注入猜解数据库是如何发生的。

这里要说明一点:切记注入实验要在环境下进行,不能对国内网站进行SQL注入,不然警察叔叔会找上门,所以要注意,以防触碰法律。

使用DVWA渗透测试平台,作为攻击测试的目标:

 在用户标识输入“1”进行,查看回显 (用户标识=1,说明php页面通过get方法传递参数):

 点击查看源码,这里我们可以看到SQL注入源

 其中的SQL查询代码为:

 

 可以看到,实际执行的SQL语句为:

SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;'

这条语句的意思是查询users表中user_id为1的数据并按第一字段排行。

由此可知,users表中只有两个字段,数据为两列。

接下来我们使用 union select联合查询继续获取信息。
union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。
   输入1' union select database(),user()#进行查询 :

  • database()将会返回当前网站所使用的数据库名字。
  • user()将会返回执行当前查询的用户名。

其实实际执行的SQL语句是 :

SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#`;

 

通过上图返回信息,我们成功获取到:

  • 当前网站使用数据库为 dvwa 。
  • 当前执行查询用户名为 root@localhost 。

同理我们再输入 1' union select version(),@@version_compile_os#进行查询:

  • version() 获取当前数据库版本.
  • @@version_compile_os 获取当前操作系统。
SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`;

通过上图返回信息,我们又成功获取到:

  • 当前数据库版本为 : 5.6.31-0ubuntu0.15.10.1.
  • 当前操作系统为 : debian-linux-gnu

接下来我们尝试获取 dvwa 数据库中的表名。
information_schema 是 mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。

我们输入1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#进行查询:
 

SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#`;

 

dvwa 数据库有两个数据表,分别是 guestbook 和 users 

如果不满足于获取信息,接下来我们可以尝试获取账号、密码。

users表的字段为 user 和 password ,所以输入:1' union select user,password from users#进行查询:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;

可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到http://www.cmd5.com进行解密。现在应该已经对SQL注入有所了解了吧,也清楚了SQL注入的强大之处了吧?所以,正如我前面所说,要注意实验归试验,但不要触犯法律。

4.2SQL注入示例二、绕过验证

利用SQL漏洞绕过登录验证的实例

使用事先编写好的页面,这是一个普通的登录页面,只要输入正确的用户名和密码就能登录成功。

 发现登入不进去,可以发现从错误页面中我们无法获取到任何信息。

当查询到数据表中存在同时满足 username 和 password 字段时,会返回登录成功。
按照第一个实例的思路,我们尝试在用户名中输入 123' or 1=1 #, 密码同样输入 123' or 1=1 # :

 为什么能够成功登陆呢?因为实际执行的语句是:

select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'

按照 Mysql 语法,# 后面的内容会被忽略,所以以上语句等同于(实际上密码框里不输入任何东西也一样):

select * from users where username='123' or 1=1 

由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。
我们再尝试不使用 # 屏蔽单引号,采用手动闭合的方式:
我们尝试在用户名中输入 123' or '1'='1, 密码同样输入 123' or '1'='1 (不能少了单引号,否则会有语法错误)

实际执行的SQL语句是:

select * from users where username='123' or '1'='1' and password='123' or '1'='1

两个 or 语句使 and 前后两个判断永远恒等于真,所以能够成功登录。

还有很多其他 Mysql 语句可以巧妙的绕过验证,可以发散自己的思维进行尝试。

猜你喜欢

转载自blog.csdn.net/2302_78587828/article/details/132270522