热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL利用ODBC转义({})注入手法分析

前言最近由于工作需要在看libinjection的源码,查到一位师傅发了一篇绕过libinjection的文章,https:www.o2oxy.cn

前言

最近由于工作需要在看libinjection的源码,查到一位师傅发了一篇绕过libinjection的文章,

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

由于URL编码和HEX编码的问题,感觉这位师傅写的不是很对,就发评论跟他讨论,当然他整个libinjection的流程分析还是很不错的。

讨论了半天,这位师傅又抛出了一个payload,说libinjection也检测不出来

1={date(if(mid((updatexml(1,concat(0x7e,(select user()),0x7e),1)),1,1)='1',2,1))}

尝试了一下的确如此:
在这里插入图片描述

翻看MySQL语法分析的产生式

很久之前看到过这种注入的手法,当时没有深究,这次打算好好研究一下。

mysql的SQL解析语法文件:

https://github.com/mysql/mysql-server/blob/8.0/sql/sql_yacc.yy#L9899

(这个是yacc的产生式文件,有兴趣的师傅可以去找找lex&yacc的资料,顺便看看编译原理更佳~)

PS:开头注释表明5.7之后语法分析就没有变过

看这个文件懵逼了很久,最后直接搜索’{’(三个字符)找到了关键点:

在这里插入图片描述

'{' 标志符 表达式 '}'是simple_expr(简单表达式)的一种,走PTI_odbc_date这个类的解析方法

https://github.com/mysql/mysql-server/blob/8.0/sql/parse_tree_items.cc#L619

通过注释可以看出,该功能是为了解析ODBC的转义形式语法而写的,并且最后如果标志符部分不是dtts,就会直接返回表达式的内容。

在这里插入图片描述

实际上效果上来说,标志符部分可以任意写,表达式部分都可以正常执行

在这里插入图片描述

所以可以尝试通过这种形式进行SQL注入防御的绕过。

MySQL手册相关

https://dev.mysql.com/doc/refman/8.0/en/expressions.html

https://downloads.mysql.com/docs/refman-4.1-en.a4.pdf

这块感谢同事donky16师傅,实际上手册中有写这种用法,之前搜关键词bracescurly brackets,就是没搜curly braces。。。。:

在这里插入图片描述

上面那波分析,多少有点走弯路了。

从手册中可以看出,从3.23开始就已经存在了ODBC转义语法。

回到Payload

1={date(if(mid((updatexml(1,concat(0x7e,(select user()),0x7e),1)),1,1)='1',2,1))}

payload中,date并不代表一个函数,而是一个标识符, 后面整个括号包裹的if部分是表达式,并且可以不适用括号分割而,转而使用空格之类的进行分割:

在这里插入图片描述
在这里插入图片描述

可以看到两个效果是一样的,都可以正常触发报错,说明updatexml函数已经被执行了。

但是后一种写法是可以被libinjection检测出来的:

在这里插入图片描述

而libinjection中实际上已经考虑了ODBC转义的情况:

在这里插入图片描述

原因分析

libinjection中有种token类型为bareword

bareword可能被认为:label 、 句柄 、函数 、 普通字符串

libinjection特定位置上只有非关键字列表(方法名、变量名、select union之类的关键字)才会被认为是bareword。

在libjection的token折叠函数中,’{’+BAREWORD的组合会进行折叠,而像’{date’这种形式会被解析成’{’+FUNCTION的Token串,不会被折叠导致了绕过。

{foo expr}

而在ODBC转义语法的语境中,上述foo位置都会被认为是标识符或者说bareword

所以此处解决办法有两个:

  1. 加特征,将’{’+FUNCTION的情况包进去
  2. 优化折叠代码,考虑’{’+FUNCTION的情况

最后选用了第二种方法进行完善,可以正常的检测出来该SQL注入:

在这里插入图片描述

引用内容

libinjection源码(语义分析SQL注入检测):

https://github.com/client9/libinjection

感谢这位师傅,涨知识了~:

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

MySQL源码:

https://github.com/mysql/mysql-server/

MySQL手册:

https://dev.mysql.com/doc/refman/8.0/en/expressions.html


推荐阅读
  • 详解 Python 的二元算术运算,为什么说减法只是语法糖?[Python常见问题]
    原题|UnravellingbinaryarithmeticoperationsinPython作者|BrettCannon译者|豌豆花下猫(“Python猫 ... [详细]
  • 本文主要讨论了如何通过已知图片的base64流将图片上传到文件服务器并返回URL的问题。通过模拟文件上传过程,成功解决了该问题。然而,在返回的URL中出现了一个名为blob的文件,作者对于该文件的具体含义以及base64转blob格式的意义有所困惑。本文将对这些问题进行探讨和解答。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 0引言在点云的配准算法中,完成初始同名点对的求解之后,即可得出一个粗配准矩阵。当配准的精度较高时,采用 1ICP泡泡点云讲解 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 弹性云服务器ECS弹性云服务器(ElasticCloudServer)是一种可随时自助获取、可弹性伸缩的云服务器,帮助用户打造可靠、安全、灵活、高效的应用环境 ... [详细]
  • .NET中各种数据库连接大全(转)[more].NET中各种数据库连接大全sql.gif)SQLSERVEROdbCStandardSecurity:driver{SQLSe ... [详细]
  • PyTorch框架中有一个非常重要且好用的包:torchvision,该包主要由3个子包组成,分别是:torchvision.datasets、torchvision.models、torchv ... [详细]
  • 原文:http:blog.linjunhalida.comblogpjaxgithub:https:github.comdefunktjquery-pjax ... [详细]
  • faster rcnn如何生成anchors
       本文就fasterrcnn中anchors的函数generate_anchors.py为例,介绍anchors的生成过程。   首先看下主函数入口。论文中提到a ... [详细]
author-avatar
董福强
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有