梦想是直播带货的网安人突发奇想(痴心妄想)通过博客增加曝光度,由此写下了这篇。
作为Web渗透的重要知识点——SQL注入,了解它对于接下来的网安学习至关重要。第一次写博客,难免有些紧张,失误之处请见谅!也希望通过写博客来记录我的网安成长之路,与博友们一起学习进步!
后续会持续更新,请大家多多关注!
目录
一.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注入的一些知识点,大家有什么问题也可以在评论区讨论,希望对大家有所帮助!(家人们,第一次写,新手保护期,轻点喷)