• 博客园Logo
  • 首页
  • 新闻
  • 博问
  • 专区
  • 闪存
  • 班级
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 简洁模式 ... 退出登录
    注册 登录
京亟
很多时候,我们以为面前是大海、是沟壑、是深渊,但是当你越过去回头再看的时候,那不过是溪流、是台阶、是浅滩。 联系方式:jinqiqaq@foxmail.com
博客园    首页    新随笔    联系   管理    订阅  订阅

sqli-labs(三)

第五关:这关的重点是有联合查询的注入漏洞,但是页面不会显示查询信息,但是会有报错信息显示在页面上

 

这关是双查询注入,其实用报错注入和盲注都是可以注入的,但是我觉得这个双查询注入还是很有意思的,所以这关我们还是用双查询注入

的流程来走。

https://www.2cto.com/article/201303/192718.html

这里有篇文章讲的很不错了,我就不复述他的话了,里面有一句很重要:简单的一句话原理就是有研究人员发现,当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。

 第一步:依然是使用order by判断表的列数

第二部:输入

id=1'%20union%20select%20count(*),concat((select%20user()),floor(rand()*2))%20as%20a,count(*)%20from%20information_schema.schemata%20group%20by%20a%23

 

比较长,不急,慢慢解释:主体依然是id=1' union select 1,2,3 from information_schema.schemata #

只不过这里讲1,2,3分别替换成了聚合函数,然后再后面加了个group by ,至于原因就是我们上面所提到的很重要的一句话(简单的一句话原理就是有研究人员发现,当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。)

这里的a是我们给concat((select%20user()),floor(rand()*2))起的一个别名(利用as)

rand()取0到1的随机值,floor()取整 ,这样的话使用concat将子查询(select user())的结果与0或1进行拼凑,组成xxx0或xxx1,所以结果是变化的。至于这样做的原因是为了让后面可以进行分组(也就是可以使用group by)。

现在知道整句话的意思后就可以进行后面的操作了,只需要将子查询换成其他的查询操作。

第三步:查询出所有的数据库名

http://localhost/sqli-labs-master/Less-5/
?id=1'%20union%20select%20count(*),concat((select%20schema_name%20from%20information_schema.schemata%20limit%201,1),floor(rand()*2))%20as%20a,count(*)%20from%20information_schema.schemata%20group%20by%20a%23

值得注意的是,子查询中不能使用group_concat了,不然就不会报错了,只能使用limit 来一行一行的查询

 

后面的查询表名,字段名以及数据内容的步骤我就不进行了,和前面几关一样

 

第六关:

和第五关是一样的,只不过将单引号换成了双引号

 

posted @ 2018-08-22 22:13  京亟QAQ  阅读(260)  评论(0)  编辑  收藏  举报
刷新评论刷新页面返回顶部
Copyright © 2022 京亟QAQ
Powered by .NET 6 on Kubernetes