SQL注入详解一

本文详细介绍了SQL注入的概念、原理、判断方法、手工注入流程以及不同提交方式,旨在帮助初学者理解和应对Web安全中的这一常见威胁。
摘要由CSDN通过智能技术生成

梦想是直播带货的网安人突发奇想(痴心妄想)通过博客增加曝光度,由此写下了这篇。

作为Web渗透的重要知识点——SQL注入,了解它对于接下来的网安学习至关重要。第一次写博客,难免有些紧张,失误之处请见谅!也希望通过写博客来记录我的网安成长之路,与博友们一起学习进步!

后续会持续更新,请大家多多关注!

目录

一.SQL注入原理

二.SQL注入位置

三.SQL注入点判断

1.引号测试 

2.and 测试

四.SQL手工注入流程

1.找到注入点

2.猜解列数(order by)

3.判断回显点(union)

4.执行对应的SQL语句

(1)数据库名

(2)表名

(3)列名

(4)查询具体数据

五.SQL注入之提交方式

1.get提交

2.post提交

3.cookie提交

六.SQL注入之数据类型

1.数字型

2.字符型

3.搜索型

4.xx型

5.Json型


一.SQL注入原理

        web应用程序对客户端提交的数据没有进行严格的判断或者过滤不严,攻击者可以在提交的参数结尾添加额外的SQL语句发送至服务端,服务端连接数据库,导致数据库执行非授权的任意查询甚至危险的系统命令。

二.SQL注入位置

        前端页面提交的数据若参与到后端数据库,则该地方则可能存在注入点。例如:注册,登录,留言版,评论区等。

三.SQL注入点判断

1.引号测试 

在提交的数据后面加 ' 或 " 号,如果报错,则存在注入点,原因是数据库接收了你提交的完整数据并拼接了SQL语句,但由于你引号的加入导致SQL语句语法错误。

select * from user where username='vince'';//报错
select * from user where username="vince"";//报错

2.and 测试

and表示两个条件均为真时,才有结果。and 1=1 时显示查询结果,and 1=2时没有显示查询结果,则存在注入点。

select * from user where id=1 and 1=1;
select * from user where id=1 and 1=2;

简而言之,我们需要确定的是我们添加的SQL语句是否被传输进去并拼接成新的SQL语句进行执行,如果是,则该点存在注入点。

四.SQL手工注入流程

注:这里以sqli-labs-master靶场为例!

1.找到注入点

2.猜解列数(order by)

通过 order by + 数字来看是否有报错,以此确定列数。 

select * from user where id=1 order by 3;

select * from user where id=1 order by 4;

由图可知,order by 3 时没有报错,order by 4 时报错,因此,列数为3。

3.判断回显点(union)

通过 union select 1,2,..,n (n为列数)

select * from user where id=-1 union select 1,2,3;//写id=-1是为了把回显点展示出来 

由图可知,2,3均为回显点。

4.执行对应的SQL语句

(1)数据库名
select database();

(2)表名
select group_concat(table_name) from information_schema.tables where table_scheam='security';
//group_concat():将多行数据通过一行展示
//information_schema:MySql数据库服务器里的一个数据库
//information_schema里的tables表保存了该数据库服务器里的所有表名

(3)列名
select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users';
//information_schema里的columns表保存了该数据库服务器里所有表的列名

(4)查询具体数据
select group_concat(username) from users;
//由于表名,列名均获取到了,所以可以直接查询

五.SQL注入之提交方式

注:这里用到Burp Suite工具,是在SQL注入中一个特别重要的抓包工具。

1.get提交

数据直接在URL上显示

2.post提交

数据不直接显示

3.cookie提交

通过cookie往后台提交数据,后台取出cookie中的数据,如果直接和数据库打交道,那么就是一个注入点。

六.SQL注入之数据类型

这里以pikachu-master靶场为例!

1.数字型

请求携带的数据是数字,则叫做数字型注入。

我们查看源代码可以发现,它对于输入的id没有进行任何处理,并直接拼接到查询语句中和后端数据库打交道。

用 or 1=1 试探,查出所有数据。

2.字符型

请求携带的数据是字符串类型,则叫做字符型注入。

我们用万能的 or 1=1,发现查不到任何数据。

查看源代码,这里传递的是字符串类型,因此要考虑引号闭合情况。

很显然,刚刚我们传递的 or 1=1 一起被当作用户名的一部分进行查询了,所以查不到任何数据。

我们加上引号闭合前面字符串,用注释符注释掉后面多余的引号,即可得出结果。

select id,email from member where username ='vince' or 1=1#'

3.搜索型

其实就是模糊式搜索,不需要输入完整的数据,通过部分相同的数据匹配,可以查询若干个结果。

查看源代码,这里则需要闭合%,引号。

拼接出来的SQL语句如下。

select username,id,email from member where username like '%vin%' or 1=1#%'

4.xx型

查看源代码,发现SQL语句竟然多了一对(),这显然不同于我们经常看到的SQL语句,但其实这在数据库服务器里是可执行的,并不会出现语法错误。

像这种特殊的写法,我们统称为XX型。

对于注入,闭合()即可。

select id,email from member where username=('vince')#')

5.Json型

Json 是存储和交换文本信息的语法,是轻量级的文本数据交换格式。类似XML,但 Json 比 XML 更小,更快,更易解析,主要是用来代替XML的。所以现在接口数据传输都采用Json方式进行。Json文本的MIME 类型是 "application/json"。

Json数据类型主要用于前后端分离中作为第三方数据格式进行传输。

//Json数据格式
key:value
1.数字
{"age":18}
2.字符串
{"name":"vince"}
3.布尔值
{"flag":true}
4.null
{"flag":null}
3.对象(在大括号中书写)
{"age":18,"name":"vince"}
4.数组(在中括号中书写)
[{"name":"vince"},{"age":18}]
//说明:1.属性名必须使用双引号
//     2.数据由逗号分隔,最后一个不能加逗号

 注入格式:

json={"age":18 or 1=1},即在对应的value值后面添加对应的SQL语句。

以上,为SQL注入的一些知识点,大家有什么问题也可以在评论区讨论,希望对大家有所帮助!(家人们,第一次写,新手保护期,轻点喷)

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值