当前位置:

SQL注入_insert和amp;delete和amp;update和amp;selete

访客 2024-01-05 1141 0

一.SQL注入介绍

1.1sql注入概念

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

1.1.2sql注入产生的条件

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

1.2sql注入注入点判断

1.2.1判断是否存在可控变量

  • 抓包判断

如图所示,id=1与submit=查询都是外部传递变量

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

  • 功能判断

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

1.2.3判断过滤是否严谨

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

1.2.4判断闭合与功能实现

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

二.insert注入

2.1insert注入场景

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

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

2.2insert注入

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

2.1.2insert布尔盲注使用函数

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.3insert布尔盲注实列

(1)查看功能

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

(3)制作payload

正常注册sql语句:insertintotablename(username,password,sex,phonenum,email,add)values('test',123456,'男','13371689786','广东深圳')注入注册sql语句:insertintotablename(username,password,sex,phonenum,email,add)values('test',123456,'男','13371689786*',(select1where1=1))---)*','广东深圳')

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

(4)测试payloa

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

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

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

三.delete注入

3.1delete注入场景

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

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

3.2delete注入

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

3.2.2delete注入常用函数

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.3delete布尔盲注实列

(1)查看功能

(2)输入传递值并抓包查看

(3)构造payload

正常删除sql语句:deletefromtablenamewhereid=334

注入删除sql语句:deletefromtablenamewhereid=334and1=1---

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

(4)测试payload

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

四.update注入

3.1update注入场景

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

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

3.2update注入

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

3.2.2update注入常用函数

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.3update布尔盲注实列

(1)查看功能

(2)输入传递值并抓包查看

(3)制作payload

正常修改sql语句:updatetablenamesetsex='test2',phonenum='test3',email='test1'whereusername='test1'注入修改sql语句:updatetablenamesetsex='test2',phonenum='test3',email='test1'whereusername='test1'and1=1---'whereusername='test1'

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

(4)测试payload


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

五.selete注入

5.1selete注入场景

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

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

5.2selete注入

5.2.1union函数介绍

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

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

5.2.3selete注入常用函数

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

5.2.4selete注入实列

(1)查看功能

此功能是根据用户userid展示出用户用户名与邮箱
其功能sql语句:selectusername,mailfromuserswhereuserid=$id;

(2)查看请求包外部传参

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

(3)构造测试payload

正常查询sql语句:selectusername,mailfromuserswhereuserid=1limit0,1注入查询sql语句:selectusername,mailfromuserswhereuserid=1and1=1limit0,1

(4)测试payload

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

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

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

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

第二行进行升序排列正常执行

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

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

  • 查询数据库相关信息

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

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

查询数据库名selectdatabase(),2---

可以得数据库名为pikachu

查询用户名:user()

查询数据库版本:version()

  • 查询表

unionselecttable_name,2frominformation_schema.tableswheretable_schema=“pikachu”

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

查询表字段

unionselectcolumn_name,2frominformation_schema.columnswheretable_name=“users”

解析:查询users表的字段

查询值

unionselectusername,passwordwhereusers

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~